Меня давно раздражало отсутствие в Firefox всплывающих подсказок (tooltip) на панели закладок... Но искать решение (расширение, еще что-нибудь...) руки не доходили.
И вдруг подумалось: а ведь я знаю, как это можно исправить!

Вот, что из этого вышло:
Bookmarks Tooltips 0.0.1 [1,8 кб]

Решение же просто до безобразия:

Выделить код

Код:

function fixBookmarksTooltipBug() {
	var menuitemsArray = document.getElementsByTagName("menuitem");
	for (var i = 0; i < menuitemsArray.length; i++)
		if( menuitemsArray[i].getAttribute("class").match(/bookmark-item/) )
			menuitemsArray[i].setAttribute("tooltip", "btTooltip");

	var toolbarbuttonsArray = document.getElementsByTagName("toolbarbutton");
	for (var i = 0; i < toolbarbuttonsArray.length; i++)
		if( toolbarbuttonsArray[i].getAttribute("class").match(/bookmark-item/) )
			toolbarbuttonsArray[i].setAttribute("tooltip", "btTooltip");
}

window.addEventListener('load', fixBookmarksTooltipBug, false);

Я зря заново изобретаю велосипед?
И можно ли то же самое организовать попроще – без перебирания всех menuitem'ов и toolbarbutton'ов?

P. S. Никто не знает, почему для тулбаров (и их подъэлементов) не работает атрибут statustext (думаю, разъяснять не надо – ясно из названия) – только для закладок из главного меню?

P. P. S. Надеюсь, сия фича более востребована, чем мое предыдущее расширение :D

отсутствие в Firefox всплывающих подсказок (tooltip) на панели закладок

Это которые вот эти: http://forum.mozilla-russia.org/uploaded/bkmkstt.png ? У меня они вроде по умолчанию присутствуют... %-| А вот в меню закладок нет, так что было бы неплохо.

без перебирания всех menuitem'ов и toolbarbutton'ов?

организовать обработчик mouseover, в зависимости от элемента под курсором [не]показывать подсказку, или приклеить подсказку к панели, по onpopupshowing определять, стоит ли её показывать, в первом приближении так. да, ещё можно попробовать сделать привязку на class="bookmark-item" с встроенным tooltip'ом.

Прошу прощения... Время было позднее (по Москве)...

Итак, на новом профиле (все скрины пережаты):
1. Закладки – только URL в строке состояния.
2. Панель закладок – только tooltip.
3. Закладка в папке на панели закладок – ничего (на самой папке – тоже).

После приведенного выше скрипта:
1. Добавится tooltip.
2. Не изменится.
3. Добавится tooltip (к самой папке – тоже).

Фокус в том, что подсказки будут даже у свежесозданных папок-закладок – видимо, что-то с наследованием... :| :)

ещё можно попробовать сделать привязку на class="bookmark-item" с встроенным tooltip'ом.

А вот это я что-то не понял... Класс "bookmark-item" есть у всех элементов, относящихся к закладкам, тогда как "tooltip" – нет – посему и подсказки не везде присутствуют (в этом нетрудно убедиться с помощью инспектора DOM).

И если учесть, что я впервые начал развлекаться с XUL, JavaScropt и иже с ними меньше года назад (методом разбирания расширений), то таки подробностей хотелось бы...

...
Ага! DOM Inspector рулит (а местами – так просто педалит :D).
Короче, бинго!

Выделить код

Код:

document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip");	// Bookmarks panel
document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip");	// Bookmarks menu

И все! Наследование – это здорово.

Просьба потестить:
Bookmarks Tooltips 0.0.2 [1,7 кб]

Прикрутил изменение текста в строке состояния – для всех закладок.
Но как-то через одно место... :D Оказалось, что у папок и закладок, которые в них находятся, (на панели закладок) один и тот же id... И фиг ты обратишься к свойствам нужного элемента (this не работает).

Выделить код

Код:

function fixBookmarksTooltipBug() {
	var menuitemsArray = document.getElementsByTagName("menuitem");
	for (var i = 0; i < menuitemsArray.length; i++)
		if( menuitemsArray[i].getAttribute("class").match(/bookmark-item/) ) {
			menuitemsArray[i].setAttribute( "onmouseover", "setURItoStatusbarLabel(this, true)" );
			menuitemsArray[i].setAttribute( "onmouseout", "setURItoStatusbarLabel(this, false)" );
		}

	var toolbarbuttonsArray = document.getElementsByTagName("toolbarbutton");
	for (var i = 0; i < toolbarbuttonsArray.length; i++)
		if( toolbarbuttonsArray[i].getAttribute("class").match(/bookmark-item/) ) {
			toolbarbuttonsArray[i].setAttribute( "onmouseover", "setURItoStatusbarLabel(this, true)" );
			toolbarbuttonsArray[i].setAttribute( "onmouseout", "setURItoStatusbarLabel(this, false)" );
		}

	document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip");		// Bookmarks panel
	document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip");	// Bookmarks menu

}

function setURItoStatusbarLabel(bookmarkItem, remove) {
	if(remove) {
		var currentStatusText = document.getElementById("statusbar-display").getAttribute("label");
		if( !currentStatusText.match(/[a-z]+:(\/\/)?/i) )
			document.getElementById("statusbar-display").setAttribute("oldstatustext", currentStatusText);	// backup

		var bookmarkItemURI = bookmarkItem.getAttribute("statustext");	// folder and subbookmarks - same id... >:(
		if( !bookmarkItemURI.match(/[a-z]+:/i) ) return;			// else - bugs...

		document.getElementById("statusbar-display").setAttribute("label", bookmarkItemURI);		// set new
	}
	else {
		var oldStatusText = document.getElementById("statusbar-display").getAttribute("oldstatustext");
		document.getElementById("statusbar-display").setAttribute("label", oldStatusText);		// restore backup
	}
}

Bookmarks Tooltips 0.0.3 [2,1 кб] (Внимание! Возможна потеря текущего текста статусной строки!)

P. S. Простите за привычку писать комменты на английском, который у меня очень кривой...

Infocatcher

Bookmarks Tooltips 0.0.3 [2,1 кб] (Внимание! Возможна потеря текущего текста статусной строки!)

-228
Download error

При установке это выдает

а зачем им каждому mouseover/mouseout атрибуты ?

Выделить код

Код:

function setURItoStatusbarLabel(event) {
			if (event. target. hasAttribute ("class") &&
				(event. target. getAttribute ("class") == "bookmark-item"))
			{	 
			if(event. type == "mouseover") {
				var currentStatusText = doc...

Anton
Хех, была бы у меня хоть какая-нибудь документация по JavaScript (имеется в виду в бумажном виде)...
Спасибо, попробую так.
И, простите, что-то я туплю, какой тогда атрибут на bookmark'и вешать?
Т. е. было:
.setAttribute( "onmouseover", "setURItoStatusbarLabel(this, true)" );
.setAttribute( "onmouseout", "setURItoStatusbarLabel(this, false)" );

А теперь надо так, что ли:
.setAttribute( "onmouseover", "setURItoStatusbarLabel(event)" );
Что должно быть вместо "onmouseover"? :|

Да, поправка: class="menuitem-iconic bookmark-item". Так что:
if ( event. target. hasAttribute ("class") && (event. target. getAttribute ("class").match(/bookmark-item/)) )

Лучше придумайте, как закладку в папке на панели закладок нормально отловить (без return, то есть). Почему-то, если создать через контекстное меню папку на панели закладок, а потом перетащить в нее закладки, получаются одинаковые идентификаторы (id). Возможно, и в других случаях, но что могут получиться – это точно.

stoneflash
Хм... Или криво на сервер залилось, или ошибки при скачивании... Или в третьем фоксе сменились какие-то идентификаторы.
Если не считать того, что мне не совсем нравится алгоритм бэкапа состояния статусбара, то у меня все работает...
Попробуйте поставить 0.0.2
Если не заработает, возможно, убрали наследование tooltip'ов (ибо глюк, ИМХО, – нельзя, например, повесить на toolbarbutton tooltiptext, а на пункты меню, открывающегося по этой кнопке, – tooltip – такие глюки будут...).
Или 0.0.1 (tooltip'ы вешаются на все нужные элементы)...

Если и после этого ничего не пойдет, можете поискать через DOM Inspector (по идентификатору) "bookmarks-stack" и "menu_BookmarksPopup" – для 0.0.2.
Или class у bookmark'ов посмотрите – должен быть "bookmark-item" – для 0.0.1.
И, собственно, tooltip – должен быть "btTooltip" – необходимо для всех версий.

Перезалил.

P. S. Антон, а Вы устанавливать не пробовали? В смысле, у кого-нибудь, кроме меня, работает?

P. P. S. Продолжение только завтра вечером... ибо дела...

какой тогда атрибут на bookmark'и вешать

Никакой:

Выделить код

Код:

window.addEventListener('mouseover', setURItoStatusbarLabel, true);
window.addEventListener('mouseout', setURItoStatusbarLabel, true);
Выделить код

Код:

как закладку в папке на панели закладок нормально отловить

У закладки nodeName=="menuitem", у папки "toolbarbutton" или "menu". Да, и идентификаторы у них вряд ли одинаковые, что-то я сильно в этом сомневаюсь. Скорее всего совпадающие id относятся к одному и тому же элементу.

устанавливать не пробовали?

Пробовали, работает.

Да, и идентификаторы у них вряд ли одинаковые, что-то я сильно в этом сомневаюсь.

Тьху, галлюцинации, кажись – только окончание и начало id похожи... Однако странные глюки я при этом ловил...

Так, с event'ами понял – завтра попробую.
Кстати уж... Еще какие-нибудь способы запоминать текст из строки состояния имеются?
Кроме
var prefs = ...; prefs.setCharPref("prefName", prefValue); // хотя кириллица заглючит...
// проще:
nsPreferences.setUnicharPref("prefName", prefValue) // синтаксис могу на память путать...
?

Пробовали, работает.

Это хорошо.

Еще какие-нибудь способы запоминать текст из строки состояния имеются?

Чем не устраивает существующий вариант ? Как вариант, можно в глобальной переменной.

Bookmarks Tooltips 0.0.3.2 [2,1 кб]

Что-то вроде этого...
Кажись работает...

Выделить код

Код:

var bookmarkstooltips = {
    addTooltips: function() {
        document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip");     // Bookmarks panel
        document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip"); // Bookmarks menu
    },

    setURItoStatusbarLabel: function(event) {
        if ( event.target.hasAttribute("class") &&
            event.target.getAttribute("class").match(/bookmark-item/) &&
            event.target.getAttribute("type") != "menu" ) {

            var currentStatusText = document.getElementById("statusbar-display").getAttribute("label");
            var bookmarkItemURI = event.target.getAttribute("statustext");

            if(event.type == "mouseover") {
                document.getElementById("statusbar-display").setAttribute("oldstatustext", currentStatusText);  // backup
                document.getElementById("statusbar-display").setAttribute("label", bookmarkItemURI);            // set new
            }
            if(event.type == "mouseout")
                if(currentStatusText == bookmarkItemURI) {    // else => status change => not backup restore
                    var oldStatusText = document.getElementById("statusbar-display").getAttribute("oldstatustext");
                    document.getElementById("statusbar-display").setAttribute("label", oldStatusText);    // restore backup
                }
        }
    },
};

window.addEventListener('load', bookmarkstooltips.addTooltips, false);

window.addEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, true);
window.addEventListener('mouseout', bookmarkstooltips.setURItoStatusbarLabel, true);

Чем не устраивает существующий вариант ? Как вариант, можно в глобальной переменной.

Ну, вдруг какие противопоказания имеются... Так и запишем: одобрено.

P. S. (и оффтопик) Замечательно я готовлюсь к экзамену по экономике :D

Кажись работает...

Ещё не установил, а уже сомневаюсь. Запятая, что ли, лишняя ?

Anton
За отлов всех возможных глюков не отвечаю, но работает.
Вот эта, что ли, запятая:

Выделить код

Код:

//...
    }, // <--
};

window.addEventListener('load', bookmarkstooltips.addTooltips, false);

Так ведь, например, и ";" можно не всегда ставить:

Выделить код

Код:

try{ /* ... */ } catch(e) { alert(e) }

И ничего – не ругается... Насколько это корректно – не в курсе, но работать будет.

Единственное, что можно поменять, так это сделать так:

Выделить код

Код:

if(event.type == "mouseover") {
    // ...
} else if(event.type == "mouseout") {
    // ...
}

По идее, должно быстрее работать – "mouseout" будет проверяться только если не "mouseover", тогда как в предыдущим варианте всегда будет две проверки (здесь же – 1,5 :D – или одна, или две).

И еще. Что делает проверка
event.target.hasAttribute("class")
?
Определяет наличие атрибута "class"?

Странно, раньше вроде запятые без последующего объявления давали ошибку %/

Bookmarks Tooltips 0.0.3.3 [2,1 кб]

На Firefox 1.5.0.12 работает – изменил minVersion на "1.5".
Изменил проверку класса:

Выделить код

Код:

...("class").match(/^(menuitem-iconic )?bookmark-item$/)

Иначе конфликтует со списком открытых вкладок от Tab Mix Plus (строка состояния не восстанавливает исходный текст).
Добавил «else if».
И убрал злосчастную запятую.

Вот:

Выделить код

Код:

var bookmarkstooltips = {
     addTooltips: function() {
          document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip");        // Bookmarks panel
          document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip");    // Bookmarks menu
     },

     setURItoStatusbarLabel: function(event) {
          if ( event.target.hasAttribute("class") &&
               event.target.getAttribute("class").match(/^(menuitem-iconic )?bookmark-item$/) &&
               event.target.getAttribute("type") != "menu" ) {

               var currentStatusText = document.getElementById("statusbar-display").getAttribute("label");
               var bookmarkItemURI = event.target.getAttribute("statustext");

               if(event.type == "mouseover") {
                    document.getElementById("statusbar-display").setAttribute("oldstatustext", currentStatusText);  // backup
                    document.getElementById("statusbar-display").setAttribute("label", bookmarkItemURI);            // set new
               }
               else
                    if(event.type == "mouseout")
                         if(currentStatusText == bookmarkItemURI) {     // else => status change => not backup restore
                              var oldStatusText = document.getElementById("statusbar-display").getAttribute("oldstatustext");
                              document.getElementById("statusbar-display").setAttribute("label", oldStatusText);     // restore backup
                         }
          }
     }
};

window.addEventListener('load', bookmarkstooltips.addTooltips, false);

window.addEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, true);
window.addEventListener('mouseout', bookmarkstooltips.setURItoStatusbarLabel, true);

Мне кажется, код займёт меньше места, если на btTooltip "повесить" обработчик popupshowing, в котором в зависимости от значения value элемента btUrlText выполнять необходимые действия. Тогда можно будет обойтись без mouseover/mouseout обработчиков.

Вот так:

Выделить код

Код:

var bookmarkstooltips = {
    init: function() {
        var btTooltip = document.getElementById("btTooltip");
        btTooltip.addEventListener("popupshowing", bookmarkstooltips.setURItoStatusbarLabel, false);
    },
// ...
};
window.addEventListener('load', bookmarkstooltips.init, false);

?

Что-то у меня не работает... Или не "popupshowing"?

И разве "popupshowing" не выполняется только после загрузки собственно popup-элемента (tooltip, popup, ...). Т. е. пока tooltip (в данном случае <vbox> ... </vbox>) не появится – ничего не будет? А то у меня подсказка всплывает только через секунду после прекращения перемещения курсора...

И, самое главное, как сделать восстановление состояния статусбара?

И еще. Например, наводим курсор на закладку в панели закладок и, не останавливаясь, начинаем «наворачивать круги», не сходя при этом с закладки, – чтоб tooltip не показывался. При этом value btUrlText не изменяется (что говорит о том, что onpopupshowing btTooltip'а не сработал)!

Добавлено Втр 19 Июн 2007 23:51:06 :
Так, опять Tab Mix Plus...
На этот раз список закрытых вкладок.
Добавил проверку идентификатора:
match(/^rdf:#\$/)

Bookmarks Tooltips 0.0.3.4 [2,1 кб]

И разве "popupshowing" не выполняется только после загрузки собственно popup-элемента

это событие срабатывает непосредственно перед тем, как подсказка будет показана

как сделать восстановление состояния статусбара

popuphiding ?

И еще. Например, наводим курсор на закладку в панели закладок ... При этом value btUrlText не изменяется

Ок, значит, другое свойство меняется, что-нибудь вроде hidden.

Ок, значит, другое свойство меняется, что-нибудь вроде hidden.

Для btTooltip, как я понял, задается hidden только label'ов (btTitleText и btUrlText). И применяется hidden (setAttribute / removeAttribute) одновременно с value – т. е., похоже, сразу после наведения курсора btTooltip не меняется.
И придется опять вытягивать "statustext" через event.target.getAttribute("statustext")

Мне пока видится только вот такой вариант:
1. Вместо mouseover / mouseout на все окно (window) вешаем popupshowing / popuphiding на btTooltip.
2. На оба события запускается все та же функция bookmarkstooltips.setURItoStatusbarLabel(event) (оставляем только проверку на type == "menu")
3. if(event.type == "mouseover") меняем на popupshowing, mouseout – на popuphiding

Я что-то упускаю?

И придется опять вытягивать "statustext" через event.target.getAttribute("statustext")

Если у элемента есть атрибут statustext, значит, у btUrlText атрибут hidden=false. Значит, можно взять value из btUrlText и поместить в строку состояния.

Мне пока видится только вот такой вариант:
1. Вместо mouseover / mouseout на все окно (window) вешаем popupshowing / popuphiding на btTooltip.

В случае popupshowing текст в строке состояния будет появляться как раз перед отображением всплывающей подсказки, то есть, с задержкой. Так что, может быть, лучше оставить всё как есть.

Хотя, может быть, стоит рассмотреть ещё вариант с "подцеплением" mouseover/mouseout обработчиков не на document, а на саму панель закладок с целью упрощения setURItoStatusbarLabel путём исключения части проверок.

В случае popupshowing текст в строке состояния будет появляться как раз перед отображением всплывающей подсказки, то есть, с задержкой.

А вот задержка мне совсем не нравится – неудобно...
Да, с получением URL'а закладки я все понял – popupshowing сработает с задержкой, и к этому времени value btUrlText уже изменится. В теории... – проверять лень, поскольку меня такое быстродействие совсем не устраивает.

у btUrlText атрибут hidden=false

Поправка: атрибута не будет вообще (я не просто так писал про setAttribute / removeAttribute). Но не суть.

Хотя, может быть, стоит рассмотреть ещё вариант с "подцеплением" mouseover/mouseout обработчиков не на document, а на саму панель закладок

Вот это, пожалуй, уже лучше.
Хотя все равно нужно будет оставить проверку class'а ( match(/^(menuitem-iconic )?bookmark-item$/) ), чтобы исключить toolbarseparator'ы (без класса) и папки в папках (у них classs == "menu-iconic bookmark-item"), и type ( != "menu" ) – для исключения папок.

Т. е. убирается только проверка id.
Альтернативные фильтры приветствуются!

С упрощением проверок не особо, но один плюс точно есть – никаких конфликтов навроде глюков с TMP точно не будет. Хотя, по идее, проверка id должна это исключать – зачем идентификаторы для создаваемых через JavaScript элементов, которые удаляются при закрытии менюшки (в случае с TMP). А если они и есть (id, то есть), то более осмысленные.

Хм, что за ерунда. Смотрю на свойства toolbarbutton-папки (в DOM-инспекторе) и вижу два type – "menu" и "http://home.netscape.com/NC-rdf#Folder"... Причем, судя по тому, что ...getAttribute("type") != "menu" ее (папку) исключает, второй type какой-то неуловимый...

Обнаружил ошибку.
При drag-and-drop'е получается подряд два mouseover'а.
Соответственно зазря бэкапится (а потом восстанавливается) URL bookmark'а.

Проверял так:

Выделить код

Код:

var bookmarkstooltips = {
    // ...
    dumpEvent: function(msg) {  // Внаглую позаимствовано из Cache Fixer’а
        const console = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
        msg = "[event.type]: " + msg + "\n";
        console.logStringMessage(msg);
        dump(msg);
    },
// ...

    setURItoStatusbarLabel: function(event) {
        if( /* ... */ ) {
            bookmarkstooltips.dumpEvent(event.type);
            // ...
        }
    },
// ...

Bookmarks Tooltips 0.0.3.5 [2,4 кб]

Код теперь такой:

Выделить код

Код:

var bookmarksTooltipsPreviewEvent = "";
var bookmarksTooltipsOldStatusLabel = "";
var bookmarksTooltipsOldURI = "";

var bookmarkstooltips = {
    addTooltips: function() {
        document.getElementById("bookmarks-stack").setAttribute("tooltip", "btTooltip");      // Bookmarks panel
        document.getElementById("menu_BookmarksPopup").setAttribute("tooltip", "btTooltip");  // Bookmarks menu
    },
/*
    dumpMsg: function(msg) {  // Внаглую позаимствовано из Cache Fixer’а
        const console = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);
        msg = "[BookmarksTooltips]: " + msg + "\n";
        console.logStringMessage(msg);
        dump(msg);
    },
*/
    setURItoStatusbarLabel: function(event) {
        if ( event.target.hasAttribute("class") &&
            event.target.getAttribute("class").match(/^(menuitem-iconic )?bookmark-item$/) &&
            event.target.getAttribute("type") != "menu" &&
            event.target.getAttribute("id").match(/^rdf:#\$/) ) {

            var currentStatusText = document.getElementById("statusbar-display").getAttribute("label");
            var bookmarkItemURI = event.target.getAttribute("statustext");

            if(event.type == "mouseover") {
                if(bookmarksTooltipsPreviewEvent == "mouseover") {    // drag-and-drop
                //    bookmarkstooltips.dumpMsg("drag-and-drop\ncurrentStatusText = " + currentStatusText +
                //                                          "\nbookmarkItemURI = " + bookmarkItemURI + "\nOldStatus = " +
                //                                          bookmarksTooltipsOldStatusLabel + "\nOldURI = " + bookmarksTooltipsOldURI);
                    if(currentStatusText == bookmarksTooltipsOldURI)
                        restoreOldStatus();
                }
                else {
                    bookmarksTooltipsOldStatusLabel = currentStatusText;    // backup
                    document.getElementById("statusbar-display").setAttribute("label", bookmarkItemURI);   // set new
                    bookmarksTooltipsOldURI = bookmarkItemURI;
                }
            }
            else
                if(event.type == "mouseout")
                    if(currentStatusText == bookmarkItemURI)    // else => status change => not backup restore
                        restoreOldStatus();

            bookmarksTooltipsPreviewEvent = event.type;
        }

        function restoreOldStatus() {
            document.getElementById("statusbar-display").setAttribute("label", bookmarksTooltipsOldStatusLabel);   // restore backup
        }
    }
};

window.addEventListener('load', bookmarkstooltips.addTooltips, false);

window.addEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, true);
window.addEventListener('mouseout', bookmarkstooltips.setURItoStatusbarLabel, true);

Так вот, как можно проще отловить drag-and-drop?


Bookmarks Tooltips 0.0.3.6 [2,4 кб]
То же самое, но

Выделить код

Код:

var bookmarkstooltips = {
    init: function() {
        var bookmarksPanel = document.getElementById("bookmarks-stack");
        bookmarksPanel.addEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, true);
        bookmarksPanel.addEventListener('mouseout', bookmarkstooltips.setURItoStatusbarLabel, true);
    },
// ...
};
window.addEventListener('load', bookmarkstooltips.init, false);

И без проверки id.

как можно проще отловить drag-and-drop?

По событию dragover снимать обработчики mouseover/mouseout, по dragexit ставить обратно, так наверное.

Или стёк организовать на сохраняемый текст, наверняка даже лучше, а то будут потом два dragexit-а...

По событию dragover снимать обработчики mouseover/mouseout, по dragexit ставить обратно, так наверное.

C этим все ясно (примерный вид):

Выделить код

Код:

var bookmarksPanel = document.getElementById("bookmarks-stack");
bookmarksPanel.addEventListener('dragover', f, true);
bookmarksPanel.addEventListener('dragexit', f, true);

function f(event) {
    if(event.type == "dragover") {
        bookmarksPanel.removeEventListener('mouseover', bookmarkstooltips.setURItoStatusbarLabel, false);
        // mouseout
    }
    else if(event.type == "dragexit") {
        // init
    }
}

Однако мы меняем две глобальные переменные на еще два обработчика...
Фокус в том, что ошибок в работе текущего кода я пока не наблюдал, и лишний раз усложнять не хочется.

Или стёк организовать на сохраняемый текст, наверняка даже лучше, а то будут потом два dragexit-а...

:/ А с этого момента поподробней, если не трудно... Что-то я маневр не понимаю.

Вариант: попробовать добавить dragover и dragexit обработчики, повесить на них функцию setURItoStatusbarLabel и

Выделить код

Код:

if(event.type == "dragover" || event.type == "dragexit") return;

поподробней, если не трудно

То что уже есть, без dragover/dragexit обработчиков, сохранение текста из строки состояния не в переменную, а в массив, на случай N подряд "прилетевших" mouseover'ов )

Bookmarks Tooltips 0.0.3.7 [4,0 кб]

Код не менял – только добавил пару плюшек :)
Локализована / переведена подпись расширения.
Добавлены настройки.
Показывать URL закладки в строке состояния:

Выделить код

Код:

if( nsPreferences.getBoolPref("bookmarkstooltips.showUrlInStatusbar", true) )
	window.addEventListener('load', bookmarkstooltips.init, false);

Удалять атрибут tooltiptext у закладок на панели закладок:

Выделить код

Код:

if(event.type == "mouseover") {
    if( nsPreferences.getBoolPref("bookmarkstooltips.removeTooltiptext", false) )  // fix conflict with Bookmarks Menu Button
        event.target.removeAttribute("tooltiptext");
    // ...

А править код, наверное, не буду до тех пор, пока не обнаружатся какие-нибудь баги...

P. S. К слову, расширение Bookmarks Menu Button, из-за которого, собственно, и был весь сыр-бор с удалением tooltiptext'а (поставил, чтобы потестить, а нарвался на жестокие глюки), ну очень криво работает со строкой состояния...

P. P. S. Пожалуй, надо будет выложить в обсуждение расширений...

Так, одну багу уже нашел...
У пунктов меню «Подписаться на ленты новостей» tooltiptext'ом выводится URL. Соответственно при одновременном выводе и tooltip'а, и tooltiptext'а наблюдаются неудобоваримые с точки зрения чтения текста подсказок глюки.

Может, добавить-таки обработчик popupshowing'а на на btTooltip и при наличии tooltiptext'а пихать его значение заместо URL'а (вариант: URL => присваиваем это значение второй строке, нет – первой)?..
Заодно: как определить наличие tooltiptext'а?
Или просто .getAttribute('tooltiptext') вернет "" при отсутствии атрибута?

можно добавить в init что-нибудь вроде

Выделить код

Код:

document.getElementById("subscribeToPageSubmenuMenupopup").addEventListener
		(
			"popupshown",
			function (event)
			{
				var mi = event. target. getElementsByTagName ("menuitem");
				var tt, cmi;
				for (var i = 0; i < mi. length; i++)
				{
					cmi = mi [i];
					if (cmi. hasAttribute ("tooltiptext"))
					{
						tt = cmi. getAttribute ("tooltiptext");
						cmi. removeAttribute ("tooltiptext");
						cmi. setAttribute ("statustext", tt);
					}
				}
			},
			true
		);

можно добавить в init что-нибудь вроде

И что бы я без Вас делал?.. :)
Ctrl+C – Ctrl+V... :D

Bookmarks Tooltips 0.0.3.8 [4,2 кб]

А заодно и текст в строке состояния теперь меняется :)

P. S. Только сейчас заметил, что если URL и label закладки совпадают, то показывается только одна строка :rock:

P. P. S. Какие-нибудь предложения по оптимизации будут? В частности – касательно наглых расширений, панели закладок и tooltiptext'а.

Какие-нибудь предложения по оптимизации будут?

У меня нет никаких идей и соображений, хотя, я уверен (как и всегда, кроме простых случаев), что можно сделать проще.

Так, одно изменение точно нужно.
В связи с этим:

Выделить код

Код:

window.addEventListener('load', bookmarkstooltips.addTooltips, false);

if( nsPreferences.getBoolPref("bookmarkstooltips.showUrlInStatusbar", true) ) // sic!
	window.addEventListener('load', bookmarkstooltips.init, false);

Т. е. init выполняется не всегда – надо перенести document.getElementById("subscribeToPageSubmenuMenupopup").addEventListener... в addTooltips.

А хочется сделать что-то вроде
Создаем настройку bookmarkstooltips.debug

Выделить код

Код:

// в addTooltips:
var bmttDebug = nsPreferences.getBoolPref("bookmarkstooltips.debug", false);
if(!bmttDebug)
    document.getElementById("subscribeToPageSubmenuMenupopup").addEventListener("popupshown", ... // устраняем глюки с лентами новостей
else {  // удаляем все tooltiptext'ы
    document.getElementById("btTooltip").addEventListener ("popupshown", ...
    // если у элемента есть tooltiptext, копируем его значение в переменную tt и .removeAttribute("tooltiptext");
    // if( tt.match(/^[a-z]+:/i) ) ...setAttribute("statustext", tt);
}

Так вот, пройдет ли вообще такой фокус (что произойдет раньше – покажется tooltiptext или он же удалится)? И как обратиться к самому элементу с tooltip'ом? К тому же, сейчас «левый» tooltiptext удаляется только при bookmarkstooltips.showUrlInStatusbar == true, что не есть хорошо (можно, конечно, всегда статус менять...).

Почти ничего не менял...
Убрал настройку показа URL'ов в строке состояния (зато теперь на все настройки – 1 шт. – адекватная реакция).

Создал тему для обсуждения. Думается, баги так будут ловиться куда эффективнее.

Bookmarks Tooltips 0.0.3.9 [4,0 кб]

Попробовал это расширение-ерунда против boox-1.0.1.0,имхо.:/

rubel
Поправка. Легкая ерунда, работающая со строкой состояния. ;)
К тому же, расширение задумывалось для исправления того, что должно быть, но почему-то отсутствует.
Если только разобраться с подсказками для закладок в боковой панели, но это не столь тривиально, как хотелось бы.


Хм, изменил type bookmarks-view с "single-column" на "double-column". Наблюдаю интересный эффект – можно выбрать имя, адрес и кучу всего по выбору для отображения в боковой панели. [Позже] Так, type можно просто удалить – результат будет тот же.
Одно странно – почему-то не могу найти соответствующую настройку в about:config.

Infocatcher
Попробовал, расширение лично мне тоже не понравилось (в 3.0 вообще работает лишь из меню Закладки на панели инструментов) да и если закладок достаточно много то смысл расширения вообще теряется, не виден адрес закладки в статусной строке:
tooltip.PNG
Хотя желание усовершенствовать Firefox, да и сама идея вещи хорошие.

Sergeys пишет

в 3.0 вообще работает лишь из меню Закладки на панели инструментов

Стоп. Расширение и работает только с меню и с панелью закладок. В общем, что из обещанного здесь не работает? А дистрибутива 3.0 у меня просто нету (если только следующую версию достану)...

А с большими списками можно сделать что-то вроде вот этого:

Выделить код

Код:

/* Полоса прокрутки для слишком длинных списков закладок */
menupopup[contextmenu="bookmarks-context-menu"] autorepeatbutton {
	display: none !important;
}
menupopup[contextmenu="bookmarks-context-menu"] scrollbox {
	overflow-y: auto !important;
	width: 250px !important; /* а иначе слишком узко будет... хоть решение и не идеально... */
}
menupopup[contextmenu="bookmarks-context-menu"] {
	max-height: 250px !important; /* высота – какая требуется */
}

Infocatcher

Стоп. Расширение и работает только с меню и с панелью закладок.

Уточню, чтобы было понятно - работает только с меню Закладки (не работает с панелью закладок - в 3.0) и полоса прокрутки есть, но это не помогает.
А про длинные списки - это уже нужно в расширение добавлять иначе смысла в таком расширении нет, если еще что-то нужно помимо установки и настройки расширения прописывать. Подумай, может стоит добавить.

Мне расширение понравилось. Спасибо за труд!

Пожалуйста.

не работает с панелью закладок - в 3.0

Ага, теперь понял. Будет у меня 3.0 – посмотрю. Исправить, я думаю, нетрудно – надо просто посмотреть, какие там идентификаторы стали.

Подумай, может стоит добавить.

Я не знаю, как динамически менять стили (может, конечно, Антон в курсе). Стиль-то я подключу, но навязывать пользователям удобные лично мне настройки (max-height, например, да и сам скроллбар) нехорошо. И, самое главное, не вижу особого смысла делать лишний код для того, что можно сделать без всяких расширений. :sick: (разве что можно Stylish разобрать и посмотреть.) Мне, например, ничего дополнительно прописывать не надо – пользуюсь в основном только панелью закладок, а там у меня все по отдельным папкам, плюс стиль для обрезания длинных названий. :)

А если url закладки в статусбаре перекрывается меню "Закладки", то можно показать этот url в заголовке окна.

Anton пишет

А если url закладки в статусбаре перекрывается меню "Закладки", то можно показать этот url в заголовке окна.

Да хоть в панели адреса – не в этом же дело. Как определить факт перекрытия статусбара?
[позже] Или в том плане, что и там, и там показывать? (Тогда ведь придется и с меню работать – в статусе-то сейчас и так показывается – из меню то есть) И, раз уж ты сюда заглянул, то посмотри на сообщение №34 (после разделителя).

Маленькое дополнение.

А с большими списками можно сделать что-то вроде вот этого:

Если еще добавить

Выделить код

Код:

#menu_BookmarksPopup {
	max-height: 350px !important; /* Или любая другая высота */
}

, то можно задать собственную максимальную высоту основного меню закладок (там, где «Добавить страницу в закладки» и т.д.).

Вот только на скроллинг как-то неадекватно порой реагирует – прокручиваешь содержимое подпапки, а смещается и родительская папка, но это уже в багзиллу, я думаю.

Как определить факт перекрытия статусбара?

Показывать, по-моему надо в одном месте, чтобы не путаться.

...посмотри на сообщение №34 (после разделителя).

Посмотрел. О чём речь, о настройках tree из менеджера закладок ?

Anton пишет

О чём речь, о настройках tree из менеджера закладок ?

Речь шла о боковой панели. Если открыть сайдбар и у элемента bookmarks-view удалить атрибут type, то получатся столбцы как в менеджере закладок (если сначала удалить, а потом открыть боковую панель, то type заново пропишется). А вопрос – есть ли встроенная настройка для вида боковой панели.

P. S. Ага, понял. Родительская папка начинает прокручиваться при overflow – когда дочерней пролистываться больше некуда.

есть ли встроенная настройка для вида боковой панели.

Вид боковой панели настраивается через column picker и хранится, скорее всего, в localstore.rdf.

В заголовке, так в заголовке...

Bookmarks Tooltips 0.0.4a1 [4,2 кб]

bookmarkstooltips.showUriIn
1 -> в строке состояния
2 -> в заголовке окна

Недостатки
1. Редактируется не весь заголовок, а только надпись Mozilla Firefox (или другая – в зависимости от баловства расширений).
2. Для меню «Закладки» URL в строке состояния показывается и так – без всяких дополнений – поэтому в этом случае, независимо от настроек, статусбар будет меняться.

Пришлось добавить

var bmMenu = document.getElementById("menu_BookmarksPopup");
bmMenu.addEventListener("mouseover", bookmarkstooltips.setURItoStatusbarLabel, true);
bmMenu.addEventListener("mouseout", bookmarkstooltips.setURItoStatusbarLabel, true);

Показ в панели адреса я не осилил...
Fission делает

Выделить код

Код:

#urlbar {
	-moz-binding: url(chrome://fission/content/fission.xml#urlbar);
}

И в дальнейшее я вникать не стал.

Вопросы
1. Как изменить первую часть заголовка окна (то, что берется из <title> в HTML)?
2. (Необязательно, но познавательно :)) как изменить текст в urlbar?

1. Как изменить первую часть заголовка окна (то, что берется из <title> в HTML)?

window.title
Когда надо показать url, делаем window. title = url, когда надо восстановить что было, делаем getBrowser().updateTitlebar()

как изменить текст в urlbar

document. getElementById ("urlbar"). value ?

Infocatcher
Может в 2.0 и работает, но на версию 3.0a ставить это расширения нет никакого смысла. Как говориться не сложилось.

Стиль-то я подключу, но навязывать пользователям удобные лично мне настройки (max-height, например, да и сам скроллбар) нехорошо. И, самое главное, не вижу особого смысла делать лишний код для того, что можно сделать без всяких расширений.

Не навязывать, а предлагать настройку для тех кому такая настройка будет необходима (без лишних танцев с бубном). Расширения делаются в основном для того, чтобы не добавлять всё ручками (что и делают те, кто может), а чтобы после установки расширения получить простой доступ к дополнительной функциональности браузера, которая скрыта или недоступна обычными средствами.

Sergeys
Насчет удобств – согласен. Знал бы, как сделать, – тогда не вопрос.
А касаемо расширений, так подавляющее их большинство добавляет как раз то, что ручками не сделаешь (или делает это другим способом, например, Stylish – без перезагрузки, хотя стиль на закладки на лету что-то не вешается :/). Если только не подредактировать исходники браузера (что не есть хорошо, да и вообще – жуткий хак) или не написать самому расширение. Единственное исключение, которое я знаю – Fasterfox (да и то – таймер добавляет).
А в данном конкретном случае, ИМХО, проще привести CSS-код и расписать, что зачем. :whistle:
И интерфейс для настроек надо будет прикручивать... А это – в последнюю очередь (кому нужны удобные настройки, если расширение не очень-то работает?).

Anton пишет

...когда надо восстановить что было, делаем getBrowser().updateTitlebar()

Дабы не плодить дополнительный код (а также из лени) оставил старый способ восстановления (во всех случаях метод один и тот же – для заголовка, строки состояния, urlbar'а).
Bookmarks Tooltips 0.0.4a2 [4,3 кб] (JavaScript)

bookmarkstooltips.showUriIn
1 = statusbar
2 = title
3 = titlemodifier
4 = urlbar

Да, еще раз уточню вопрос про боковую панель. Надо сделать так, чтобы всегда показывалось несколько столбцов.

Надо сделать так, чтобы всегда показывалось несколько столбцов.

Ты уже выяснил, как это можно сделать - надо удалить атрибут type. Как это сделать ? - с помощью javascript или оверлеем на xul боковушки закладок.

Только зачем это нужно ?

Только зачем это нужно ?

Если показывать два столбца – название и адрес, то столбец со ссылкой можно сделать очень узким, и при наведении курсора (и если текст урезан) будет показываться tooltiptext с URL. Довольно удобно, ИМХО.
Так, по-видимому, со встроенными средствами настройки глухо.
Тогда вопрос про вариант с JavaScript (с оверлеем не будет возможности выбора – без добавления JavaScript).
Как выявить событие открытия сайдбара с закладками?

Выделить код

Код:

var bookmarkstooltips = {
	// ...
	addTooltips: function() {
		if( nsPreferences.getBoolPref("bookmarkstooltips.sidebarMultiColumn"), true ) {
			document.getElementById("bookmarks-view").addEventListener (
				"load",
				function() {
					document.getElementById("bookmarks-view").removeAttribute("type");
				},
				 true
			);
		}
	// ...
window.addEventListener("load", bookmarkstooltips.addTooltips, false);

Возвращает

Выделить код

Код:

Ошибка: document.getElementById("bookmarks-view") has no properties
Источник: chrome://bookmarkstooltips/content/bookmarkstooltips.js
Строка: 20

P. S. Если бы мне нравилось, когда ничего не настраивается и ручками не поработаешь – сидел бы на IE :lol:

Как выявить событие открытия сайдбара с закладками?

Сделать оверлей на тот *.xul, который показывает в боковой панели закладки.

Я правильно понимаю - расширенное отображение закладок в сайдбаре задумано только для того, чтобы получить url закладки ?

Я правильно понимаю - расширенное отображение закладок в сайдбаре задумано только для того, чтобы получить url закладки ?

Смотря что понимать под «получить url закладки». Для начала – просто добавить выбор: без столбцов / со столбцами (когда можно увидеть URL).
А в идеале – сделать подсказки (и URL в строке состояния) и для сайдбара (честно говоря, понятия не имею, как получить что-нибуть от treechildren). Плохо, что в Boox многовато лишнего – поди отыщи нужный код.

Сделать оверлей на тот *.xul, который показывает в боковой панели закладки.

О, заработало! Спасибо!
Прикрутил интерфейс для настроек.

Bookmarks Tooltips 0.0.4a4 [4,8 кб]

Мои исследования в области боковой панели закладок: http://pastebin.mozilla-russia.org/89760, http://pastebin.mozilla-russia.org/89761

Anton
На исследования сейчас взгляну, а пока...

Код

Выделить код

Код:

if(et == "mouseout")
	if(currentStatus == bmURI)		// else => status change => not backup restore
		setStatus(bookmarksTooltips_oldStatus);	// restore old

в случае, когда URL отображается в urlbar'е, сбрасывает состояние после клика по закладке:
currentStatus = url закладки (мы его открыли)
bmURI = url закладки

Есть идея сделать так:

Выделить код

Код:

var showIn = nsPreferences.getIntPref("bookmarkstooltips.showUriIn", 1);
// ...
if(currentStatus == bmURI) {	// else => status change => not backup restore (not urlbar)
	var s = showIn == 4 ? «получение текущего адреса» : bookmarksTooltips_oldStatus;
		setStatus(s);	// restore old
}

Но все, что у меня заработало (window.location и document.location), возвращает chrome://browser/content/browser.xul
location.bref, хоть и работает из закладок (например, «javascript: location.href='view-source:' + location.href;»), почему-то не помогло.
Посему вопрос. Как получить URL открытого в браузере документа?

Мои исследования в области боковой панели закладок

Замечательно! :rock:
Приделал switch для установки нового значения и восстановления, в зависимости от bookmarkstooltips.showUriIn.
Теперь бы только изменение строки состояния прикрутить (мне так как-то привычней), вернее, не изменение, а придумать алгоритм бэкапа / восстановления (наверное, разделить mouseover и mouseout по аналогии с тем, что уже есть).

Можно ли сделать выделение закладки под курсором? (Не, я понимаю, что можно, вот только как...)
И еще (только сначала надо разобраться со статусбаром). Надо бы tooltip для закладок в боковой панели добавить (aka покажем кукиш Boox'у :D).

Нда... В случае с сайдбаром, похоже, сплошной mouseover...
Так что восстанавливает исходное состояние только заголовок :(

Bookmarks Tooltips 0.0.4a5 [5,5 кб]

Как получить URL открытого в браузере документа?

Поиск

Можно ли сделать выделение закладки под курсором?

http://pastebin.mozilla-russia.org/89765

Кстати. Функция getBookmarkURLById должна работать и для пунктов меню "Закладки". Может быть, это пригодится в плане упрощения кода.

Anton пишет

Нда, искал-искал – чего только не нашел, кроме нужного. А в результате ответ был найден на моем собственном винчестере :D (в коде практически моего собственного расширения):
document.getElementById("content").currentURI.spec

Bookmarks Tooltips 0.0.4a6 [5,7 кб]
Точно правильно работает отображение в заголовке (не titlemodifier) и в urlbar'е.
Два оставшихся способа, думается, заглючат на дрегендропе в сайдбаре, но сегодня уже даже проверять не хочется. :sick: [позже: таки глючит...]

Может быть, это пригодится в плане упрощения кода.

Раз уж речь зашла о упрощениях...
Есть пары функций backupStatus, setStatus и restoreStatus (по две каждой – всего 6 – см. код), которые отличаются только наличием parent. перед обращением к свойству. Можно ли их как-нибудь объединить (надеюсь, моя мысль понятна)?

P. S. Спасибо за код подсветки текущей закладки.

P. P. S. А теперь – спать :sick:

Можно ли их как-нибудь объединить

У меня идея примерно такая: http://pastebin.mozilla-russia.org/89768

Anton пишет

У меня идея примерно такая

Так, оптимизация пока откладывается до лучших времен (когда всё нормально заработает – вот тогда :))...

В общем, проблема с сайдбаром.
1. Ставим отображение в строке состояния.
2. Открывает about:blank не из сайдбара – ручками, например (в статусе – пусто).
3. Из сайдбара открываем любую ссылку (в статусе – «Готово»).
4. Двигаем мышь – устанавливается адрес закладки.
5. Уходим с сайдбара (в статусе – пусто).

Пытался восстанавливать только если «то, что мы сами установили» == «то, что сейчас в статусе», но что-то не выходит...

Уфф, я уж думал, AiOS обиделся... Короче говоря, если добавить столбцы в боковую панель с закладками, то они (ссылки) будут открываться только даблкликом (только СКМ не меняет действия). Кстати, после этого решил проверить, так вот, из менеджера закладок открывается также (даблкликом).
[Помнится, кто-то когда-то желал получить сию фичу...]

Bookmarks Tooltips 0.0.4a7 [5,8 кб]

Еще один момент.
Надо как-то останавливать функцию mousemovehandler при открытии контекстного меню.
А

Выделить код

Код:

mousemovehandler: function (event) {
	var tree = event.target;
	bookmarkstooltipsSB.dumpMsg("tree.tagName = " + tree.tagName);

нужного результата не дает...

оптимизация пока откладывается до лучших времен (когда всё нормально заработает – вот тогда smile)...

По-моему, самое время оптимизировать архитектуру.

В общем, проблема с сайдбаром. ... Пытался восстанавливать только если «то, что мы сами установили» == «то, что сейчас в статусе», но что-то не выходит...

Выделить код

Код:

...
var bookmarksTooltips_setStatus = "?";			// copy of last established status
var bookmarksTooltipsPrevURL = null;
...
	setStatus: function(val) {
		switch( nsPreferences.getIntPref("bookmarkstooltips.showUriIn", 1) ) {
			case 1:
				var st = this. getStatus ();
				if ((st != bookmarksTooltips_oldStatus) &&
					(st != bookmarksTooltipsPrevURL))
					bookmarksTooltips_oldStatus = st;
				parent.document.getElementById("statusbar-display").setAttribute("label", val);
			...
		}
		bookmarksTooltips_setStatus = val;
		bookmarksTooltipsPrevURL = val;
	},
...

Добавлено Срд 25 Июл 2007 22:37:02 :
p.s. небольшое добавление к коду подсветки закладок в боковой панели:

Выделить код

Код:

bookmarkstooltipsSB.oldFocus = parent.document.commandDispatcher.focusedElement || parent.document.commandDispatcher.focusedWindow;

По-моему, самое время оптимизировать архитектуру.

Ну...
После внесения изменений всё заработало (0.0.4a8). Т.е. если что – полностью рабочая версия имеется =)
Выделил common-секцию, подключил к ней сайдбар (0.0.4a9). Всё Ok.
Подключил основное окно – и всё...

Выделить код

Код:

Ошибка: this.doc has no properties
Источник: chrome://bookmarkstooltips/content/common.js
Строка: 75
Выделить код

Код:

case 1:
	if(noEsc)
		this.doc.getElementById("statusbar-display").setAttribute("label", bookmarksTooltips_oldStatus);

Или я в чем-то нехило промахнулся?.. :/ :sick:

Bookmarks Tooltips 0.0.4a10 [5,7 кб] (Внимание! Глюкует не по-детски!)

P. S. Чуть не забыл.
Как насчет этого:

Надо как-то останавливать функцию mousemovehandler при открытии контекстного меню.

?
А то сейчас при (после) клике правой кнопкой мыши по-прежнему происходит выделение строк, вот только совсем неадекватно (высота, похоже, берется от начала <menupopup>).

Или я в чем-то нехило промахнулся?

this в обработчике указывает не на bookmarksTooltips. Можно сделать _this = bookmarksTooltips; или вызывать bookmarksTooltips. restoreStatus (); из функции-обработчика.

Как насчет этого:

Ставишь обработчики popupshown или popushowing и popuphiding на id="bookmarks-view", при обработке соответственно снимаешь/ставишь все mouse* обработчики.

Полезное расширение, только вот у меня стоит еще "2 Pane Bookmarks", очень удобно, но подсказки "не всплывают" (точнее нет адреса УРЛ ни в подсказке, ни в строке состояния), как задумано в Bookmarks Tooltips...
Может, подкрутите в "консерватории"?

М. Порешаев
Сейчас скачаю расширение и посмотрю, что там такое сотворили...
А вообще, добавьте в userChrome.css

Выделить код

Код:

/* Многострочная панель закладок */
#bookmarks-ptf {
	display: block !important;
}
#bookmarks-ptf toolbarseparator {
	display: inline !important;
}

И будет Вам счастье прямо здесь и прямо сейчас =)
[Позже] *качает расширение* Если речь идет о боковой панели, то счастья, пожалуй, будет чуть меньше...
К тому же, с боковой панелью работают только версии 0.0.4a*, а полностью (надеюсь) рабочую версию я зажал и не выкладывал...


С дрегендропом опять траблы (корректно работает только в сайдбаре) – как мне кажется, из-за

Выделить код

Код:

backup: function() {
	var st = this.getStatus();
	if((st != bookmarksTooltips_oldStatus) && (st != bookmarksTooltips_PrevURL))
		bookmarksTooltips_oldStatus = st;
},

:sick:
Пока пытался убрать все ошибки, заметил кое-что интересное: если при неправильном статусе навести курсор на ссылку, то статус (после ухода со ссылки, конечно) восстановится на "Готово". Отсюда вывод: "правильный" статус где-то запоминается (или его можно как-то заполучить). Вот только поиск в коде браузера пока результатов не дал...

P. S. Давно хотел спросить (но все забывал). Как влияет true / false в конце addEventListener (опытным путем я понял только что при true функция может выполняться несколько раз)?

М. Порешаев
Тыкскыть, спешл фо ю:
Bookmarks Tooltips 0.0.4a8+ [6,0 кб]
(всплывающих подсказок – tooltip'ов – для сайдбара нет; а также выделение строк пока не подправлено на случай контекстного меню)

Прикручено вот так:

Выделить код

Код:

var bmcvw;	// 2 Pane Bookmarks
if(bmcvw = document.getElementById("bookmarks-content-view")) {
	bmcvw.addEventListener("mouseover", bookmarkstooltipsSB.backupStatus, true);
	bmcvw.addEventListener("dragover", bookmarkstooltipsSB.backupStatus, true);
	bmcvw.addEventListener("mousemove", bookmarkstooltipsSB.mousemovehandler, true);
	bmcvw.addEventListener("mouseout", bookmarkstooltipsSB.restoreStatus, true);
}

Как влияет true / false в конце addEventListener

Если true, обработчик поймает событие в capture phase, если false - в bubble phase.
http://www.w3.org/TR/DOM-Level-3-Events … vents-flow

Anton пишет

Если true, обработчик поймает...

Ммм? Мой английский не столь хорош, как хотелось бы, посему (если не трудно) или суть кратко, или что-нибудь по-русски на тему (если есть). :blush:

P. S. Нда, Гугл выдал:

булевое значение, если true, то осуществляется capture, если false - bubling (если не в курсе, что это означает - пишите false ;-)

Ммм? Мой английский не столь хорош...

Смотри картинку по ссылке, которую я дал. Там видно где capture phase, где bubble phase. Вкратце - если хочешь поймать клик по кнопке и ставишь "click" обработчик на эту кнопку, значение параметра useCapture можешь задавать каким захочешь, параметр имеет значение только для обработчиков на родительских элементах этой кнопки.


В продолжение моих исследований: http://forum.mozilla-russia.org/uploade … -0.1.0.xpi

Смотри картинку по ссылке, которую я дал

О, нашел-таки

В продолжение моих исследований

Ну, что я могу сказать... Ты крут! :iron:
Но я все равно придерусь :P :D
Найденные баги (в боковой панели):
I («Стандартный» режим – без доп. столбцов)
1. Дрегендроп работает только сразу после загрузки сайдбара (один раз)
Примерно так: Ctrl+T – переоткрытие сайдбара (*) – работает ([позже] не всегда...)
2. Первая закладка открывается одинарным кликом, все последующие – двойным (а иногда – все двойным... – связи не уловил).
(*) – клик по ссылке (одинарный). Остальные – двойной.
Хотелось бы вернуть в «стандартный» режим одинарный клик...
3. Трудно «поймать» скроллбар... (опять же не всегда, но иногда совсем не скроллится).

Infocatcher
Спасибо, за "спешл фо ю"!

все равно придерусь

http://forum.mozilla-russia.org/uploade … -0.2.0.xpi

Одна из причин крылась в вызове showPopup.

Новые замечания (тестировался только режим с отображением в строке состояния).

1. «Стандартный» режим боковой панели.
Грузим about:blank, наводим курсор на любую закладку, кликаем, ждем, пока выдаст «Готово» и уходим с закладки – статус сбросится.
По этому поводу еще раз повторюсь: если после некорректной записи статуса навести курсор на ссылку, статус восстановится (sic!)
Хмм... Мёд – это очень уж хитрый предмет: если он есть, то его сразу нет. Описанное выше действо не всегда приводит к ошибке (и из панели закладок, кстати, тоже – то глючит, то нет)...

2. Столбцы в боковой панели.
tooltip'ы замирают и не исчезают, пока не наведешь на них курсор (или не всплывет стандартная подсказка на URL).
Строки не выделяются (по клику – да, при перемещении – нет). Удобнее, ИМХО, все же как-то отмечать закладку под курсором (как там серая подсветка достигалась?)
И, я думаю, удобнее будет показывать в tooltip'е еще и URL – не только название.
Да, и статус отваливается напрочь – ничего не показывается.

3. Панель закладок.
about:blank (пусто) – получаем about:neterror («Готово») – уходим с закладки (статус сбрасывается) – жмем на file-закладку – получаем file:///... в статусе. *здесь должен быть сильно удивленный смайлик*

Infocatcher пишет

Новые замечания (тестировался только режим с отображением в строке состояния).

1. «Стандартный» режим боковой панели.

Есть такое, исправил.

2. Столбцы в боковой панели.
tooltip'ы замирают и не исчезают, пока не наведешь на них курсор (или не всплывет стандартная подсказка на URL).

Это не совсем верное утверждение.

Строки не выделяются

Это - к статусу. Тоже исправил.

И, я думаю, удобнее будет показывать в tooltip'е еще и URL – не только название.

По-моему - лишнее.

Да, и статус отваливается напрочь – ничего не показывается.

Это тоже не совсем верное утверждение - в первой части. По-моему, статус в multicolumn - лишнее, но сделал на всякий случай.

3. Панель закладок.
about:blank (пусто) – получаем about:neterror («Готово») – уходим с закладки (статус сбрасывается) – жмем на file-закладку – получаем file:///... в статусе. *здесь должен быть сильно удивленный смайлик*

Не смог воспроизвести.


http://forum.mozilla-russia.org/uploade … -0.3.0.xpi

По-моему, статус в multicolumn - лишнее, но сделал на всякий случай.

Ну, в крайнем случае, можно сделать настройку для выбора.

По-моему - лишнее.

Если учесть, что мне не нравится даблклик, то мне, честно говоря, все равно. Но, по-моему, можно использовать multicolumn только для добавления даблклика (и оставить только один столбец) – вот тут URL в подсказке и окажется очень кстати (можно сделать опционально). (Кстати, надо про двойной клик в настройках написать – чтоб у пользователей неожиданностей не возникало – см. последнюю версию, которую я выкладывал.)

Не смог воспроизвести.

Уже не важно – теперь и я не могу воспроизвести (на новой версии).

P. S. Пока все работает. Завтра посмотрю еще – попробую всевозможные варианты издевательств над закладками :D

P. P. S. Пара отвлеченных вопросов на тему закладок.
Есть вот такой CSS (в userChrome.css):

Выделить код

Код:

/* Полоса прокрутки для слишком длинных списков закладок */
menupopup[contextmenu="bookmarks-context-menu"] autorepeatbutton {
	display: none !important;
}
menupopup[contextmenu="bookmarks-context-menu"] scrollbox {
	overflow-y: auto !important;
}
menupopup[contextmenu="bookmarks-context-menu"] {
	max-height: 300px !important;
	width: 295px !important;
}
#menu_BookmarksPopup {
	max-height: 350px !important;
}

/* Показываем панель закладок только при наведении курсора на панели инструментов */
/* При дрегендропе событие hover не срабатывает... */
#PersonalToolbar {
	display: none;
}
#navigator-toolbox:hover > #PersonalToolbar {
	display: -moz-box;
}

То, что в главном меню "Закладки" не работает скроллбар (пытается что-то перетащить – как при дрегендропе закладок) – баг, или это только у меня так?
И аналогичный вопрос с hover, панелью закладок и перетаскиванием вкладок не нее.

Infocatcher пишет

По-моему, статус в multicolumn - лишнее, но сделал на всякий случай.

Ну, в крайнем случае, можно сделать настройку для выбора.

Делай.

Если учесть, что мне не нравится даблклик

На то он и multicolumn, что можно выбрать содержание отображаемых полей. Нужен url - выбери его отображение. Если какое-то поле не вмещается в сайдбар - будет отображено в всплывающей подсказке.

можно использовать multicolumn только для добавления даблклика

Я, наверное, чего-то не понимаю. По-моему - чушь. Чтобы сделать открытие закладок по двойному клику надо сделать bookmarks-tree многостолбцовым и убрать все столбцы ? Не проще скопировать ondblclick в onclick ?

(можно сделать опционально). (Кстати, надо про двойной клик в настройках написать – чтоб у пользователей неожиданностей не возникало – см. последнюю версию, которую я выкладывал.)

Делай. У меня в планах нет поддержки/развития bookmarkstooltips-0.[1/2/3].0, делал исключительно в иллюстративных целях.

P. P. S. Пара отвлеченных вопросов на тему закладок....в главном меню "Закладки" не работает скроллбар...

Меню "Закладки" отлавливает drag*-события от скроллбара. Если запретить "всплытие" события draggesture от скроллбара к меню "Закладки" - будет работать. Например, "пришить" к #menu_BookmarksPopup http://pastebin.mozilla-russia.org/89791

И аналогичный вопрос с hover, панелью закладок и перетаскиванием вкладок не нее.

То же самое, только другие события, наверняка.

Не проще скопировать ondblclick в onclick ?

Хм... Почему-то наблюдаю [on/dbl]click (сами атрибуты) только при открытии chrome://browser/content/bookmarks/bookmarksPanel.xul во вкладке... А в сайдбаре – нет. :|

делал исключительно в иллюстративных целях.

Тогда у тебя весьма интересное представления о иллюстрациях (на дальнейшее и предшествующее просьба не обижаться). [Особенно когда иллюстрация подозрительно сильно смахивает на вполне готовое расширение.] Что-то навроде: я так могу, а ты – нет :tongue2: (А теперь я умываю руки)
Сложность в том, что я не знаком с некоторыми методами...
Например,
function bmTooltipsIndicator ...
bmTooltipsIndicator. prototype = ...
pref. addObserver ...
И что дает window. addEventListener ("unload" ... ? (если точнее, то для чего; и где зарыты польза с эффектом)
Т.е. до тех пор, пока я не пойму, что зачем в иллюстрации, мне она не очень-то полезна :( Все-таки разъяснение отдельных моментов и уже готовое решение – две большие разницы, как говорится.

Если запретить "всплытие" события draggesture от скроллбара к меню "Закладки" - будет работать.

Ага, ясно. Спасибо!

P. S. Если можно, то еще один вопрос (после черты). :blush:

Конфликтует с AiOS.
В боковой панели или совсем не показывает tooltiptext, или (если хоть один из btTooltip'ов уже показывался) заголовок самой верхней закладки:
f5626dbe27c5.png

Добавлено Вск 29 Июл 2007 01:12:07 :
Ставим отображение в строке состояния. Уходим в оффлайн.
Ctrl+T (у меня грузится пустая страница) - кликаем по закладке на панели закладок, которой нет в кэше (about:neterror + "Готово" в статусе)
И для панели закладок теперь ничего не отображается в статусе.
Это фича такая или все-таки нет?

Infocatcher пишет

Не проще скопировать ondblclick в onclick ?

Хм... Почему-то наблюдаю [on/dbl]click (сами атрибуты) только при открытии chrome://browser/content/bookmarks/bookmarksPanel.xul во вкладке... А в сайдбаре – нет. :|

Я не знаю, почему ты их у себя не видишь. Даже если не видишь, проверь копи-паст из того что видишь, в программу.

делал исключительно в иллюстративных целях.

Именно в иллюстративных. Именно, это касалось вопроса об архитектурной оптимизации. Оптимизации там чуть больше нуля, исключительно для иллюстрации. Именно - "оболочка" для единообразия в работе с элементами, использующимися для отображения URL закладок.

Заодним подкинул несколько готовых технических решений: "вдруг, человек заинтересуется".

...Что-то навроде: я так могу, а ты – нет...

А ещё читать, искать, экспериментировать, стараться держаться в рамках темы и правил форума.

...интересное представления о иллюстрациях

Не знал, что есть стандарт на иллюстрации. Хорошо, изложи как по-твоему должно выглядеть общение в этой теме, я попробую двигаться в этом русле, хотя и не обещаю.

Сложность в том, что я не знаком с некоторыми методами...

Сложность не в этом. Как там у Горького, "Когда много спрашивают..."

Например,
function bmTooltipsIndicator ...
bmTooltipsIndicator. prototype = ...

Конструкция вида

Выделить код

Код:

function x (...) { ... }
x. prototype = ...;

Задаёт шаблон для создания однотипных объектов. Объекты затем можно создавать с помощью оператора new:

Выделить код

Код:

var obj = new x (...)

При создании объекта будет выполнятся функция x.
Подробнее:
http://www.konus.biz/books/DHTML/Справо … .htm#ref37,
http://experiment.net.ru/js2/?f=obj.htm,
http://experiment.net.ru/js2/?f=obj2.htm,
http://dklab.ru/chicken/nablas/39.html,
http://dklab.ru/chicken/nablas/40.html,
http://experiment.net.ru/js1/?f=function.htm

pref. addObserver ...

Ставит observer на изменение preferences. При изменении в соответствующей ветви preferences будет вызываться метод observe.

И что дает window. addEventListener...

Ставит обработчик на выгрузку элемента <window>. В обработчике снимается observer и обнуляется ссылка на indicator для исключения утечек памяти.

мне она не очень-то полезна

Ну, это и без пояснений давно понятно.

Все-таки разъяснение отдельных моментов и уже готовое решение – две большие разницы, как говорится.

Верно. Но и применяются они в разных терапевтических целях.

P. S. Если можно, то еще один вопрос (после черты). :blush:

Нельзя. Во-первых - оффтопик. Создай новую тему и во-вторых опиши подробней. Из текста вопроса не совсем понятно, что там за проблема, ставить эксперименты для выяснения лень.

Конфликтует с AiOS.

Не подтверждаю. (у меня нет AiOS Поставил, но воспроизвести не сумел).

Это фича такая или все-таки нет?

Фича. Исправил: http://forum.mozilla-russia.org/uploade … -0.4.0.xpi

Заодним подкинул несколько готовых технических решений: "вдруг, человек заинтересуется".

Скажем так, если бы человек не заинтересовался, он навряд ли появился бы в этом разделе этого форума.

стараться держаться в рамках темы и правил форума

Еще раз повторюсь: если обидел – извини.

Хорошо, изложи как по-твоему должно выглядеть общение в этой теме

Не надо язвить и придираться к словам (все равно мы их понимаем несколько по-разному).

для исключения утечек памяти.

Вот, это я и хотел понять (что делается я еще понимал, зачем – нет). Тогда еще вопрос – для полного понимания картины. Утечки памяти – следствие каких-то ошибок неучтенных моментов в коде браузера (т. е. «по замыслу» все должно выгружаться само)? Или же «я тебы породил...» и далее по тексту?

Но и применяются они в разных терапевтических целях.

Не просветите пациента касательно диагноза?

Создай новую тему и во-вторых опиши подробней.

Тема уже есть – изменение ширины закладок. Дано: закладка на панели закладок с атрибутом crop="right" (определяется через binding). Цель: поставить ограничение на ширину закладок, но убрать многоточия, появляющиеся, если не весь текст влезает.
(Кстати говоря, текст в строке состояния – не есть всплывающая подсказка, а посему – тоже оффтопик. Если по логике. И вот этот текст – который в скобках – тоже, так что закроем эту тему.)

Не подтверждаю. (у меня нет AiOS Поставил, но воспроизвести не сумел).

Странно... Попробую на новом профиле.

Исправил

И еще раз огромное спасибо за помощь.

P. S. Обобщая. Больше постараюсь больше не придираться к форме, в которой подается помощь. (мир-дружба-жвачка :))

P. P. S. Пошел учить изучать матчасть.

Не надо язвить...

"Точнее: бесполезно."

Утечки памяти – следствие каких-то ошибок неучтенных моментов в коде браузера

Это архитектурный недостаток расширения.

Anton пишет

...AiOS Поставил, но воспроизвести не сумел

На новый профиль ставим Bookmarks Tooltips и AiOS 0.7.1.
В боковой панели наводим курсор на менюшку от AiOS (см. скриншот). Как я понял, если сразу (после переоткрытия-перезагрузки сайдбара) навести на AiOS-овский элемент, совсем ничего не всплывет. После того, как будет показан хоть один tooltip для папок / закладок, вместо всплывающего (который всплыл бы без Bookmarks Tooltips) tooltiptext'а будет подсказка для самого верхнего элемента («Расширения для работы с закладками»).
Удаляем Bookmarks Tooltips и видим правильную подсказку («Инструменты и параметры»).
id="viewButton" tooltiptext="Инструменты и параметры"
http://forum.mozilla-russia.org/uploade … bug.7z.xpi

Ковыряюсь в 3.0a7...
Вот, что там обнаружилось:

Выделить код

Код:

fillInBTTooltip: function(aTipElement) {
    // Fx2XP: Don't show tooltips for bookmarks under sub-folders
    if (aTipElement.localName != "toolbarbutton")
      return false;  /* и зачем они это сделали? */

    // Fx2XP: Only show tooltips for URL items
    if (!PlacesUtils.nodeIsURI(aTipElement.node))
      return false;

    var url = aTipElement.node.uri;
    if (!url) 
      return false;

    var tooltipUrl = document.getElementById("btUrlText");
    tooltipUrl.value = url;

    var title = aTipElement.label;
    var tooltipTitle = document.getElementById("btTitleText");
    if (title && title != url) {
      tooltipTitle.hidden = false;
      tooltipTitle.value = title;
    }
    else
      tooltipTitle.hidden = true;

    // show tooltip
    return true;
  }

Полагаю, единственный способ это обойти (для подсказок не только на toolbarbutton'ах) – «повесить» на btTooltip обработчик onpopupshowing (атрибутом)...
А вопрос у меня такой – что будет, если по onpopupshowing будет выполняться измененная функция, например, такая:

// ...
var ln = aTipElement.localName;
if(ln != "toolbarbutton" && ln != "menuitem") // на папках можно действительно не показывать
    return false;
// ...

В общем, будет ли от этого польза?..
И как, кстати, определить версию браузера изнутри расширения? Или только по extensions.lastAppVersion?

Полагаю, единственный способ это обойти

Не единственный

что будет, если по onpopupshowing будет выполняться измененная функция

Поставь эксперимент. Но, имхо, лучше так не делать.

версию браузера

http://developer.mozilla.org/en/docs/Co … nd_version

Не единственный

Поставь эксперимент. Но, имхо, лучше так не делать.

Я и спросил потому, что сомневался в единственности способа. Эксперимент – это само собой. Но если у тебя есть мысль, как добиться нужного результата по-другому, может, все-таки ее изложишь?

P. S. Спасибо за код для определения версии!

P. P. S. В крайнем случае, конечно, можно полностью переписывать оригинальный атрибут onpopupshowing у btTooltip (и заменять fillInBTTooltip на измененную функцию)...

как добиться нужного результата по-другому

Так: http://pastebin.mozilla-russia.org/90003 например.

А разве не проще тогда вот так:
http://pastebin.mozilla-russia.org/90006 :|

А разве не проще...

Проще, проще ; )

а в боковой панели закладок firefox 2.0.0.11 это расширение должно работать?
хочется при наведении мыши видеть в статус-строке адрес.
а у меня там (в боковой панели закладок) только tooltip появляется, да и то, если только название закладки не помещается в панель (но это наверное и без данного расширения так).

topmo3

а в боковой панели закладок firefox 2.0.0.11 это расширение должно работать?

Не должно. К сожалению...

С боковой панелью работают только версии от Anton'а:
http://forum.mozilla-russia.org/uploade … -0.4.0.xpi
Другое дело, что из-за некоторых особенностей оно не будет работать в Firefox 3.0b :/