Подскажите шаблон кнопки которая содержит выпадающее меню через которое можно внести изменения в about:confg. Хочу иметь возможность быстрого переключения "родных" языков ФФ через intl.accept_languages.
Спасибо.
Отсутствует
Подскажите шаблон кнопки которая содержит выпадающее меню через которое можно внести изменения в about:confg. Хочу иметь возможность быстрого переключения "родных" языков ФФ через intl.accept_languages.
Спасибо.
var s = 'intl.accept_languages', pref = Application.prefs.get(s), value1 = 'ru,en,en-us', value2 = 'lv,ia'; this.onclick = function(e) { if ( e.button == 0) { pref.value = (pref.value == value1) ? value2 : value1; } }; function toggleImage() { var icon = self.ownerDocument.getAnonymousElementByAttribute( self, "class", "toolbarbutton-icon"); icon.src = (pref.value == value1) ? self.image : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAA3NCSVQICAjb4U/gAAAAD1BMVEUfact50/fF+v/M//////8mt18DAAAABXRSTlP/////APu2DlMAAAAJcEhZcwAACvAAAArwAUKsNJgAAAAgdEVYdFNvZnR3YXJlAE1hY3JvbWVkaWEgRmlyZXdvcmtzIE1Yu5EqJAAAADhJREFUeJxjcHFgAAIXFwYXB2NjYwYWEMNQUJCZAcYwYIEwGBigDEFhDIYQ+QygpUZKIAbIGQwsANX+EGaBLn8yAAAAAElFTkSuQmCC'; }; toggleImage(); gPrefService.addObserver( s, toggleImage, false ); addDestructor(function() { gPrefService.removeObserver( s, toggleImage, false ) });
Отсутствует
villa7
Готовые кнопки для Custom Buttons | Форум Mozilla Россия | Текстовые смайлы 2 Самый простой вариант
Отсутствует
Перерыл, но так ничего не нашёл, нужно вставлять на сайте подобные коды
Пробовал подставить в BB Color Menu не вышло, может кто подскажет как, или другую какую кнопку посоветует, или ещё что нибудь, только не расширение. Спасибо.
Где то я подобную кнопку делал но не могу найти. Смотрю у тебя там текст в несколько строк, это обязательно?
Отсутствует
bunda1
Может пригодится для конвертирования текста чтобы вставить как строку JS
oneLine выставить в true
выделить текст или открыть текстовый файл во вкладки или скопировать текст в буфер обмена и нажать кнопку.
// CSS to JS string - 2014-01-11v13 // CB code 'use strict'; let qout = 0; // 0 - ' - одинарные // 1 - " - двойные let new_line = '\\n'; // \\n // \\r\\n let editor_new_line = 'auto'; // auto // \n // \r\n let converter = 0; // 0 - js // 1 - regexp let oneLine = false; // true - результат в одну строку // только для converter: 0 (js) let selectedText = content.getSelection(); if (typeof selectedText == 'object') { if (selectedText.anchorNode && selectedText.anchorNode.parentNode.nodeName.toLowerCase() == 'pre') { let range = selectedText.getRangeAt(0); selectedText = range.toString(); } else selectedText = selectedText.toString(); } if (selectedText) { convertCode(selectedText); } else if (content.document && /^(text\/(css|plain))$/.test(content.document.contentType)) { let codes = [content.document.body.textContent]; if (!codes) return; codes.forEach(convertCode); } else { let cb = gClipboard.read(); if (cb) convertCode(cb); } function convertCode(str) { if (!str) return; let type; if (str.indexOf('\r\n') != -1) { type = 'win'; } else if (str.indexOf('\r') != -1) { type = 'mac'; } else { type = 'nix'; } let lastNewLine = (type == 'nix') ? '\n' : '\r'; if (editor_new_line == 'auto') { editor_new_line = lastNewLine; } let output = ''; let q = (qout === 0) ? '\'' : '"'; if (converter === 0) { let arr = []; let last = 0; let index = 0; let tmp = str; let step = (type == 'win') ? 2 : 1; while (tmp) { tmp = tmp.substring(last); index = tmp.indexOf(lastNewLine); if (index === -1) { arr.push(tmp.substring(0)); break; } arr.push(tmp.substring(0, index)); last = index + step; } if (oneLine) { output += q; for (let i = 0; i < arr.length; i++) { output += arr[i] + new_line; } output += q; } else { for (let i = 0; i < arr.length; i++) { output += q + arr[i] + new_line + q; if (i != arr.length-1) output += ' +'; output += editor_new_line; } } } else { let pat = (type == 'win') ? '\\r\\n' : (type == 'mac') ? '\\r' : '\\n'; let re = new RegExp('^([^' + pat + ']*)(' + pat + '|$)', 'gm'); output = str.replace(re, q + '$1' + new_line + q + ' +' + editor_new_line) .replace(/(\s+$)/g, '') .replace(/(\s\+$)/g, ''); } out(output); } function out(s) { let uri = 'data:text/plain;charset=utf-8,' + encodeURIComponent(s); gBrowser.selectedTab = gBrowser.addTab(uri, makeURI('about:blank')); }
Отредактировано 2k1dmg (11-01-2014 17:48:27)
Отсутствует
bunda1
Прослушка -
<object><embed src="http://akotha.narod.ru/akp/play.swf?mp3=http://rghost.ru/download/action/НОМЕР_ФАЙЛА/mp3" width="200" height="20" type="application/x-shockwave-flash" /></object>
нет, можно и в одну.
SendInfo
Я пробовал в разные подставлять, но где то "" в коде не дают подставить, где то ещё что.
Отредактировано villa7 (11-01-2014 18:25:41)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Я хочу сделать, чтобы на этом форуме внешние ссылки открывались в новых вкладках. Взял EventListener который предложил bunda1 и сделал код
addEventListener("TabAttrModified", function() { if (content.location.host==="forum.mozilla-russia.org"){ var lnk=content.document.getElementsByTagName('A'); for (i=0; i<lnk.length; i++) { if (lnk[i].href.indexOf('forum.mozilla-russia.org') == -1) lnk[i].setAttribute("target", "_blank") } } }, true, gBrowser.tabContainer );
По сути, код перебирает все ссылки на странице. Хотелось бы знать, от этого он получился "тяжёлый"?
Что-то мне кажется после его добавления браузер стал притормаживать.
Отсутствует
Я хочу сделать, чтобы на этом форуме внешние ссылки открывались в новых вкладках. Взял EventListener который предложил bunda1 и сделал код
Хотелось бы знать, от этого он получился "тяжёлый"?
Что-то мне кажется после его добавления браузер стал притормаживать.
Я думаю не должен притормаживать, но быстрее будет если заменить:
на:
Отредактировано bunda1 (11-01-2014 20:50:53)
Отсутствует
заменить на if (lnk[i].host = 'forum.mozilla-russia.org')
Заменил, только добавил ! перед =
И на всякий случай переделал EventListener. Теперь код выглядит так
addEventListener('DOMContentLoaded', function(){ if (content.location.host==="forum.mozilla-russia.org"){ var lnk=content.document.getElementsByTagName('A'); for (i=0; i<lnk.length; i++) { if (lnk[i].host != 'forum.mozilla-russia.org') lnk[i].setAttribute("target", "_blank") } } }, true, gBrowser)
Посмотрю как будет.
А куда воткнуть алертслайд, после строчки lnk[i].setAttribute("target", "_blank")?
Kогда он должен вылезать, каждый раз, когда ссылке присваивается атрибут target="_blank"?
И почему EventListener надо на DOMContentLoaded а не просто на load?
Отредактировано Чайник (11-01-2014 21:14:25)
Отсутствует
А куда воткнуть алертслайд, после строчки lnk[i].setAttribute("target", "_blank")?
Kогда он должен вылезать, каждый раз, когда ссылке присваивается атрибут target="_blank"?
И почему EventListener надо на DOMContentLoaded а не просто на load?
Можно и load, даже луче. Но и load и DOMContentLoaded не помогут если после восстановлении сессии переключится на уже загруженную вкладку с нашим форумом.
Отсутствует
Можно и load, даже луче. Но и load и DOMContentLoaded не помогут если после восстановлении сессии переключится на уже загруженную вкладку с нашим форумом.
То есть лучше всего оставить как было - TabAttrModified - это оптимальный вариант?
А то, что код перебирает все ссылки на странице, не сильно его утяжеляет?
okkamas_knife насчёт применения слайда для отладки - однозначно в копилку, оказывается полезная штука
Отсутствует
Я не много ошибся, нужно:
Ну если ты открываешь ссылки кликом то наверно будет более производительно добавлять ("target", "_blank") по клику или просто открывать в новой вкладке то что нужно.
Добавлено 11-01-2014 22:21:16
Иначе TabAttrModified - оптимальный вариант.
Добавлено 11-01-2014 22:23:21
function handleClick(e) { if ( e.button == 0 && content.location.host == "forum.mozilla-russia.org" ) { var url = XULBrowserWindow.overLink; if ( !url || url.startsWith("javascript") || url.match(/:\/\/(.[^/]+)/)[1] == "forum.mozilla-russia.org" ) return; gBrowser.loadOneTab( url, {relatedToCurrent: true, inBackground: true, referrerURI: makeURI(content.location.href)} ); } }; addEventListener('click', handleClick, true, gBrowser );
Отредактировано bunda1 (11-01-2014 22:23:21)
Отсутствует
Выделить кодКод:
function handleClick(e) { if ( e.button == 0 && content.location.host == "forum.mozilla-russia.org" ) { var url = XULBrowserWindow.overLink; if ( !url || url.startsWith("javascript") || url.match(/:\/\/(.[^/]+)/)[1] == "forum.mozilla-russia.org" ) return; gBrowser.loadOneTab( url, {relatedToCurrent: true, inBackground: true, referrerURI: makeURI(content.location.href)} ); } }; addEventListener('click', handleClick, true, gBrowser );
Код получился отличный! Но для меня удобнее если у ссылки будет атрибут target="_blank" - тогда ссылка выделяется цветом (в стилях у меня прописано a:hover...)
Т. е. я подвожу к ссылке курсор и уже вижу где она откроется.
Я подумал, а что если в моём коде заменить
if (lnk[i].host !== 'forum.mozilla-russia.org') lnk[i].setAttribute("target", "_blank")
на
if (lnk[i].host !== 'forum.mozilla-russia.org') lnk[i].onmouseover=function(){this.setAttribute("target", "_blank")}
чтобы атрибут присваивался не всем внешним ссылкам скопом, а только той которая под курсором. Это даст какой-то выигрыш?
Отсутствует
чтобы атрибут присваивался не всем внешним ссылкам скопом, а только той которая под курсором. Это даст какой-то выигрыш?
Выигрыша не будет потому что код все равно проверит все ссылки на странице и что то к ним добавит.
Отсутствует
а если такой вариант?
ставим листенер на смену урлбара и проверяем текущий адрес
если это форум то запускаем листенер на маузовер и по маузоверу добавляем таргет бланк(проверив ссылку ессно)
если это не форум то убиваем листенер маузовера и ничего не делаем.
Я не вникал в принцип работы листенера на смену урлбара, а просто тупо скопировал его код из сниппетов. Вот что у меня получилось
var myExt_urlBarListener = { 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; }, onLocationChange: function(aProgress, aRequest, aURI) { setTimeout(urlbarvaluechanged, 300); }, onStateChange: function(a, b, c, d) {}, onProgressChange: function(a, b, c, d, e, f) {}, onStatusChange: function(a, b, c, d) {}, onSecurityChange: function(a, b, c) {} }; gBrowser.addProgressListener(myExt_urlBarListener,Components.interfaces.nsIWebProgress.NOTIFY_LOCATION); function urlbarvaluechanged(){ if ( content.location.host === "forum.mozilla-russia.org" ) { content.document.addEventListener('mouseover', function setAttr(e){ if(e.target.tagName=='A' && e.target.host !== 'forum.mozilla-russia.org') e.target.setAttribute("target", "_blank") }) } else content.document.removeEventListener('mouseover', setAttr) }
Отсутствует
Работает!
Этот код должен быть легче моего предыдущего с TabAttrModified или с DOMContentLoaded?
Кстати, из листенера на смену урлбара ничего не надо удалять, а то я ведь целиком скопировал один к одному?
Отсутствует
Работает!
Этот код должен быть легче моего предыдущего с TabAttrModified или с DOMContentLoaded?
Кстати, из листенера на смену урлбара ничего не надо удалять, а то я ведь целиком скопировал один к одному?
Не легче предыдущего:
1. в коде ошибка else content.document.removeEventListener('mouseover', setAttr) не видит функцию setAttr и вообще не нужен, всегда смотри в консоль ошибок,
2. при открытии настройки панелей и тп. обработчик gBrowser.addProgressListener будет бесконечно дублироваться и запускать многократно функцию setAttr, что бы избежать этого нужен деструктор addDestructor и удаление лишнего обработчика, используя для этого removeProgressListener
var progressListener = { onLocationChange: function(aWebProgress, aRequest, aFlag, aStatus) { LOG("1"); }}; gBrowser.addProgressListener( progressListener ); addDestructor(function() { gBrowser.removeProgressListener( progressListener ) });
3. обработчик content.document.addEventListener('mouseover', function setAttr(e){.. при каждой переключении на вкладку нашего форума тоже будет дублироватся,
4. такой код поменяет цвет внешние ссылок на форуме только при наведении курсора, кажется для тебя это важно,
5. ну и так далее.
Отредактировано bunda1 (12-01-2014 20:48:55)
Отсутствует
в коде ошибка else content.document.removeEventListener('mouseover', setAttr) не видит функцию setAttr и вообще не нужен, всегда смотри в консоль ошибок,
Я видел в консоли "setAttr is not defined".
А почему else content.document.removeEventListener('mouseover', setAttr) не видит функцию (сейчас речь не о том, нужен он или нет), в чём тут ошибка?
***********************************************************
Не легче предыдущего:
1.
2.
3.
4.
5.
Короче, учитывая всё сказанное, не стоило огород городить? Разумнее оставаться с листенером TabAttrModified как было изначально?
Отредактировано Чайник (12-01-2014 21:52:54)
Отсутствует
Я видел в консоли "setAttr is not defined".
А почему не видит функцию (сейчас речь не о том, нужен он или нет), в чём тут ошибка?
Короче, учитывая всё сказанное, не стоило огород городить? Разумнее оставаться с листенером TabAttrModified как было изначально?
Почему не видит не знаю. Я думаю что можно оставаться с листенером TabAttrModified, заодно из него можно другие полезные коды запускать.
Добавлено 12-01-2014 22:12:32
ну дык подскажи как избежать это.
насчет деструктора и панели - можешь написать дополнение к коду что в сниппетах чтоб он был корректный? а я поправлю сниппет
Завтра.
Отредактировано bunda1 (12-01-2014 22:12:59)
Отсутствует
А почему else content.document.removeEventListener('mouseover', setAttr) не видит функцию (сейчас речь не о том, нужен он или нет), в чём тут ошибка?
Потому что при таком использовании функция доступна по своему имени только изнутри этой же функции.
var res = []; res.push("Before, f1: " + typeof f1 + ", f2: " + typeof f2 + ", f3: " + typeof f3); var f1 = function f2() { res.push("f1(), f1 == f2: " + (f1 == f2)); }; function f3() { } res.push("After, f1: " + typeof f1 + ", f2: " + typeof f2 + ", f3: " + typeof f3); function f4(f) { res.push("f4(f)"); f(); } f4(function f5() { res.push("f5()"); }); res.push("f4: " + typeof f4 + ", f5: " + typeof f5); alert(res.join("\n"));
А во-вторых, объявлять функции внутри блоков типа if() лучше через var, поведение для
if(true) { function f1() {} f1(); } else { function f2() {} f2(); } alert(typeof f1 + " " + typeof f2);
зависит от браузера (и только в Firefox f2 будет undefined).
Одно время, кажется, предупреждение в консоль выдавалось, но, видимо, передумали.
https://developer.mozilla.org/en-US/doc … a_function
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
насчет деструктора и панели - можешь написать дополнение к коду что в сниппетах чтоб он был корректный? а я поправлю сниппет
вот что то намутил:
// Отслеживать переключение, загрузку, изменение текущей вкладки ................................ var main = { // если текущая страница изменился( загрузка, переход по истории, тп.) .... onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { if ( !aWebProgress.DOMWindow.document.location.protocol.startsWith("http") ) return; // стоп если внутренние страницы FF // если уже загруженная текущая страница if ( aFlag & Ci.nsIWebProgressListener.STATE_STOP ) { // запуск кода или функции если текущая вкладка изменился custombuttons.alertSlide("Вкладка изменилась: ", aWebProgress.DOMWindow.document.title ); // получить полезные данные для работы с обработчиком LOG('uri1: ' + content.location.href ); LOG('uri2: ' + aWebProgress.DOMWindow.document.documentURI ); LOG('name: ' + aRequest.name ); LOG('loadFlags: ' + aRequest.loadFlags ); LOG('title: ' + aWebProgress.DOMWindow.document.title ); LOG('location: ' + aWebProgress.DOMWindow.document.location ); LOG('STATE_REQUEST: ' + Ci.nsIWebProgress.NOTIFY_STATE_REQUEST ); LOG('STATE_DOCUMENT : ' + Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT ); LOG('readyState : ' + aWebProgress.DOMWindow.document.readyState); // LOG('uri2: ' + aWebProgress.currentURI.spec ); // aWebProgress.DOMWindow.close() } }, // если текущий адрес изменился .... onLocationChange: function(aWebProgress, aRequest, aURI) { if ( aRequest ) return; // стоп если это не переключение на другую вкладку if ( !aURI.spec.startsWith("http") ) return; // стоп если внутренние страницы FF if ( aWebProgress.DOMWindow.document.readyState !== 'complete' ) return; // стоп если текущая страница еще не загружена // запуск кода или функции при переключение на другую вкладку custombuttons.alertSlide("Переключился на: ", aWebProgress.DOMWindow.document.title ); // получить полезные данные для работы с обработчиком LOG('uri1: ' + aURI.spec ); LOG('uri2: ' + aWebProgress.currentURI.spec ); LOG('loading: ' + aWebProgress.isLoadingDocument ); LOG('title: ' + aWebProgress.DOMWindow.document.title ); LOG('location: ' + aWebProgress.DOMWindow.document.location ); } }; gBrowser.addProgressListener( main ); addDestructor(function() { gBrowser.removeProgressListener( main ) });
Добавлено 14-01-2014 00:29:22
Это кажется единственный обработчик который кроме загрузки и переключении вкладки отслеживает и переход по истории вкладки и переход по результатам поиска в поисковиках и даже работу расширений и скриптов типа AutoPagerize.
Добавлено 14-01-2014 00:40:24
Но есть недостатки - по не понятным причинам может срабатывать при переключении на другую уже загруженную вкладку сразу 2-3 раза или срабатывает при скроллинге страницы или срабатывает без видимой причини на загруженной вкладке(возможно там скрипты что меняют на странице)
Отредактировано bunda1 (14-01-2014 00:54:23)
Отсутствует
bunda1 а что значит это a в начале — aURI.spec, aRequest?
Я думаю что в данном случае a в начале ничего не значит, просто обработчик gBrowser.addProgressListener передаёт соответствующие аргументы в функцию onStateChange: function(aWebProgress, aRequest, aFlag, aStatus) { ..... или в onLocationChange: function(aWebProgress, aRequest, aURI) {..... и их можно назвать как хочешь, хоть function(a, b, c, d) { .....
Отредактировано bunda1 (14-01-2014 19:33:47)
Отсутствует