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

Хотите узнать больше о расширениях? Посмотрите ролики, рассказывающие о работе с расширениями Firefox.

№665128-07-2013 16:46:50

voqabuhe
Участник
 
Группа: Members
Зарегистрирован: 06-12-2011
Сообщений: 3231
UA: Firefox 25.0

Re: Custom Buttons

bunda1 пишет

Вроде не сложно, попробую.

Здорово, буду с нетерпением ждать. А то давно стесняюсь спроситьblush.gif grin.gif

Отсутствует

 

№665229-07-2013 11:12:54

toxa
Участник
 
Группа: Members
Зарегистрирован: 11-04-2012
Сообщений: 261
UA: Firefox 10.0

Re: Custom Buttons

bunda1 пишет

попробуй закоментировать case "goPopup": или case "PopupAutoCompleteRichResult": или case "PopupAutoComplete":

К сожалению, ничего не помогло.

Я попробовал 10-ю версию браузера - там всё заработало как надо, без всяких ухищрений. Чудеса!
Остался пока на 10.

Отсутствует

 

№665330-07-2013 15:48:56

Чайник
Участник
 
Группа: Members
Зарегистрирован: 15-04-2008
Сообщений: 268
UA: Firefox 18.0

Re: Custom Buttons

Я хочу сделать чтобы двойной клик выделял полностью текст в текстовых полях.
В инициализацию записан код

скрытый текст

Выделить код

Код:

gBrowser.addEventListener("dblclick", function(event){ 
    var ettN = event.target.tagName;
    if (((ettN=='TEXTAREA')||(ettN=='INPUT'))&&(event.button == 0)){
       event.preventDefault();
       document.getElementById("cmd_selectAll").doCommand();
    }
}, false);


Работает, но часто (не всегда) одинарный левый клик-нажатие ЛКМ вызывает выделение, которое тут же исчезает при отпускании ЛКМ. Отчего это?

И нужен ли тут event.preventDefault()? Вроде для левого даблклика никаких дефолтных действий не предусмотрено.

Отсутствует

 

№665430-07-2013 20:57:20

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

1. Обработчик лучше добавлять вот так, иначе будет дублироваться если открыть настройку панелей и других случаях:

Выделить код

Код:

addEventListener("dblclick", function(e) {
   .........
}, false, gBrowser );

2. Для левого даблклика предусмотрено действие - выделение слов или предложений, но так как ты все равно выделяешь все то наверно event.preventDefault() не нужен.

И так тоже можно:

Выделить код

Код:

addEventListener("dblclick", function(e) {
   if ( e.button !== 0 ) return;
   if ( ['input', 'textbox', 'textarea'].indexOf( e.target.localName ) !== -1 ) e.target.select();
}, false, gBrowser );

Добавлено 30-07-2013 21:02:42

Чайник пишет

Работает, но часто (не всегда) одинарный левый клик-нажатие ЛКМ вызывает выделение, которое тут же исчезает при отпускании ЛКМ. Отчего это?

Не замечал такого хотя долго пользовался подобным кодом и твой код не должен реагировать на одинарный левый клик. Но можно добавить в код что то типа:   

Выделить код

Код:

if ( e.type !== "dblclick") return;

Отредактировано bunda1 (30-07-2013 21:13:21)

Отсутствует

 

№665501-08-2013 15:05:42

Чайник
Участник
 
Группа: Members
Зарегистрирован: 15-04-2008
Сообщений: 268
UA: Firefox 18.0

Re: Custom Buttons

bunda1 пишет

Не замечал такого хотя долго пользовался подобным кодом и твой код не должен реагировать на одинарный левый клик. Но можно добавить в код что то типа:   

Выделить код

Код:

if ( e.type !== "dblclick") return;

Всё равно, и с этим кодом реагирует (спорадически) на одинарный клик - выделение появляется по событию onmousedown и по onmouseup оно сбрасывается. Т. е. при клике это выглядит как будто выделение появляется на долю секунды.
Ну ничего, жить с этим можно.

Cпасибо за помощь!


А вот как можно подправить этот код, чтобы он показывал код не выделенного фрагмента, а элемента с определённым id?

скрытый текст

Выделить код

Код:

javascript:(function(){var l='  ';var z={img:1,br:1,link:1,input:1,hr:1,meta:1};var q=false;var r=0;var A=1;var h=window;var s='resizable=yes,scrollbars=yes,location=no';var t=function(a){return'<span class=\'tag\'>&lt;'+a+''};var u=function(a){return(a?'/':'')+'&gt;</span>'};var v=function(a,b){if(b||z[a.toLowerCase()])return'';return'<span class=\'tag\'>&lt;/'+a+'&gt;</span>'};var B=function(){var a=document.doctype,b='';if(a){b=i()+t('!DOCTYPE')+' <span class=\'attrDoc\'>'+a.nodeName+(a.publicId?' PUBLIC \''+a.publicId+'\'':'')+(a.systemId?'</span></span></span></li>'+i()+'<span class=\'tag\'><span class=\'attrDoc\'>'+l+'\''+a.systemId+'\'':'')+'</span>'+u()+'</span></li>'}return b};var C=function(a){var b=a.attributes,f=null,c=null,d='',g=0;for(;f=b[g];g++){c=a.getAttribute(f.name)||f.value;if(c&&!(a.nodeName.toLowerCase()=='a'&&f.name=='SHAPE'&&c=='rect')){c=c.replace(/</g,'&lt;').replace(/</g,'&lt;').replace(/\t/g,l);d+=' <span class=\'attrTitle\'>'+f.name+'</span>=<span class=\'attrValue\'>\x22'+c+'\x22</span> '}}return d};var m=function(a){return text=a.nodeValue.replace(/[\n\t\r\u00A0]+ */g,'').replace(/ +/g,' ').replace(/</g,'&lt;').replace(/>/g,'&gt;')};var D=function(a){var b=0,f='';while(b<a){f+=l;b++}return f};var i=function(){var a=r.toString();while(a.length<3)a='0'+a;return'<li class=\'line'+(A&&((r++)&1)?' dark\'':'\'')+'><span>'};var w=function(a,b,f){var c=D(b++);var d='';switch(a.nodeType){case 1:{var g=a.childNodes,j=null,x=0;var n=(g.length==0)||(g.length==1&&g[0].nodeType==3);var o=q&&g.length==0;var k=i()+c+t(a.nodeName)+C(a)+u(o);if(!n)k+='</span></li>';for(;j=g[x];x++){k+=w(j,b,!n&&j.nodeType==3)}if(n){k+=(/textarea/i.test(a.nodeName)?a.value:'')+v(a.nodeName,o)+'</span></li>'}else{k+=i()+c+v(a.nodeName,o)+'</span></li>'}return k}case 3:{if((d=m(a))&&f){return i()+c+d+'</span></li>'}else{return d}}case 8:{d=m(a);return i()+c+'<span class=\'comment\'>&lt;!--'+d+'--&gt;</span></span></li>'}case 4:{d=m(a);return i()+c+'<span class=\'cdata\'>&lt;![CDATA[</span>'+d+'<span class=\'cdata\'>]]&gt;</span></span></li>'}}return a.nodeType};var E=function(a){var b='';if(!a||!a.getSelection)return b;if(a.getSelection()!=''){b=a.getSelection();h=a;s+=',width=500,height=400,left=100,top=100'}else{for(var f=0,c;c=a.frames[f];f++){try{if(b=arguments.callee(c))break}catch(e){}}}return b};var F=function(a){var b,f='';if(a){var c=a.getRangeAt(0);var d=c.commonAncestorContainer;if(d.nodeType==3||d.nodeType==4)d=d.parentNode;b=d.cloneNode(false);b.appendChild(c.cloneContents());var g=c.startContainer;var j=c.endContainer;if(g!=d.firstChild||(g.nodeType==3&&c.startOffset!=0))b.insertBefore(document.createTextNode('\u2026'),b.firstChild);if(j!=d.lastChild||(j.nodeType==3&&c.endOffset!=j.nodeValue.length))b.appendChild(document.createTextNode('\u2026'))}else{f=B();b=document.documentElement};f+=w(b,0);return f};var G=E(window);q=/[a-z]/.test(h.document.documentElement.nodeName);var H=(h.document.getElementsByTagName('title')[0]&&h.document.getElementsByTagName('title')[0].text.replace(/</g,'&lt;').replace(/>/g,'&gt;'))||(h.location.protocol+'//'+h.location.host+h.location.pathname);var I='<!DOCTYPE html PUBLIC><html><head><title>Snapshot: '+H+'</title><style type=\'text/css\'>body{padding:0 5px;margin:0;font-family:sans-serif;font-size:.7em;background-color:#FFF;color:#000;}#content{white-space:pre-wrap}ol{color:#999;}span{color:#000}.tag{color:#05F}.attrTitle{color:#E00}.attrValue{color:#C0C}.attrDoc{color:#800080}.comment{color:green}.line{margin:0;padding:0}.dark{background-color:#FAFAFA}</style></head><body><ol id=\'content\'>'+F(G)+'</ol></body></html>';var y=window.open('about:blank','_blank',s);var p=y.document;p.write(I);p.onkeyup=function(a){if(a.keyCode==27)y.close()};p.close()})()

Отредактировано Чайник (01-08-2013 15:15:06)

Отсутствует

 

№665603-08-2013 16:01:26

Zaycoff
Участник
 
Группа: Extensions
Зарегистрирован: 18-02-2012
Сообщений: 1411
UA: Firefox 22.0

Re: Custom Buttons

Подскажите пожалуйста, а можно при помощи кода кнопки закрыть текущий таб? (window.close(); не подходит, т.к. закрывает вообще весь браузер)

Отсутствует

 

№665703-08-2013 16:14:46

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Zaycoff пишет

Подскажите пожалуйста, а можно при помощи кода кнопки закрыть текущий таб? (window.close(); не подходит, т.к. закрывает вообще весь браузер)

Выделить код

Код:

gBrowser.removeCurrentTab();

Отсутствует

 

№665803-08-2013 16:19:32

Zaycoff
Участник
 
Группа: Extensions
Зарегистрирован: 18-02-2012
Сообщений: 1411
UA: Firefox 22.0

Re: Custom Buttons

bunda1
Спасибо большое! :music:

Отсутствует

 

№665903-08-2013 16:21:37

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Отсутствует

 

№666003-08-2013 16:43:26

Zaycoff
Участник
 
Группа: Extensions
Зарегистрирован: 18-02-2012
Сообщений: 1411
UA: Firefox 22.0

Re: Custom Buttons

О, круть, как всё подробненько, исчо раз благодарю :)

Отсутствует

 

№666103-08-2013 21:07:12

lokiju
Участник
 
Группа: Members
Зарегистрирован: 30-01-2012
Сообщений: 208
UA: Firefox 25.0

Re: Custom Buttons

Есть такая кнопка Готовые кнопки для Custom Buttons | Форум Mozilla Россия|№173 от Lex1 как сделать ,чтобы в контекстном меню на странице от этой кнопки был один пункт «Перевести». При наведении на который(курсора)  - открывалось подменю с пунктами:«на русский» , «на английский»
Вопрос к Dumby: Custom Buttons | Форум Mozilla Россия|Digital Clock - всплывающая подсказка - сейчас название кнопки. Сделать число,месяц,год,день недели - возможно?

Отредактировано lokiju (03-08-2013 21:08:14)

Отсутствует

 

№666204-08-2013 03:42:02

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2252
UA: Firefox 17.0

Re: Custom Buttons

lokiju пишет

Сделать число,месяц,год,день недели - возможно?

Вариант

скрытый текст

Выделить код

Код:

custombutton://%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0D%0A%3Ccustombutton%20xmlns%3Acb%3D%22http%3A//xsms.nm.ru/custombuttons/%22%3E%0A%20%20%3Cname%3EDigital%20Clock%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/x-icon%3Bbase64%2CAAABAAEAHg8AAAEAIABsBwAAFgAAACgAAAAeAAAAHgAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL//////9v///8AOpD/AAAA/5A6AP///9v//////9v///8AOpD/AAAA/5A6AP///9v//////2a2//+QOgD////b/9v///8AOpD/AAAA/5A6AP///9v//////9v///8AOpD/AAAA/5A6AP///9v///////+Cgv//goL//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////2a2//+QOgD////b/zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD///////+Cgv//goL/2////zo6kP//25D//////5Db//9mADr/2/+2/zo6kP//25D//////5Db//9mADr///+2////////////2////zo6kP//25D//////5Db//9mADr/2/+2/zo6kP//25D//////5Db//9mADr///+2//+Cgv//goL/tv///zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ////////////tv///zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ//+Cgv//goL/tv///2YAZv///7b//////7b///86AGb/ttuQ/2YAZv///7b//////7b///86AGb//9uQ/2a2//+QOgD/tv/b/2YAZv///7b//////7b///86AGb/ttuQ/2YAZv///7b//////7b///86AGb//9uQ//+Cgv//goL/tv///zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ/2a2//+QOgD/tv/b/zoAZv//25D//////7b///86AGb/ttuQ/zoAZv//25D//////7b///86AGb//9uQ//+Cgv//goL/2////wA6kP//tmb//////5Db//9mADr/2/+2/wA6kP//tmb//////5Db//9mADr///+2////////////2////wA6kP//tmb//////5Db//9mADr/2/+2/wA6kP//tmb//////5Db//9mADr///+2//+Cgv//goL//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////////////////////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD//////zqQ2/+2ZgD///////+Cgv//goL//////9v///8AOpD/AAAA/2YAAP///7b//////9v///8AOpD/AAAA/2YAAP///7b//////////////////////9v///8AOpD/AAAA/2YAAP///7b//////9v///8AOpD/AAAA/2YAAP///7b///////+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv//goL//4KC//+Cgv8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bconst%20showSec%20%3D%20true%3B%0A%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A/*%20dct-style%0A%0A%23digital-clock-text%20%7B%0A%09color%3A%20%23b73520%20%21important%3B%0A%09font-weight%3A%20bold%20%21important%3B%0A%0A%7D%0A%0Adct-style%20*/%0A//%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%3D%0A%0Aconst%20mark%20%3D%20%22dct-style%22%3B%0Aconst%20init%20%3D%20this.getAttribute%28%22cb-init%22%29%3B%0Aconst%20style%20%3D%20init.substring%28%0A%09init.indexOf%28%22/*%20%22%20+%20mark%29%20+%203%20+%20mark.length%2C%0A%09init.lastIndexOf%28mark%20+%20%22%20*/%22%29%0A%29.replace%28/%5Cn+/g%2C%20%22%5Cn%22%29.replace%28/%5E%5Cn/%2C%20%22%22%29.replace%28/%5Cn%24/%2C%20%22%22%29%3B%0A%0Athis.label%20%3D%20showSec%20%3F%20%2200%3A00%3A00%22%20%3A%20%2200%3A00%22%3B%0A%0Aconst%20icon%20%3D%20document.getAnonymousElementByAttribute%28this%2C%20%22class%22%2C%20%22toolbarbutton-icon%22%29%3B%0Aicon.style.display%20%3D%20%22none%22%3B%0Aconst%20text%20%3D%20document.getAnonymousElementByAttribute%28this%2C%20%22class%22%2C%20%22toolbarbutton-text%22%29%3B%0Atext.style.display%20%3D%20%22block%22%3B%0Atext.id%20%3D%20%22digital-clock-text%22%3B%0A%0Aconst%20sss%20%3D%20Cc%5B%22@mozilla.org/content/style-sheet-service%3B1%22%5D.getService%28Ci.nsIStyleSheetService%29%3B%0Aconst%20cssURI%20%3D%20makeURI%28%22data%3Atext/css%2C%22%20+%20encodeURIComponent%28style%29%29%3B%0Aif%20%28%21sss.sheetRegistered%28cssURI%2C%20sss.USER_SHEET%29%29%20sss.loadAndRegisterSheet%28cssURI%2C%20sss.USER_SHEET%29%3B%0A%0Aconst%20format%20%3D%20showSec%20%3F%20%22%25H%3A%25M%3A%25S%22%20%3A%20%22%25H%3A%25M%22%3B%0Aconst%20timer%20%3D%20Cc%5B%22@mozilla.org/timer%3B1%22%5D.createInstance%28Ci.nsITimer%29%3B%0Afunction%20tick%28%29%20%7B%0A%09var%20date%20%3D%20new%20Date%28%29%3B%0A//%09date.setHours%28date.getHours%28%29%20+%200%29%3B%0A%09self.label%20%3D%20date.toLocaleFormat%28format%29%0A%7D%0Atimer.initWithCallback%28tick%2C%201000%2C%20timer.TYPE_REPEATING_PRECISE%29%3B%0A%0Athis.onmouseenter%20%3D%20function%28%29%20%7B%0A%09this.interval%20%3D%20setInterval%28function%28%29%20%7B%0A%09%09var%20date%20%3D%20new%20Date%28%29%3B%0A//%09%09date.setHours%28date.getHours%28%29%20+%200%29%3B%0A%09%09var%20day%20%3D%20date.toLocaleFormat%28%22%25A%22%29%3B%0A%09%09self.tooltipText%20%3D%20date.toLocaleFormat%28%22%25d.%25m.%25Y%20%22%29%20+%20day%5B0%5D.toUpperCase%28%29%20+%20day.substring%281%29%3B%0A%09%7D%2C%20100%29%0A%7D%3B%0Athis.onmouseleave%20%3D%20function%28%29%20clearInterval%28this.interval%29%3B%0Athis.onDestroy%20%3D%20function%28reason%29%20%7B%0A%09if%20%28reason%20%3D%3D%20%22update%22%20%7C%7C%20reason%20%3D%3D%20%22delete%22%29%20%7B%0A%09%09if%20%28sss.sheetRegistered%28cssURI%2C%20sss.USER_SHEET%29%29%20sss.unregisterSheet%28cssURI%2C%20sss.USER_SHEET%29%3B%0A%09%7D%0A%09timer.cancel%28%29%0A%7D%3B%5D%5D%3E%3C/initcode%3E%0A%20%20%3Ccode%3E%3C%21%5BCDATA%5B/*CODE*/%5D%5D%3E%3C/code%3E%0A%20%20%3Caccelkey%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/accelkey%3E%0A%20%20%3Chelp%3E%3C%21%5BCDATA%5B%5D%5D%3E%3C/help%3E%0A%20%20%3Cattributes/%3E%0A%3C/custombutton%3E

Отсутствует

 

№666304-08-2013 12:16:43

lokiju
Участник
 
Группа: Members
Зарегистрирован: 30-01-2012
Сообщений: 208
UA: Firefox 25.0

Re: Custom Buttons

Dumby, спасибо.

Отсутствует

 

№666405-08-2013 13:21:25

Chis
Участник
 
Группа: Members
Зарегистрирован: 12-03-2009
Сообщений: 55
UA: Firefox 19.0

Re: Custom Buttons

B FF22 перестали работать кнопки:
Extensions:

Выделить код

Код:

/*Initialization Code*/
this.url2xul = 'chrome://mozapps/content/extensions/extensions.xul';
this.onClick = function (e) {
    switch (e.button) {
    case 0:
        try {
            BrowserOpenAddonsMgr();
        }
        catch(e) {
            BrowserOpenExtensions('extensions');
        }
        break;
    case 1:
        {
            if (e.ctrlKey) {
                var t = gBrowser.mTabs;
                var current = content.document.location.href;
                var i = t.length;
                if (current == this.url2xul) gBrowser.removeCurrentTab();
                else while (true) {
                    if (--i < 0) {
                        if (current == 'about:blank') // replace blank tab
                        loadURI(this.url2xul);
                        else // add new tab 
                        gBrowser.selectedTab = gBrowser.addTab(this.url2xul);
                        break;
                    };
                    if (t[i].linkedBrowser.currentURI.spec == this.url2xul) // popup loaded
                    {
                        gBrowser.selectedTab = gBrowser.tabContainer.childNodes[i];
                        break;
                    };
                };
            } else openWebPanel(this.tooltipText, this.url2xul);
        };
        break;
    };
};
this.setAttribute('onclick', 'this.onClick(event);');

const Cb = custombuttons;

function prop(aElement, aString) {
    var emRDF = "http://www.mozilla.org/2004/em-rdf#";
    var arc = RDFService.GetResource(emRDF + aString);
    var target = extensionDS.GetTarget(aElement, arc, true);
    if (target instanceof Ci.nsIRDFLiteral) return target.Value;
    if (target instanceof Ci.nsIRDFInt) return target.Value;
    return null;
}

var cloneCBcontext = {
    cloneItems: function (aNode, aID, aSeparate) {
        var menupopup = document.getElementById(aID).cloneNode(true);
        var menuitems = menupopup.childNodes.length;
        for (var i = 0; i < menuitems; i++)
        aNode.appendChild(menupopup.firstChild);
        if (aSeparate) aNode.appendChild(document.createElement("menuseparator"));
    },
    makeMenu: function (aNode) {
        var m = aNode.appendChild(document.createElement("menu"));
        m.setAttribute("label", "Custom Button");
        m.setAttribute("oncommand", "event.stopPropagation()");
        var mp = m.appendChild(document.createElement("menupopup"));
        cloneCBcontext.cloneItems(mp, "custombuttons-contextpopup");
        aNode.insertBefore(document.createElement("menuseparator"), m);
    }
}

const popupID = "cbContext-extensionsButton";

var test = document.getElementById(popupID);
if (test) test.parentNode.removeChild(test);

var main = document.getElementById("mainPopupSet");
var cPopup = main.appendChild(document.createElement("menupopup"));
cPopup.id = popupID;
cPopup.setAttribute("oncommand", "event.stopPropagation(); document.popupNode.openPrefs(event);")

var app = Cc ["@mozilla.org/fuel/application;1"]. getService (Ci. fuelIApplication);
var am = {};
Cu. import ("resource://gre/modules/AddonManager.jsm", am);
am. AddonManager. getAddonsByTypes
(
    ["extension"],
    function (extensions)
    {
        var e;
        for (var i = 0; i < extensions. length; i++)
        {
            e = extensions [i];
            var mi = <menuitem xmlns={xulns}
                       label={e. name + " " + e. version}/>;
            if (e. iconURL)
            {
                mi ["@class"] = "menuitem-iconic bookmark-item";
                mi ["@image"] = e. iconURL;
            }
            if (e. userDisabled)
                mi ["@disabled"] = "true";
            if (e. optionsURL)
                mi ["@oncommand"] = "window. openDialog ('" + e. optionsURL + "', '', 'chrome,dialog=0,resizable,titlebar,toolbar,centerscreen');";
            cPopup. appendChild (cbu. makeXML (mi));
        }
    }
);

cloneCBcontext.makeMenu(cPopup);
this.setAttribute("context", popupID);

if (typeof Local_Install != "object") return;

var test = document.getElementById("cbContext-extensions");
if (test) test.parentNode.removeChild(test);

var cbPopup = document.getElementById("custombuttons-contextpopup-subCall").cloneNode(true); // Cb context
var subMenu = document.createElement("menu");
subMenu.setAttribute("label", "Custom Button");
subMenu.appendChild(cbPopup.lastChild);

var extensionsPopup = document.getElementById("emb-context");
var popup = extensionsPopup.cloneNode(true);
popup.id = "cbContext-extensions";
popup.appendChild(document.createElement("menuseparator"));
popup.appendChild(subMenu);
extensionsPopup.parentNode.appendChild(popup);

this.setAttribute("context", popup.id);

Stacked Session Bookmarks:

Выделить код

Код:

// http://infocatcher.ucoz.net/js/cb/sessionBookmarks.js

// Session Bookmarks button for Custom Buttons
// (code for "initialization" section)

// (c) Infocatcher 2011
// version 0.1.0pre2 - 2011-06-26

// Compatibility: Firefox 3.6+, SeaMonkey 2.1+

var options = {
    middleClickCloseMenu: true,
    checkDuplicates: true,
    useSessions: true,
    reloadSessions: true
};

this.type = "menu";
this.orient = "horizontal";
this.onclick = function(e) {
    if(e.target != this)
        return;
    if(e.button == 1 || e.button == 0 && this.bookmarks.hasModifier(e))
        this.bookmarks.addBookmark();
};
this.setAttribute("ondragdrop", "return this.bookmarks.handleDrop(event);");
this.setAttribute("ondragover", "return this.bookmarks.handleDragOver(event);");
this.bookmarks = {
    options: options,
    get deleteLabel() {
        var mi = document.getElementById("placesContext_delete");
        delete this.deleteLabel;
        return this.deleteLabel = mi && mi.getAttribute("label") || "Delete";
    },
    get openAllLabel() {
        var sb = document.getElementById("bundle_browser");
        if(sb) try {
            var label = sb.getString("menuOpenAllInTabs.label");
        }
        catch(e) {
        }
        delete this.openAllLabel;
        return this.openAllLabel = label || "Open All in Tabs";
    },

    button: this,
    XULNS: "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul",
    get ss() {
        delete this.ss;
        return this.ss = Components.classes["@mozilla.org/browser/sessionstore;1"]
            .getService(Components.interfaces.nsISessionStore);
    },
    get ios() {
        delete this.ios;
        return this.ios = Components.classes["@mozilla.org/network/io-service;1"]
            .getService(Components.interfaces.nsIIOService);
    },
    get file() {
        var file = Components.classes["@mozilla.org/file/directory_service;1"]
            .getService(Components.interfaces.nsIProperties)
            .get("ProfD", Components.interfaces.nsILocalFile);
        file.append("custombuttons");
        file.append("bookmarks" + (/\d+/.test(this.button.id) ? "-" + RegExp.lastMatch : "") + ".txt");
        delete this.file;
        return this.file = file.QueryInterface(Components.interfaces.nsILocalFile);
    },
    init: function() {
        var file = this.file;
        if(file.exists())
            this.readFromFileAsync(file, this.load, this);
        else
            this.load("");
    },
    _label:   "label:   ",
    _uri:     "uri:     ",
    _icon:    "icon:    ",
    _session: "session: ",
    load: function(data) {
        var btnId = this.button.id;
        this.cmId      = btnId + "-context";
        this.sepId     = btnId + "-separator";
        this.openAllId = btnId + "-openAll";
        var mp = <menupopup xmlns={this.XULNS}
            context={this.cmId}
            oncommand="this.parentNode.bookmarks.openBookmark(event);"
            onclick="this.parentNode.bookmarks.openBookmark(event);"
            onpopuphidden="this.parentNode.bookmarks.checkUnsaved();"
        />
        data.split("\n\n").forEach(function(section, i) {
            if(!section)
                return;
            var label, uri, icon, ssData;
            var typeOffset = this._label.length;
            section.split("\n").forEach(function(line, i) {
                if(!line)
                    return;
                var type = line.substr(0, typeOffset);
                line = line.substr(typeOffset);
                switch(type) {
                    case this._label:   label  = line; break;
                    case this._uri:     uri    = line; break;
                    case this._icon:    icon   = line; break;
                    case this._session: ssData = line;
                }
            }, this);
            mp.appendChild(this.getMenuitem(label, uri, icon, ssData));
        }, this);
        mp.appendChild(
            <menuseparator xmlns={this.XULNS} id={this.sepId} />
        );
        mp.appendChild(
            <menuitem xmlns={this.XULNS} id={this.openAllId}
                label={this.openAllLabel}
            />
        );
        this.mp = this.button.appendChild(this.parseFromXML(mp));

        var cm = document.getElementById(this.cmId);
        cm && cm.parentNode.removeChild(cm);
        cm = this.parseFromXML(
            <menupopup xmlns={this.XULNS}
                id={this.cmId}
                onpopupshowing="return (this.parentNode.triggerNode || document.popupNode).hasAttribute('cb_uri');"
            >
                <menuitem
                    label={this.deleteLabel} closemenu="single"
                    oncommand="this.parentNode.bookmarks.deleteBookmark(this.parentNode.triggerNode || document.popupNode);"
                />
            </menupopup>
        );
        cm.bookmarks = this;
        document.getElementById("mainPopupSet").appendChild(cm);
        this.showOpenAll();
    },
    unsaved: false,
    save: function() {
        var data = [];
        Array.forEach(
            this.mp.getElementsByAttribute("cb_uri", "*"),
            function(mi) {
                var section = [
                    this._label + this.escapeString(mi.getAttribute("label")),
                    this._uri   + this.escapeString(mi.getAttribute("cb_uri"))
                ];
                var icon   = mi.getAttribute("image");
                var ssData = mi.getAttribute("cb_ssData");
                icon   && section.push(this._icon    + this.escapeString(icon));
                ssData && section.push(this._session + this.escapeString(ssData));
                data.push(section.join("\n"));
            },
            this
        );
        this.writeToFileAsync(data.join("\n\n"), this.file);
        this.unsaved = false;
    },
    checkUnsaved: function() {
        this.unsaved && this.save();
    },
    getMenuitem: function(label, uri, icon, ssData) {
        return <menuitem xmlns={this.XULNS}
            class="menuitem-iconic bookmark-item menuitem-with-favicon"
            label={label || ""}
            cb_uri={uri || ""}
            cb_ssData={ssData || ""}
            tooltiptext={uri || ""}
            image={icon || ""}
        />
    },
    addBookmark: function(tab) {
        if(!tab)
            tab = gBrowser.selectedTab;
        var label = tab.label;
        var uri = tab.linkedBrowser && tab.linkedBrowser.currentURI.spec;
        var icon = tab.image;
        if(/^https?:/.test(icon) && !this.isOldSeaMonkey) // https://bugzilla.mozilla.org/show_bug.cgi?id=467828
            icon = "moz-anno:favicon:" + icon;
        if(this.options.useSessions)
            var ssData = this.ss.getTabState(tab);
        if(this.options.checkDuplicates) {
            var mi = this.mp.getElementsByAttribute("cb_uri", uri);
            if(mi.length) {
                mi = mi[0];
                if(
                    mi.getAttribute("label") == label
                    && mi.getAttribute("image") == icon
                    && (this.options.useSessions ? mi.getAttribute("cb_ssData") == ssData : true)
                )
                    return;
            }
        }
        var mi = this.parseFromXML(this.getMenuitem(label, uri, icon, ssData));
        this.mp.insertBefore(mi, document.getElementById(this.sepId));
        this.save();
        this.showOpenAll(true);
        this.blink();
    },
    blink: function() {
        var stl = this.button.style;
        if("transition" in stl)
            stl.transition = "opacity 100ms ease-in";
        else if("MozTransition" in stl)
            stl.MozTransition = "opacity 100ms ease-in";
        stl.opacity = "0.72";
        setTimeout(function() {
            stl.opacity = "";
            setTimeout(function() {
                if("transition" in stl)
                    stl.transition = "";
                else if("MozTransition" in stl)
                    stl.MozTransition = "";
            }, 150);
        }, 250);
    },
    openBookmark: function(e) {
        var mi = e.target;
        if(mi.id == this.openAllId) {
            if(e.type == "command")
                this.openAllBookmarks();
            return;
        }
        var uri = mi.getAttribute("cb_uri");
        var tab;
        if(e.type == "click" ? e.button == 1 : this.hasModifier(e)) {
            tab = gBrowser.selectedTab = gBrowser.addTab(this.options.useSessions ? "about:blank" : uri);
            this.options.middleClickCloseMenu && closeMenus(mi);
        }
        else if(e.type == "command") {
            if(!this.options.useSessions)
                loadURI(uri);
            tab = gBrowser.selectedTab;
        }
        if(tab && this.options.useSessions)
            this.setTabSession(tab, mi.getAttribute("cb_ssData"), uri);
    },
    openAllBookmarks: function() {
        Array.forEach(
            this.mp.getElementsByAttribute("cb_uri", "*"),
            function(mi, i, mis) {
                if(this.options.useSessions) {
                    var tab = gBrowser.addTab("about:blank");
                    this.setTabSession(tab, mi.getAttribute("cb_ssData"), mi.getAttribute("cb_uri"));
                }
                else {
                    gBrowser.addTab(mi.getAttribute("cb_uri"));
                }
            },
            this
        );
    },
    setTabSession: function(tab, ssData, uri) {
        try {
            this.ss.setTabState(tab, ssData);
            if(this.options.reloadSessions && !this.ios.offline)
                tab.linkedBrowser.addProgressListener(this.progressListener);
        }
        catch(e) {
            uri && tab.linkedBrowser.loadURI(uri);
        }
    },
    progressListener: {
        QueryInterface: function(aIID) {
            if(
                aIID.equals(Components.interfaces.nsIWebProgressListener)
                || aIID.equals(Components.interfaces.nsISupportsWeakReference)
                || aIID.equals(Components.interfaces.nsISupports)
            )
                return this;
            throw Components.results.NS_NOINTERFACE;
        },
        onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) {
            var wpl = Components.interfaces.nsIWebProgressListener;
            if(aFlag & wpl.STATE_START) { // Force load to bypass cache
                aRequest.loadFlags = aRequest.loadFlags | aRequest.LOAD_BYPASS_CACHE;
                aWebProgress.chromeEventHandler.removeProgressListener(this);
            }
        },
        onLocationChange: function(aProgress, aRequest, aURI) {},
        onProgressChange: function(aWebProgress, aRequest, curSelf, maxSelf, curTot, maxTot) {},
        onStatusChange:   function(aWebProgress, aRequest, aStatus, aMessage) {},
        onSecurityChange: function(aWebProgress, aRequest, aState) {}
    },
    deleteBookmark: function(mi) {
        mi.parentNode.removeChild(mi);
        if(this.button.open || this.button.getAttribute("open") == "true")
            this.unsaved = true;
        else
            this.save();
        this.showOpenAll();
    },
    showOpenAll: function(show) {
        if(show === undefined)
            show = this.mp.getElementsByAttribute("cb_uri", "*").length > 0;
        document.getElementById(this.sepId).hidden
            = document.getElementById(this.openAllId).hidden
            = !show;
        if(!show)
            this.mp.hidePopup();
    },
    handleDragOver: function(event) {
        var dt = event.dataTransfer;
        //~ todo: dt.mozItemCount
        var tab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
        if(!tab)
            return null;
        event.preventDefault();
        event.stopPropagation();
        return dt.effectAllowed = dt.dropEffect = "link";
    },
    handleDrop: function(event) {
        var dt = event.dataTransfer;
        //var uri = dt.mozGetDataAt("text/x-moz-text-internal", 0);
        var tab = dt.mozGetDataAt(TAB_DROP_TYPE, 0);
        this.addBookmark(tab);
    },
    get isOldSeaMonkey() {
        var info = Components.classes["@mozilla.org/xre/app-info;1"]
            .getService(Components.interfaces.nsIXULAppInfo);
        delete this.isOldSeaMonkey;
        return this.isOldSeaMonkey = info.name == "SeaMonkey" && parseFloat(info.version) <= 2;
    },
    hasModifier: function(e) {
        return e.ctrlKey || e.shiftKey || e.altKey || e.metaKey;
    },
    escapeString: function(s) {
        return s.replace(/\n/g, "\r");
    },
    readFromFileAsync: function(file, callback, context) {
        Components.utils.import("resource://gre/modules/NetUtil.jsm");
        NetUtil.asyncFetch(file, this.bind(function(istream, status) {
            var data = "";
            if(Components.isSuccessCode(status)) {
                try { // Firefox 7.0a1 throws after istream.available() on empty files
                    data = this.convertToUnicode(NetUtil.readInputStreamToString(istream, istream.available()));
                }
                catch(e) {
                }
            }
            callback.call(context || this, data, status);
        }, this));
    },
    writeToFileAsync: function(str, file, callback, context) {
        Components.utils["import"]("resource://gre/modules/NetUtil.jsm");
        Components.utils["import"]("resource://gre/modules/FileUtils.jsm");
        var ostream = FileUtils.openSafeFileOutputStream(file);
        var suc = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
        suc.charset = "UTF-8";
        var istream = suc.convertToInputStream(str);
        NetUtil.asyncCopy(istream, ostream, callback && this.bind(function(status) {
            callback.call(context || this, status);
        }, this));
    },
    convertToUnicode: function(str) {
        var suc = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]
            .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
        suc.charset = "utf8";
        try {
            return suc.ConvertToUnicode(str);
        }
        catch(e) {
            Components.utils.reportError(e);
        }
        return str;
    },
    bind: function(func, context, args) {
        return function() {
            return func.apply(context, args || arguments);
        };
    },
    parseFromXML: function(xml) {
        var pp = XML.prettyPrinting;
        XML.prettyPrinting = false;
        var elt = this.parseFromString(xml.toXMLString());
        XML.prettyPrinting = pp;
        return elt;
    },
    parseFromString: function(str, contentType) {
        return new DOMParser().parseFromString(str, contentType || "application/xml").documentElement;
    }
};
this.bookmarks.init();

Покозать/скрыть панель закладок:

Выделить код

Код:

/*CODE*/
toggleToolbar("PersonalToolbar");
function toggleToolbar(tbId, show, multiple) {
    var tb = tbId == "FindToolbar" && window.gFindBar
        || document.getElementById("__customToolbar_" + tbId.replace(/ /, "_"))
        || document.getElementById(tbId);
    if(!tb) {
        Components.utils.reportError(<>[Custom Buttons] Toolbar "{tbId}" not found!</>);
        return;
    }
    var hideAttr = tb.getAttribute("type") == "menubar"
        ? "autohide"
        : tb.localName == "findbar"
            ? "hidden"
            : "collapsed";
    var hide = show == undefined
        ? tb.getAttribute(hideAttr) != "true"
        : !show;
    tb.setAttribute(hideAttr, hide);
    document.persist(tbId, hideAttr);
    !multiple && toggleToolbarsDone();
}
function toggleToolbarsDone() {
    if("PlacesToolbarHelper" in window) { // Firefox 4
        PlacesToolbarHelper.init();
        BookmarksMenuButton.updatePosition();
        updateAppButtonDisplay();
    }
}
function toggleToolbars(toolbars, show) {
    toolbars.forEach(function(tbId) {
        toggleToolbar(tbId, show, true);
    });
    toggleToolbarsDone();
}

Помогите решить проблему!
Спасибо.

Отсутствует

 

№666505-08-2013 20:26:28

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Chis пишет

B FF22 перестали работать кнопки:
Stacked Session Bookmarks:

Session Bookmarks 0.2.0 (2013-01-26)

Chis пишет

B FF22 перестали работать кнопки:
Покозать/скрыть панель закладок:

Выделить код

Код:

toggleToolbar("PersonalToolbar");
function toggleToolbar(tbId, show, multiple) {
    var tb = tbId == "FindToolbar" && window.gFindBar
        || document.getElementById("__customToolbar_" + tbId.replace(/ /, "_"))
        || document.getElementById(tbId);
    if(!tb) {
        Components.utils.reportError('[Custom Buttons] Toolbar: ' + tbId + ' not found!');
        return;
    }
    var hideAttr = tb.getAttribute("type") == "menubar"
        ? "autohide"
        : tb.localName == "findbar"
            ? "hidden"
            : "collapsed";
    var hide = show == undefined
        ? tb.getAttribute(hideAttr) != "true"
        : !show;
    tb.setAttribute(hideAttr, hide);
    document.persist(tbId, hideAttr);
    !multiple && toggleToolbarsDone();
}
function toggleToolbarsDone() {
    if("PlacesToolbarHelper" in window) { // Firefox 4
        PlacesToolbarHelper.init();
        BookmarksMenuButton.updatePosition();
        updateAppButtonDisplay();
    }
}
function toggleToolbars(toolbars, show) {
    toolbars.forEach(function(tbId) {
        toggleToolbar(tbId, show, true);
    });
    toggleToolbarsDone();
}
Chis пишет

B FF22 перестали работать кнопки:
Extensions:

Extensions Options Menu

Отредактировано bunda1 (05-08-2013 21:06:45)

Отсутствует

 

№666605-08-2013 22:48:56

Zaycoff
Участник
 
Группа: Extensions
Зарегистрирован: 18-02-2012
Сообщений: 1411
UA: Firefox 22.0

Re: Custom Buttons

В Torbutton есть функция подмены разрешения экрана и часового пояса/системного времени для JavaScript,  за это отвечает, кажется, вот этот код, можно его как-то перенести в кнопку, чтобы всё это работало без самого дополнения?

Отсутствует

 

№666706-08-2013 14:51:26

mcfev
Участник
 
Группа: Members
Зарегистрирован: 21-03-2011
Сообщений: 11
UA: Firefox 22.0

Re: Custom Buttons

Помогите пожалуйста. Нужна кнопка [firefox], которая будет парсить страницу (если возможно использовать jquery по есть код) получая ссылки (с определенной страницы) в массив.

Отсутствует

 

№666806-08-2013 15:51:01

rsuan
Участник
 
Группа: Members
Зарегистрирован: 30-12-2010
Сообщений: 116
UA: Firefox 22.0

Re: Custom Buttons

Нужна кнопка Quick bookmarks для новых версий FF. Или, может быть, посоветуете её замену?

Отредактировано rsuan (06-08-2013 18:18:20)

Отсутствует

 

№666906-08-2013 17:28:41

mcfev
Участник
 
Группа: Members
Зарегистрирован: 21-03-2011
Сообщений: 11
UA: Firefox 22.0

Re: Custom Buttons

okkamas_knife
не открытой вкладки нужно

Выделить код

Код:

var links=window.content.document.getElementsByTagName('a')

а определенного сайта;
и второе хотелось бы все таки что-то типо:

var listUrl = new Array();
var listText = new Array();
$('.blocks_content:first a').each(function(i,elem)
{
    listUrl.push($(elem).attr('href'));
    listText.push($(elem).text());
});

Отсутствует

 

№667006-08-2013 19:28:37

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

rsuan пишет

Нужна кнопка Quick bookmarks для новых версий FF. Или, может быть, посоветуете её замену?

Quick bookmarks( Firefox 3.6 + )

Отсутствует

 

№667106-08-2013 21:17:58

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 23.0

Re: Custom Buttons

У тех у кого кнопка-жесты, есть ли у вас код: в начало, в конец документа ?

Отсутствует

 

№667206-08-2013 21:21:31

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Pony_Smile_Pack пишет

У тех у кого кнопка-жесты, есть ли у вас код: в начало, в конец документа ?

Выделить код

Код:

goDoCommand('cmd_scrollTop')
Выделить код

Код:

goDoCommand('cmd_scrollBottom')

Отредактировано bunda1 (06-08-2013 21:22:02)

Отсутствует

 

№667306-08-2013 21:25:14

Pony_Smile_Pack
Участник
 
Группа: Members
Зарегистрирован: 13-01-2012
Сообщений: 1144
UA: Firefox 23.0

Re: Custom Buttons

bunda1, спасибо

нда, теперь они не мгновенные в 23(если вставлять в FireGestures, а не кнопкой)

Отредактировано Pony_Smile_Pack (07-08-2013 02:08:10)

Отсутствует

 

№667406-08-2013 22:01:26

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Pony_Smile_Pack пишет

нда, теперь они не мгновенные в 23

У меня мгновенные в 23

Отсутствует

 

№667506-08-2013 22:24:38

bunda1
Moderator
 
Группа: Moderators
Откуда: Латвия
Зарегистрирован: 09-02-2010
Сообщений: 4811
UA: Firefox 3.6

Re: Custom Buttons

Pony_Smile_Pack пишет

Да нет, как бы. Смотря что считать мгновенным конечно. Но в 22 страница не прокручивалась, а сразу перемещалась.

Не увидел разницу.

Отсутствует

 

Board footer

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