Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№117-06-2007 02:13:03

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Всплывающие подсказки для всех закладок - нельзя ли проще?

Меня давно раздражало отсутствие в 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

Отредактировано Infocatcher (17-06-2007 02:18:17)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№217-06-2007 08:56:20

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

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

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

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№317-06-2007 13:27:36

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

Итак, на новом профиле (все скрины пережаты):
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 кб]

Отредактировано Infocatcher (17-06-2007 13:29:27)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№417-06-2007 18:48:37

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

Прикрутил изменение текста в строке состояния – для всех закладок.
Но как-то через одно место... :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 (17-06-2007 18:49:33)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№517-06-2007 19:10:38

stoneflash
Хитрый Лис
 
Группа: Extensions
Откуда: Msk
Зарегистрирован: 02-04-2006
Сообщений: 4341
UA: Minefield 3.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

Отсутствует

 

№617-06-2007 21:11:02

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

Выделить код

Код:

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

Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№717-06-2007 23:16:50

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№818-06-2007 00:27:39

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

Никакой:

Выделить код

Код:

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

Код:

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

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

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

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№918-06-2007 02:12:40

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

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

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

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

Это хорошо.


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1018-06-2007 08:34:02

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1118-06-2007 11:10:45

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1218-06-2007 13:29:11

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1318-06-2007 21:57:28

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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"?


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1419-06-2007 15:53:56

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1519-06-2007 19:27:12

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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);

Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1619-06-2007 20:43:48

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1719-06-2007 23:27:42

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

Вот так:

Выделить код

Код:

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)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№1820-06-2007 13:50:17

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

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

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

popuphiding ?

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

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№1920-06-2007 17:32:04

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

Ок, значит, другое свойство меняется, что-нибудь вроде 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

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


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2020-06-2007 21:41:13

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

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

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

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

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№2120-06-2007 23:20:49

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

В случае 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)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2221-06-2007 12:46:12

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

Обнаружил ошибку.
При 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)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2321-06-2007 19:49:29

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

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

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

Отредактировано Anton (21-06-2007 19:56:15)


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

№2422-06-2007 21:05:30

Infocatcher
Not found
 
Группа: Extensions
Зарегистрирован: 24-05-2007
Сообщений: 4339
UA: Firefox 2.0

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

По событию 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;

Отредактировано Infocatcher (24-06-2007 00:25:02)


Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела

Отсутствует

 

№2522-06-2007 22:06:20

Anton
Участник
 
Группа: Extensions
Откуда: от верблюда
Зарегистрирован: 14-12-2004
Сообщений: 3057
UA: Firefox 2.0
Веб-сайт

Re: Всплывающие подсказки для всех закладок - нельзя ли проще?

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

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


Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]