Меня давно раздражало отсутствие в 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. Надеюсь, сия фича более востребована, чем мое предыдущее расширение
Отредактировано Infocatcher (17-06-2007 02:18:17)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
отсутствие в Firefox всплывающих подсказок (tooltip) на панели закладок
Это которые вот эти: http://forum.mozilla-russia.org/uploaded/bkmkstt.png ? У меня они вроде по умолчанию присутствуют... %-| А вот в меню закладок нет, так что было бы неплохо.
без перебирания всех menuitem'ов и toolbarbutton'ов?
организовать обработчик mouseover, в зависимости от элемента под курсором [не]показывать подсказку, или приклеить подсказку к панели, по onpopupshowing определять, стоит ли её показывать, в первом приближении так. да, ещё можно попробовать сделать привязку на class="bookmark-item" с встроенным tooltip'ом.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Прошу прощения... Время было позднее (по Москве)...
Итак, на новом профиле (все скрины пережаты):
1. Закладки – только URL в строке состояния.
2. Панель закладок – только tooltip.
3. Закладка в папке на панели закладок – ничего (на самой папке – тоже).
После приведенного выше скрипта:
1. Добавится tooltip.
2. Не изменится.
3. Добавится tooltip (к самой папке – тоже).
Фокус в том, что подсказки будут даже у свежесозданных папок-закладок – видимо, что-то с наследованием...
ещё можно попробовать сделать привязку на class="bookmark-item" с встроенным tooltip'ом.
А вот это я что-то не понял... Класс "bookmark-item" есть у всех элементов, относящихся к закладкам, тогда как "tooltip" – нет – посему и подсказки не везде присутствуют (в этом нетрудно убедиться с помощью инспектора DOM).
И если учесть, что я впервые начал развлекаться с XUL, JavaScropt и иже с ними меньше года назад (методом разбирания расширений), то таки подробностей хотелось бы...
...
Ага! DOM Inspector рулит (а местами – так просто педалит ).
Короче, бинго!
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 кб]
Отредактировано Infocatcher (17-06-2007 13:29:27)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Прикрутил изменение текста в строке состояния – для всех закладок.
Но как-то через одно место... Оказалось, что у папок и закладок, которые в них находятся, (на панели закладок) один и тот же 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 (17-06-2007 18:49:33)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Bookmarks Tooltips 0.0.3 [2,1 кб] (Внимание! Возможна потеря текущего текста статусной строки!)
-228
Download error
При установке это выдает
«I actually hate programming, but I love solving problems» © Rasmus Lerdorf, PHP's Creator
Отсутствует
а зачем им каждому mouseover/mouseout атрибуты ?
function setURItoStatusbarLabel(event) { if (event. target. hasAttribute ("class") && (event. target. getAttribute ("class") == "bookmark-item")) { if(event. type == "mouseover") { var currentStatusText = doc...
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
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. Продолжение только завтра вечером... ибо дела...
Отредактировано Infocatcher (17-06-2007 23:25:43)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
какой тогда атрибут на bookmark'и вешать
Никакой:
window.addEventListener('mouseover', setURItoStatusbarLabel, true); window.addEventListener('mouseout', setURItoStatusbarLabel, true);
У закладки nodeName=="menuitem", у папки "toolbarbutton" или "menu". Да, и идентификаторы у них вряд ли одинаковые, что-то я сильно в этом сомневаюсь. Скорее всего совпадающие id относятся к одному и тому же элементу.
устанавливать не пробовали?
Пробовали, работает.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Да, и идентификаторы у них вряд ли одинаковые, что-то я сильно в этом сомневаюсь.
Тьху, галлюцинации, кажись – только окончание и начало id похожи... Однако странные глюки я при этом ловил...
Так, с event'ами понял – завтра попробую.
Кстати уж... Еще какие-нибудь способы запоминать текст из строки состояния имеются?
Кроме
var prefs = ...; prefs.setCharPref("prefName", prefValue); // хотя кириллица заглючит...
// проще:
nsPreferences.setUnicharPref("prefName", prefValue) // синтаксис могу на память путать...
?
Пробовали, работает.
Это хорошо.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Еще какие-нибудь способы запоминать текст из строки состояния имеются?
Чем не устраивает существующий вариант ? Как вариант, можно в глобальной переменной.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
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. (и оффтопик) Замечательно я готовлюсь к экзамену по экономике
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Кажись работает...
Ещё не установил, а уже сомневаюсь. Запятая, что ли, лишняя ?
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Anton
За отлов всех возможных глюков не отвечаю, но работает.
Вот эта, что ли, запятая:
//... }, // <-- }; window.addEventListener('load', bookmarkstooltips.addTooltips, false);
Так ведь, например, и ";" можно не всегда ставить:
И ничего – не ругается... Насколько это корректно – не в курсе, но работать будет.
Единственное, что можно поменять, так это сделать так:
if(event.type == "mouseover") { // ... } else if(event.type == "mouseout") { // ... }
По идее, должно быстрее работать – "mouseout" будет проверяться только если не "mouseover", тогда как в предыдущим варианте всегда будет две проверки (здесь же – 1,5 – или одна, или две).
И еще. Что делает проверка
event.target.hasAttribute("class")
?
Определяет наличие атрибута "class"?
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Странно, раньше вроде запятые без последующего объявления давали ошибку %/
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Bookmarks Tooltips 0.0.3.3 [2,1 кб]
На Firefox 1.5.0.12 работает – изменил minVersion на "1.5".
Изменил проверку класса:
Иначе конфликтует со списком открытых вкладок от 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 обработчиков.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Вот так:
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 кб]
Отредактировано Infocatcher (19-06-2007 23:52:18)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
И разве "popupshowing" не выполняется только после загрузки собственно popup-элемента
это событие срабатывает непосредственно перед тем, как подсказка будет показана
как сделать восстановление состояния статусбара
popuphiding ?
И еще. Например, наводим курсор на закладку в панели закладок ... При этом value btUrlText не изменяется
Ок, значит, другое свойство меняется, что-нибудь вроде hidden.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Ок, значит, другое свойство меняется, что-нибудь вроде 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 путём исключения части проверок.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
В случае 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 какой-то неуловимый...
Отредактировано Infocatcher (22-06-2007 18:52:44)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Обнаружил ошибку.
При 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.
Отредактировано Infocatcher (22-06-2007 21:13:02)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
как можно проще отловить drag-and-drop?
По событию dragover снимать обработчики mouseover/mouseout, по dragexit ставить обратно, так наверное.
Или стёк организовать на сохраняемый текст, наверняка даже лучше, а то будут потом два dragexit-а...
Отредактировано Anton (21-06-2007 19:56:15)
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
По событию 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 и
Отредактировано Infocatcher (24-06-2007 00:25:02)
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
поподробней, если не трудно
То что уже есть, без dragover/dragexit обработчиков, сохранение текста из строки состояния не в переменную, а в массив, на случай N подряд "прилетевших" mouseover'ов )
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует