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

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

№530127-11-2012 20:08:10

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

Re: Custom Buttons

А как тогда event ? Не передаетса.
.addEventListener(type, moveTabToNewGroup(e), false) });
function moveTabToNewGroup(e) {
      if ( e.type =

Отредактировано bunda1 (27-11-2012 20:09:02)

Отсутствует

 

№530227-11-2012 20:14:46

Lex1
Участник
 
Группа: Members
Зарегистрирован: 07-07-2007
Сообщений: 260
UA: Firefox 17.0

Re: Custom Buttons

moveTabToNewGroup(e) - не нужно.

Не передаетса

Дело не в этом, это получается не обработчик, а вызов функции.

Добавлено 27-11-2012 20:17:01
См. http://javascript.ru/blog/Andrej-Parani … e-sobytiya

Добавлено 27-11-2012 20:23:43
https://developer.mozilla.org/en-US/doc … ntListener

Moreover, in the first case, since no reference to the anonymous functions is kept, it is not possible to call element.removeEventListener because we do not have a reference to the handler, while in the second case, it's possible to do myElement.removeEventListener("click", processEvent, false).

Отредактировано Lex1 (27-11-2012 20:31:31)

Отсутствует

 

№530327-11-2012 20:29:18

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

Re: Custom Buttons

Спасибо, теперь обработчики удаляются:

Выделить код

Код:

["mousedown", "mouseup", "dragstart"].forEach(function(type) { gBrowser.mTabContainer.addEventListener(type, moveTabToNewGroup, false) });
this.onDestroy = function() {
["mousedown", "mouseup", "dragstart"].forEach(function(type) { gBrowser.mTabContainer.removeEventListener(type, moveTabToNewGroup, false) });
};

function moveTabToNewGroup(e) { Services.console.logStringMessage('e.type = ' + e.type) };

Отсутствует

 

№530427-11-2012 22:52:16

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 16.0

Re: Custom Buttons

А можно как-то букмарклеты в контекстное меню загнать, может через переделанные в кнопки. И еще, никак не могу найти раздел с букмарклетами, наподобие Готовые кнопки для Custom Buttons или тут такого раздела нет, где бы посмотреть готовые.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№530527-11-2012 22:57:24

Lex1
Участник
 
Группа: Members
Зарегистрирован: 07-07-2007
Сообщений: 260
UA: Firefox 17.0

Re: Custom Buttons

villa7
http://forum.mozilla-russia.org/viewtop … 88#p590488
Добавлять: ["Имя", function(){код_без_javascript:}],

Отредактировано Lex1 (27-11-2012 22:57:40)

Отсутствует

 

№530628-11-2012 00:02:55

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

Re: Custom Buttons

Lex1 я так понимаю, это ваш скрипт google-translate.js
Тут на форуме есть варианты переделки вашего скрипта под кнопку в готовых кнопках.
Может сделаете полноценную кнопку как автор скрипта.

Отсутствует

 

№530728-11-2012 02:11:52

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 16.0

Re: Custom Buttons

Lex1 пишет

Добавлять: ["Имя", function(){код_без_javascript:}],

Таким образом поиск из Гугла в Яндекс работает, а загрузка с Ютуб никак.

скрытый текст
["Yandex", function(){(function(){var a=window,b=document,c=encodeURIComponent,d=a.open("http://yandex.ru/yandsearch?text="+c(b.getElementsByName('q')[0].value));})();}],
    ["YouTube", function(){(function(){url='http://deturl.com/download-video.js';document.body.appendChild(document.createElement('script')).src=url+'?'+new%20Date().getTime();})();}],

исходный bookmarklet:
скрытый текст
javascript:(function(){url='http://deturl.com/download-video.js';document.body.appendChild(document.createElement('script')).src=url+'?'+new%20Date().getTime();})();

Отредактировано villa7 (28-11-2012 02:15:26)


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№530828-11-2012 02:41:26

Kiril__777
Участник
 
Группа: Members
Зарегистрирован: 13-07-2009
Сообщений: 393
UA: Firefox 13.0

Re: Custom Buttons

Lex1 пишет

А вот так можно перетащить всё подменю, (почти) без изменений в коде.

Так и сделаю, просто чудесно.

Только один вопрос: чем  и как лучше передвигать пункты меню, с помощью DOM инспектора, стилей или расширений типа menumanipulator?

Отсутствует

 

№530928-11-2012 10:17:20

Lex1
Участник
 
Группа: Members
Зарегистрирован: 07-07-2007
Сообщений: 260
UA: Firefox 17.0

Re: Custom Buttons

villa7
Если встречается %20 то сначала http://meyerweb.com/eric/tools/dencoder/ -> decode.

// Пояснение почему сделано именно так - сохранение в текстовой строке приводит к серьёзным проблемам с экранированием, особенно в регулярках, скажем вместо "/\//" loadURI получает "///" и код естественно не работает.

Отредактировано Lex1 (28-11-2012 12:12:47)

Отсутствует

 

№531028-11-2012 12:01:02

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 16.0

Re: Custom Buttons

Lex1 пишет

Если встречается %20 то сначала http://meyerweb.com/eric/tools/dencoder/ -> decode.

Вставил, перекодировал, получил

(function(){url='http://deturl.com/download-video.js';document.body.appendChild(document.createElement('script')).src=url '?' new Date().getTime();})();

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


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№531128-11-2012 12:11:58

Lex1
Участник
 
Группа: Members
Зарегистрирован: 07-07-2007
Сообщений: 260
UA: Firefox 17.0

Re: Custom Buttons

Эмм... Декодер не совсем тот. Попробуйте http://www.codenet.ru/services/urlencode-urldecode/ - нижнее правое поле.
Получится

Выделить код

Код:

(function(){url='http://deturl.com/download-video.js';document.body.appendChild(document.createElement('script')).src=url+'?'+new Date().getTime();})();

Отредактировано Lex1 (28-11-2012 12:13:52)

Отсутствует

 

№531228-11-2012 12:40:09

villa7
Участник
 
Группа: Members
Зарегистрирован: 21-07-2012
Сообщений: 2235
UA: Firefox 16.0

Re: Custom Buttons

Lex1  пишет

Получится: (function(){url='http://deturl.com/download-video.js';document.body.appendChild(document.createElement('script')).src=url+'?'+new Date().getTime();})();

Вот теперь работает, спасибо большое.


Лучше спросить у знающих - чем лезть не зная.

Отсутствует

 

№531330-11-2012 15:14:19

Lex1
Участник
 
Группа: Members
Зарегистрирован: 07-07-2007
Сообщений: 260
UA: Firefox 17.0

Re: Custom Buttons

Kiril__777

чем  и как лучше передвигать пункты меню

У меня не было такой необходимости, так что тут не подскажу.

Andrey_Krropotkin
Как-то так:

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

Выделить код

Код:

var ujs_createWindow = function(strContent, strStatus, strTitle, strId, pos, size){
    var wId = 'ujs_window'+(strId || ''), win = doc.getElementById(wId);
    var keyDown = function(e){if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == 27)doc.getElementById(wId).closeWin()};
    if(win)win.closeWin();
    win = doc.createElement('div');
    win.setAttribute('style', 'position:fixed;display:block;visibility:hidden;left:0;top:0;width:auto;height:auto;border:1px solid gray;padding:3px;margin:0;z-index:99999;overflow:hidden;cursor:move;'+(typeof win.style.borderRadius === 'string' ? 'background-color:#f3f5f7;padding-top:4px;border-radius:4px;box-shadow:0 0 12px rgba(0,0,0,.4);' : 'background:-o-skin("Window Skin");'));
    win.id = wId;
    win.closeWin = function(){
        doc.removeEventListener('keydown', keyDown, false);
        this.parentNode.removeChild(this);
    };
    win.addEle = function(str, style){
        var ele = doc.createElement('div');
        ele.setAttribute('style', style);
        if(str){
            ele.innerHTML = str;
            for(var el, all = ele.getElementsByTagName('*'), i = all.length; i--;){
                el = all[i];
                if(/^(script|frame|iframe|applet|embed|object)$/i.test(el.nodeName)){
                    el.parentNode.removeChild(el);
                }
                else{
                    for(var att = el.attributes, j = att.length; j--;){
                        if(/^on[a-z]+$/i.test(att[j].name))att[j].value = '';
                    }
                }
            }
        };
        return this.appendChild(ele);
    };
    var img = doc.createElement('div');
    img.setAttribute('style', 'display:block;float:right;width:18px;height:18px;padding:0;margin:0;border:none;cursor:pointer;background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAAZElEQVR42mNgGNyAGQixsVGU/AdCXjCbHczmxKaMFywlAlWiw6DAwIZNmQhYGqJEDWoqFiAGVmKKTwk73CRJ/Ep0GIyhbsPpO4hbIG4TwKaMk0EZ7hYBBk1cvmNDEmbDrmSwAADE8h10+qICXwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII=");background:-o-skin("Caption Close Button Skin");');
    img.title = 'Close';
    img.addEventListener('click', function(){this.parentNode.closeWin()}, false);
    win.appendChild(img);
    var title = win.addEle(strTitle, 'display:table;color:#000;font:16px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
    var content = win.addEle(strContent, 'display:block;border:1px solid #aaa;margin:2px 0 1px 0;padding:4px;background-color:#fafcfe;color:#000;font:14px Times New Roman;width:240px;height:120px;overflow:auto;cursor:text;');
    var status = win.addEle(strStatus, 'display:table;color:#555;font:10px Times New Roman;width:auto;height:auto;padding:0;margin:0 2px;cursor:text;');
    win.addEventListener('mousedown', function(e){
        if(e.target == win){
            e.preventDefault();
            var grabX = e.clientX, grabY = e.clientY, origX = parseInt(win.style.left), origY = parseInt(win.style.top);
            var mouseMove = function(ev){
                win.style.left = origX+ev.clientX-grabX+'px';
                win.style.top = origY+ev.clientY-grabY+'px';
            };
            doc.addEventListener('mousemove', mouseMove, false);
            doc.addEventListener('mouseup', function(){doc.removeEventListener('mousemove', mouseMove, false)}, false);
        }
    }, false);
    doc.documentElement.appendChild(win);

    if(size){
        content.style.height = size.height;
        content.style.width = size.width;
    }
    else{
        for(var i = 3; i < 10; i++){
            if(content.scrollHeight > content.offsetHeight || content.scrollWidth > content.offsetWidth){
                content.style.height = 50*i+'px';
                content.style.width = 100*i+'px';
            }
            else break;
        }
    };
    var docEle = doc.compatMode == 'CSS1Compat' ? doc.documentElement : doc.body;
    var mX = docEle.clientWidth-win.offsetWidth, mY = docEle.clientHeight-win.offsetHeight;
    if(mX < 0){content.style.width = parseInt(content.style.width)+mX+'px'; mX = 0};
    if(mY < 0){content.style.height = parseInt(content.style.height)+mY+'px'; mY =0};
    var hW = parseInt(win.offsetWidth/2);
    win.style.left = (pos && pos.X < mX+hW ? (pos.X > hW ? pos.X-hW : 0) : mX)+'px';
    win.style.top = (pos && pos.Y+10 < mY ? pos.Y+10 : mY)+'px';
    win.style.visibility = 'visible';
    doc.addEventListener('keydown', keyDown, false);
};

var getSel = function (w) {
    var s, d = w.document;
    if (d.selection) {
        var r = d.selection.createRange();
        s = r ? r.text : ''
    } else {
        s = d.getSelection().toString();
        if (!s) {
            var e, t = d.getElementsByTagName('textarea'), u = d.getElementsByTagName('input'), i = t.length;
            while(e = (i > 0) ? t[--i] : u[-i--])try{
                if (e.offsetHeight > 0 && (s = e.value.substring(e.selectionStart, e.selectionEnd))) break
            }catch(x){}
        }
    };
    if (!s) for (var j = 0, f; f = w.frames[j]; j++) {
        try {
            if (s = getSel(f)) break
        } catch(x) {}
    };
    return s
};

var w = content, doc = w.document, dir = 'auto|ru', lng = w.navigator.language.slice(0, 2), txt = getSel(w);
if (txt) { 
    var xhr = new XMLHttpRequest();
    var encTxt = 'text=' + encodeURIComponent(txt), post = encTxt.length > 1024, l = dir.split('|');
    var url = 'http://translate.google.com/?' + (post ? '' : encTxt + '&') + 'sl=' + l[0] + '&tl=' + l[1] + '&hl=' + lng + '&eotf=0&ujs=gtt';

    xhr.open(post ? 'POST' : 'GET', url, true);
    if(post)xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    xhr.onreadystatechange = function() {
        try{
            if (xhr.readyState == 4 && xhr.status == 200) {
                var result = '', status = '', tmp = doc.createElement('div');
                tmp.innerHTML = xhr.responseText;
                var r = tmp.querySelector('#result_box');
                if (r) result = r.innerHTML;
                var sl = tmp.querySelector('#nc_sl'), dl = tmp.querySelector('#nc_dl'), tl = tmp.querySelector('#nc_tl');
                if(sl && dl && tl){
                    status = ((dl.value || sl.value)+' -\u203A '+tl.value).toUpperCase();
                };
                ujs_createWindow(result, status, '<a href="'+url+'" target="_blank" style="display:inline;padding:0;margin:0;text-decoration:none;border:none;color:#009;font:16px Times New Roman;">Google Translate</a>', '_gt');
            }
        } catch (x){LOG(x)};
    };
    xhr.send(post ? encTxt : null);
} else {
    w.open('http://translate.google.com/translate?u='+escape(w.location.href)+'&hl='+lng+'&langpair='+dir+'&tbb=1');
};

Отсутствует

 

№531430-11-2012 16:41:00

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

Re: Custom Buttons

Lex1 большое спасибо!

Отсутствует

 

№531530-11-2012 16:50:15

Lex1
Участник
 
Группа: Members
Зарегистрирован: 07-07-2007
Сообщений: 260
UA: Firefox 17.0

Re: Custom Buttons

И вариант с показом окошка под выделенным текстом и пунктами в меню.

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

Выделить код

Код:

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%3EGoogle%20translate%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bdata%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABAAAAALCAIAAAD5gJpuAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQtJREFUKM9VkSFOhFEQg799/CjEihWAwKDgIFwAyWHgLDjuAGfZgMCQDQkG8abtQ/z8u9A0k4rOTCez2u0GB0gCsLELbCuxLduJy0zAZgOQBBqQALEbtOQoyRgjSZLt9nOaJyf5K2zPjr01SWst8ermZtzd5euLhCQ2Y9iOHXssIvZYr1f39x/T87Ourtr7O3ZUyK6KlN5HVRaOqlxcNGACJKRItigdHFXpFdXoPVWRGmSac0suRYWUWhz7zt5/BXh65Pi6Hr7rI/IopZyqpSqldLsq9onPX3iabuHYr6o3pCVHP2Sa11nIzZdnMAmOSpyejiocVEhtjrwc15L5l4HVDgReCGTR+V9n/AAByma0J+vVwwAAAABJRU5ErkJggg%3D%3D%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5B/*Initialization%20Code*/%0A%0Avar%20btn%20%3D%20this%3B%0A%0Abtn.lastClick%20%3D%20%7B%0A%20%20%20%20X%3A%200%2C%0A%20%20%20%20Y%3A%200%0A%7D%3B%0AaddEventListener%28%22mouseup%22%2C%20function%28e%29%20%7B%0A%20%20%20%20if%20%28e%20%26%26%20e.button%20%3D%3D%200%20%26%26%20e.view.top%20%3D%3D%20content%29%20%7B%0A%20%20%20%20%20%20%20%20var%20lc%20%3D%20btn.lastClick%3B%0A%20%20%20%20%20%20%20%20lc.X%20%3D%20e.clientX%3B%0A%20%20%20%20%20%20%20%20lc.Y%20%3D%20e.clientY%3B%0A%20%20%20%20%7D%0A%7D%2C%20false%29%3B%0A%0Avar%20safeHTMLParser%20%3D%20function%28code%29%20%7B%0A%20%20%20%20var%20gUnescapeHTML%20%3D%20Cc%5B%22@mozilla.org/feed-unescapehtml%3B1%22%5D.getService%28Ci.nsIScriptableUnescapeHTML%29%3B%0A%20%20%20%20var%20doc%20%3D%20document.implementation.createDocument%28xhtmlns%2C%20%22html%22%2C%20null%29%3B%0A%20%20%20%20var%20body%20%3D%20document.createElementNS%28xhtmlns%2C%20%22body%22%29%3B%0A%20%20%20%20doc.documentElement.appendChild%28body%29%3B%0A%20%20%20%20body.appendChild%28gUnescapeHTML.parseFragment%28code%2C%20false%2C%20null%2C%20body%29%29%3B%0A%20%20%20%20return%20doc%3B%0A%7D%3B%0A%0Avar%20createWindow%20%3D%20function%28text%2C%20status%2C%20title%2C%20id%2C%20pos%2C%20size%29%7B%0A%09var%20win%20%3D%20content%2C%20doc%20%3D%20win.document%2C%20wId%20%3D%20%27ujs_window%27+%28id%20%7C%7C%20%27%27%29%2C%20w%20%3D%20doc.getElementById%28wId%29%3B%0A%09var%20keyDown%20%3D%20function%28e%29%7Bif%28%21e.shiftKey%20%26%26%20%21e.ctrlKey%20%26%26%20%21e.altKey%20%26%26%20e.keyCode%20%3D%3D%2027%29doc.getElementById%28wId%29.closeWin%28%29%7D%3B%0A%09if%28w%29w.closeWin%28%29%3B%0A%09w%20%3D%20doc.createElement%28%27div%27%29%3B%0A%09w.setAttribute%28%27style%27%2C%20%27position%3Afixed%3Bdisplay%3Ablock%3Bvisibility%3Ahidden%3Bleft%3A0%3Btop%3A0%3Bwidth%3Aauto%3Bheight%3Aauto%3Bborder%3A1px%20solid%20gray%3Bpadding%3A3px%3Bmargin%3A0%3Bz-index%3A99999%3Boverflow%3Ahidden%3Bcursor%3Amove%3B%27+%28typeof%20w.style.borderRadius%20%3D%3D%3D%20%27string%27%20%3F%20%27background-color%3A%23f3f5f7%3Bpadding-top%3A4px%3Bborder-radius%3A4px%3Bbox-shadow%3A0%200%2012px%20rgba%280%2C0%2C0%2C.4%29%3B%27%20%3A%20%27background%3A-o-skin%28%22Window%20Skin%22%29%3B%27%29%29%3B%0A%09w.id%20%3D%20wId%3B%0A%09w.closeWin%20%3D%20function%28%29%7B%0A%09%09doc.removeEventListener%28%27keydown%27%2C%20keyDown%2C%20false%29%3B%0A%09%09this.parentNode.removeChild%28this%29%3B%0A%09%7D%3B%0A%09w.addEle%20%3D%20function%28str%2C%20style%29%7B%0A%09%09var%20ele%20%3D%20doc.createElement%28%27div%27%29%3B%0A%09%09ele.setAttribute%28%27style%27%2C%20style%29%3B%0A%09%09if%28str%29%7B%0A%09%09%09ele.innerHTML%20%3D%20str%3B%0A%09%09%09for%28var%20el%2C%20all%20%3D%20ele.getElementsByTagName%28%27*%27%29%2C%20i%20%3D%20all.length%3B%20i--%3B%29%7B%0A%09%09%09%09el%20%3D%20all%5Bi%5D%3B%0A%09%09%09%09if%28/%5E%28script%7Cframe%7Ciframe%7Capplet%7Cembed%7Cobject%29%24/i.test%28el.nodeName%29%29%7B%0A%09%09%09%09%09el.parentNode.removeChild%28el%29%3B%0A%09%09%09%09%7Delse%7B%0A%09%09%09%09%09for%28var%20att%20%3D%20el.attributes%2C%20j%20%3D%20att.length%3B%20j--%3B%29%7B%0A%09%09%09%09%09%09if%28/%5Eon%5Ba-z%5D+%24/i.test%28att%5Bj%5D.name%29%29att%5Bj%5D.value%20%3D%20%27%27%3B%0A%09%09%09%09%09%7D%0A%09%09%09%09%7D%0A%09%09%09%7D%0A%09%09%7D%3B%0A%09%09return%20this.appendChild%28ele%29%3B%0A%09%7D%3B%0A%09var%20img%20%3D%20doc.createElement%28%27div%27%29%3B%0A%09img.setAttribute%28%27style%27%2C%20%27display%3Ablock%3Bfloat%3Aright%3Bwidth%3A18px%3Bheight%3A18px%3Bpadding%3A0%3Bmargin%3A0%3Bborder%3Anone%3Bcursor%3Apointer%3Bbackground-image%3Aurl%28%22data%3Aimage/png%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAABIAAAASCAQAAAD8x0bcAAAAZElEQVR42mNgGNyAGQixsVGU/AdCXjCbHczmxKaMFywlAlWiw6DAwIZNmQhYGqJEDWoqFiAGVmKKTwk73CRJ/Ep0GIyhbsPpO4hbIG4TwKaMk0EZ7hYBBk1cvmNDEmbDrmSwAADE8h10+qICXwAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAAASUVORK5CYII%3D%22%29%3Bbackground%3A-o-skin%28%22Caption%20Close%20Button%20Skin%22%29%3B%27%29%3B%0A%09img.title%20%3D%20%28win.navigator.language.indexOf%28%27ru%27%29%20%3D%3D%200%29%20%3F%20%27%5Cu0417%5Cu0430%5Cu043A%5Cu0440%5Cu044B%5Cu0442%5Cu044C%27%20%3A%20%27Close%27%3B%0A%09img.addEventListener%28%27click%27%2C%20function%28%29%7Bthis.parentNode.closeWin%28%29%7D%2C%20false%29%3B%0A%09w.appendChild%28img%29%3B%0A%09w.addEle%28title%2C%20%27display%3Atable%3Bcolor%3A%23000%3Bfont%3A16px%20Times%20New%20Roman%3Bwidth%3Aauto%3Bheight%3Aauto%3Bpadding%3A0%3Bmargin%3A0%202px%3Bcursor%3Atext%3B%27%29%3B%0A%09var%20cnt%20%3D%20w.addEle%28text%2C%20%27display%3Ablock%3Bborder%3A1px%20solid%20%23aaa%3Bmargin%3A2px%200%201px%200%3Bpadding%3A4px%3Bbackground-color%3A%23fafcfe%3Bcolor%3A%23000%3Bfont%3A14px%20Times%20New%20Roman%3Bwidth%3A240px%3Bheight%3A120px%3Boverflow%3Aauto%3Bcursor%3Atext%3B%27%29%3B%0A%09w.addEle%28status%2C%20%27display%3Atable%3Bcolor%3A%23555%3Bfont%3A10px%20Times%20New%20Roman%3Bwidth%3Aauto%3Bheight%3Aauto%3Bpadding%3A0%3Bmargin%3A0%202px%3Bcursor%3Atext%3B%27%29%3B%0A%09w.addEventListener%28%27mousedown%27%2C%20function%28e%29%7B%0A%09%09if%28e.target%20%3D%3D%20w%29%7B%0A%09%09%09e.preventDefault%28%29%3B%0A%09%09%09var%20grabX%20%3D%20e.clientX%2C%20grabY%20%3D%20e.clientY%2C%20origX%20%3D%20parseInt%28w.style.left%29%2C%20origY%20%3D%20parseInt%28w.style.top%29%3B%0A%09%09%09var%20mouseMove%20%3D%20function%28ev%29%7B%0A%09%09%09%09w.style.left%20%3D%20origX+ev.clientX-grabX+%27px%27%3B%0A%09%09%09%09w.style.top%20%3D%20origY+ev.clientY-grabY+%27px%27%3B%0A%09%09%09%7D%3B%0A%09%09%09doc.addEventListener%28%27mousemove%27%2C%20mouseMove%2C%20false%29%3B%0A%09%09%09doc.addEventListener%28%27mouseup%27%2C%20function%28%29%7Bdoc.removeEventListener%28%27mousemove%27%2C%20mouseMove%2C%20false%29%7D%2C%20false%29%3B%0A%09%09%7D%0A%09%7D%2C%20false%29%3B%0A%09doc.documentElement.appendChild%28w%29%3B%0A%0A%09if%28size%29%7B%0A%09%09cnt.style.height%20%3D%20size.height%3B%0A%09%09cnt.style.width%20%3D%20size.width%3B%0A%09%7Delse%7B%0A%09%09for%28var%20i%20%3D%203%3B%20i%20%3C%2010%3B%20i++%29%7B%0A%09%09%09if%28cnt.scrollHeight%20%3E%20cnt.offsetHeight%20%7C%7C%20cnt.scrollWidth%20%3E%20cnt.offsetWidth%29%7B%0A%09%09%09%09cnt.style.height%20%3D%2050*i+%27px%27%3B%0A%09%09%09%09cnt.style.width%20%3D%20100*i+%27px%27%3B%0A%09%09%09%7Delse%20break%3B%0A%09%09%7D%0A%09%7D%3B%0A%09var%20docEle%20%3D%20doc.compatMode%20%3D%3D%20%27CSS1Compat%27%20%3F%20doc.documentElement%20%3A%20doc.body%3B%0A%09var%20mX%20%3D%20docEle.clientWidth-w.offsetWidth%2C%20mY%20%3D%20docEle.clientHeight-w.offsetHeight%3B%0A%09if%28mX%20%3C%200%29%7Bcnt.style.width%20%3D%20parseInt%28cnt.style.width%29+mX+%27px%27%3B%20mX%20%3D%200%7D%3B%0A%09if%28mY%20%3C%200%29%7Bcnt.style.height%20%3D%20parseInt%28cnt.style.height%29+mY+%27px%27%3B%20mY%20%3D0%7D%3B%0A%09var%20hW%20%3D%20parseInt%28w.offsetWidth/2%29%3B%0A%09w.style.left%20%3D%20%28pos%20%26%26%20pos.X%20%3C%20mX+hW%20%3F%20%28pos.X%20%3E%20hW%20%3F%20pos.X-hW%20%3A%200%29%20%3A%20mX%29+%27px%27%3B%0A%09w.style.top%20%3D%20%28pos%20%26%26%20pos.Y+10%20%3C%20mY%20%3F%20pos.Y+10%20%3A%20mY%29+%27px%27%3B%0A%09w.style.visibility%20%3D%20%27visible%27%3B%0A%09doc.addEventListener%28%27keydown%27%2C%20keyDown%2C%20false%29%3B%0A%7D%3B%0A%0Avar%20getSel%20%3D%20function%20%28w%29%20%7B%0A%20%20%20%20var%20s%2C%20d%20%3D%20w.document%3B%0A%20%20%20%20if%20%28d.selection%29%20%7B%0A%20%20%20%20%20%20%20%20var%20r%20%3D%20d.selection.createRange%28%29%3B%0A%20%20%20%20%20%20%20%20s%20%3D%20r%20%3F%20r.text%20%3A%20%27%27%0A%20%20%20%20%7D%20else%20%7B%0A%09%09s%20%3D%20d.getSelection%28%29.toString%28%29%3B%0A%09%09if%20%28%21s%29%20%7B%0A%09%09%09var%20e%2C%20t%20%3D%20d.getElementsByTagName%28%27textarea%27%29%2C%20u%20%3D%20d.getElementsByTagName%28%27input%27%29%2C%20i%20%3D%20t.length%3B%0A%09%09%09while%28e%20%3D%20%28i%20%3E%200%29%20%3F%20t%5B--i%5D%20%3A%20u%5B-i--%5D%29try%7B%0A%09%09%09%09if%20%28e.offsetHeight%20%3E%200%20%26%26%20%28s%20%3D%20e.value.substring%28e.selectionStart%2C%20e.selectionEnd%29%29%29%20break%0A%09%09%09%7Dcatch%28x%29%7B%7D%0A%09%09%7D%0A%09%7D%3B%0A%20%20%20%20if%20%28%21s%29%20for%20%28var%20j%20%3D%200%2C%20f%3B%20f%20%3D%20w.frames%5Bj%5D%3B%20j++%29%20%7B%0A%20%20%20%20%20%20%20%20try%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20%28s%20%3D%20getSel%28f%29%29%20break%0A%20%20%20%20%20%20%20%20%7D%20catch%28x%29%20%7B%7D%0A%20%20%20%20%7D%3B%0A%20%20%20%20return%20s%0A%7D%3B%0A%0Avar%20ujs_google_translate%20%3D%20function%20%28dir%29%7B%0A%20%20%20%20var%20win%20%3D%20content%2C%20lng%20%3D%20win.navigator.language.slice%280%2C%202%29%2C%20txt%20%3D%20getSel%28win%29%3B%0A%20%20%20%20if%20%28txt%29%20%7B%20%0A%20%20%20%20%20%20%20%20var%20xhr%20%3D%20new%20XMLHttpRequest%28%29%3B%0A%20%20%20%20%20%20%20%20var%20encTxt%20%3D%20%27text%3D%27%20+%20encodeURIComponent%28txt%29%2C%20post%20%3D%20encTxt.length%20%3E%201024%2C%20l%20%3D%20dir.split%28%27%7C%27%29%3B%0A%20%20%20%20%20%20%20%20var%20url%20%3D%20%27http%3A//translate.google.com/%3F%27%20+%20%28post%20%3F%20%27%27%20%3A%20encTxt%20+%20%27%26%27%29%20+%20%27sl%3D%27%20+%20l%5B0%5D%20+%20%27%26tl%3D%27%20+%20l%5B1%5D%20+%20%27%26hl%3D%27%20+%20lng%20+%20%27%26eotf%3D0%26ujs%3Dgtt%27%3B%0A%0A%20%20%20%20%20%20%20%20xhr.open%28post%20%3F%20%27POST%27%20%3A%20%27GET%27%2C%20url%2C%20true%29%3B%0A%20%20%20%20%20%20%20%20if%28post%29xhr.setRequestHeader%28%27Content-Type%27%2C%20%27application/x-www-form-urlencoded%27%29%3B%0A%20%20%20%20%20%20%20%20xhr.onreadystatechange%20%3D%20function%28%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20try%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28xhr.readyState%20%3D%3D%204%20%26%26%20xhr.status%20%3D%3D%20200%29%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20result%20%3D%20%27%27%2C%20status%20%3D%20%27%27%2C%20tmp%20%3D%20safeHTMLParser%28xhr.responseText%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20r%20%3D%20tmp.querySelector%28%27%23result_box%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%28r%29%20result%20%3D%20r.innerHTML%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var%20sl%20%3D%20tmp.querySelector%28%27%23nc_sl%27%29%2C%20dl%20%3D%20tmp.querySelector%28%27%23nc_dl%27%29%2C%20tl%20%3D%20tmp.querySelector%28%27%23nc_tl%27%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%28sl%20%26%26%20dl%20%26%26%20tl%29%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20status%20%3D%20%28%28dl.value%20%7C%7C%20sl.value%29+%27%20-%5Cu203A%20%27+tl.value%29.toUpperCase%28%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20createWindow%28result%2C%20status%2C%20%27%3Ca%20href%3D%22%27+url.replace%28/%26/g%2C%27%26amp%3B%27%29+%27%22%20target%3D%22_blank%22%20style%3D%22display%3Ainline%3Bpadding%3A0%3Bmargin%3A0%3Btext-decoration%3Anone%3Bborder%3Anone%3Bcolor%3A%23009%3Bfont%3A16px%20Times%20New%20Roman%3B%22%3EGoogle%20Translate%3C/a%3E%27%2C%20%27_gt%27%2C%20btn.lastClick%29%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%20catch%20%28x%29%7B%7D%3B%0A%20%20%20%20%20%20%20%20%7D%3B%0A%20%20%20%20%20%20%20%20xhr.send%28post%20%3F%20encTxt%20%3A%20null%29%3B%0A%20%20%20%20%7D%20else%20%7B%0A%20%20%20%20%20%20%20%20win.open%28%27http%3A//translate.google.com/translate%3Fu%3D%27+escape%28win.location.href%29+%27%26hl%3D%27+lng+%27%26langpair%3D%27+dir+%27%26tbb%3D1%27%29%3B%0A%20%20%20%20%7D%3B%0A%7D%3B%0A%0A%0Abtn.onclick%20%3D%20function%28e%29%7Bif%28e.button%20%3D%3D%200%29ujs_google_translate%28%27auto%7Cru%27%29%7D%3B%0A%0Avar%20contextMenu%20%3D%20document.getElementById%28%22contentAreaContextMenu%22%29%3B%0Avar%20nextEleMenu%20%3D%20document.getElementById%28%22context-inspect%22%29%3B%0A%0Avar%20menuId%20%3D%20%22context-ext-google-translate%22%3B%0Avar%20menuItem%20%3D%20document.getElementById%28menuId%29%3B%0Aif%20%28menuItem%29%20%7B%0A%20%20%20%20contextMenu.removeChild%28menuItem.nextElementSibling%29%3B%0A%20%20%20%20contextMenu.removeChild%28menuItem.nextElementSibling%29%3B%0A%20%20%20%20contextMenu.removeChild%28menuItem%29%3B%0A%7D%3B%0A%0AmenuItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0AmenuItem.setAttribute%28%22id%22%2C%20menuId%29%3B%0AmenuItem.setAttribute%28%22label%22%2C%20%22%u041F%u0435%u0440%u0435%u0432%u0435%u0441%u0442%u0438%20%u043D%u0430%20%u0440%u0443%u0441%u0441%u043A%u0438%u0439%22%29%3B%0AmenuItem.addEventListener%28%22command%22%2C%20function%28%29%7Bujs_google_translate%28%27auto%7Cru%27%29%7D%2C%20false%29%3B%0AcontextMenu.insertBefore%28menuItem%2C%20nextEleMenu%29%3B%0A%0AmenuItem%20%3D%20document.createElement%28%22menuitem%22%29%3B%0AmenuItem.setAttribute%28%22label%22%2C%20%22%u041F%u0435%u0440%u0435%u0432%u0435%u0441%u0442%u0438%20%u043D%u0430%20%u0430%u043D%u0433%u043B%u0438%u0439%u0441%u043A%u0438%u0439%22%29%3B%0AmenuItem.addEventListener%28%22command%22%2C%20function%28%29%7Bujs_google_translate%28%27auto%7Cen%27%29%7D%2C%20false%29%3B%0AcontextMenu.insertBefore%28menuItem%2C%20nextEleMenu%29%3B%0A%0AcontextMenu.insertBefore%28document.createElement%28%22menuseparator%22%29%2C%20nextEleMenu%29%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

Отредактировано Lex1 (01-12-2012 00:10:20)

Отсутствует

 

№531630-11-2012 17:06:01

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

Re: Custom Buttons

Kiril__777 пишет

чем  и как лучше передвигать пункты меню, с помощью DOM инспектора, стилей или расширений типа menumanipulator?

В теме стилий, или Stylish спрашивай.

Отсутствует

 

№531730-11-2012 23:34:29

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

Re: Custom Buttons

Для любителей засовывать кучу разных кодов в инициализацию одной кнопки:
Для Firefox 4 и новее:

Выделить код

Код:

var _destructors = [];
Object.defineProperty(this, "onDestroy", {
    get: function() {
        return function() {
            var args = arguments;
            _destructors.forEach(function(destructor) {
                try {
                    destructor.apply(this, args);
                }
                catch(e) {
                    Components.utils.reportError(e);
                }
            }, this);
        };
    },
    set: function(f) {
        _destructors.push(f);
    },
    configurable: true,
    enumerable: true
});


Для старых версий:

Выделить код

Код:

var _destructors = [];
this.__defineGetter__("onDestroy", function() {
    return function() {
        var args = arguments;
        _destructors.forEach(function(destructor) {
            try {
                destructor.apply(this, args);
            }
            catch(e) {
                Components.utils.reportError(e);
            }
        }, this);
    };
});
this.__defineSetter__("onDestroy", function(f) {
    _destructors.push(f);
});


Для проверки:

Выделить код

Код:

this.onDestroy = function(reason) {
    LOG("onDestroy #1 " + reason);
};
this.onDestroy = function(reason) {
    LOG("onDestroy #2 " + reason);
};
this.onDestroy = function(reason) {
    LOG("onDestroy #3 " + reason);
};

P.S. А еще в новых версиях будет addDestructor().

Добавлено 10-09-2013 12:02:40
Обновленный пример: code_snippets#mergeinitializationjs

Отредактировано Infocatcher (10-09-2013 12:02:40)


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

Отсутствует

 

№531801-12-2012 02:24:47

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

Re: Custom Buttons

Infocatcher
Как этими кодами пользоваться, пожалуйста объясни?

Отсутствует

 

№531901-12-2012 13:57:16

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

Re: Custom Buttons

bunda1

Вот как мне кажется
Допустим есть кнопка, у которой в Инициализации много разных кодов.

Как ведь раньше было:
каждый следующий код содержащий this.onDestroy = ...
уничтожал this.onDestroy предыдущего и заменял своим.

А теперь:
Ставишь первый код в самое начало Инициализации кнопки, и тогда
каждая функция this.onDestroy от каждого кода
бережно сохраняется в массивчик и все они будут поочереди вызваны,
когда наступит ситуация.

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


Infocatcher
Круто. Как всегда.

Отсутствует

 

№532001-12-2012 14:44:00

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

Re: Custom Buttons

Dumby пишет

Вот как мне кажется

Да, все верно.

И, пожалуй, лучше заменить

Выделить код

Код:

_destructors.forEach(function(destructor) {
                destructor.apply(this, args);
            }, this);

на

Выделить код

Код:

_destructors.forEach(function(destructor) {
                try {
                    destructor.apply(this, args);
                }
                catch(e) {
                    Components.utils.reportError(e);
                }
            }, this);

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

Отсутствует

 

№532101-12-2012 17:45:24

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

Re: Custom Buttons

Dumby
Спасибо за разъяснения. Эх, но почему я раньше не знал что this.onDestroy уничтожает предыдущий this.onDestroy. Я же везде у своих кодов писал:

Не обязательно создавать новую CB кнопку, можно использовать уже существующую.

Добавлено 01-12-2012 17:50:35
Спасыбо Infocatcher за код.

Отредактировано bunda1 (01-12-2012 17:50:35)

Отсутствует

 

№532202-12-2012 12:44:15

manuk
Участник
 
Группа: Members
Зарегистрирован: 17-10-2010
Сообщений: 306
UA: Firefox 17.0

Re: Custom Buttons

Можно ли сделать кнопку переключения dom.ipc.plugins.enabled

Отсутствует

 

№532302-12-2012 16:04:04

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

Re: Custom Buttons

manuk пишет

Можно ли сделать кнопку переключения dom.ipc.plugins.enabled

Выделить код

Код:

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%3E%u041F%u0435%u0440%u0435%u043A%u043B%u044E%u0447%u0438%u0442%u044C%20plugin-container%3C/name%3E%0A%20%20%3Cimage%3E%3C%21%5BCDATA%5Bchrome%3A//mozapps/skin/plugins/notifyPluginBlocked.png%5D%5D%3E%3C/image%3E%0A%20%20%3Cmode%3E0%3C/mode%3E%0A%20%20%3Cinitcode%3E%3C%21%5BCDATA%5Bconst%20s%20%3D%20%22dom.ipc.plugins.enabled%22%3B%0Aconst%20imgTrue%20%3D%20%22chrome%3A//mozapps/skin/plugins/pluginGeneric-16.png%22%3B%0Aconst%20imgFalse%20%3D%20%22chrome%3A//mozapps/skin/plugins/notifyPluginBlocked.png%22%3B%0A%0Avar%20button%20%3D%20this%3B%0Avar%20pref%20%3D%20Application.prefs.get%28s%29%3B%0A%0Athis.onclick%20%3D%20function%28e%29%20%7B%0A%20%20%20%20if%28e.button%29%20return%3B%0A%20%20%20%20pref.value%20%3D%20%21pref.value%3B%0A%7D%0A%0Afunction%20toggleImage%28%29%20%7B%0A%20%20%20%20button.image%20%3D%20pref.value%3F%20imgTrue%20%3A%20imgFalse%3B%0A%7D%0AtoggleImage%28%29%3B%0A%0Apref.events.addListener%28%22change%22%2C%20toggleImage%2C%20false%29%3B%0Athis.onDestroy%20%3D%20function%28%29%20%7B%0A%20%20%20%20pref.events.removeListener%28%22change%22%2C%20toggleImage%2C%20false%29%3B%0A%7D%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

Но нужен рестарт чтобы изменения вступили в силу.

Отредактировано bunda1 (02-12-2012 19:21:01)

Отсутствует

 

№532402-12-2012 16:23:28

manuk
Участник
 
Группа: Members
Зарегистрирован: 17-10-2010
Сообщений: 306
UA: Firefox 17.0

Re: Custom Buttons

bunda1, не работает... И после рестарта.

Отсутствует

 

№532502-12-2012 16:36:59

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

Re: Custom Buttons

manuk
Работает, я проверял. Ты что то делаешь не правильно или у тебя эта настройка в user.js есть.

Отсутствует

 

Board footer

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