Вопрос к знатокам.
Есть код - перевод страницы в новой вкладке, после исходной :
var GooglePageNew_translate = function(){
var url = "http://translate.google.com/translate?u=" + content.location + "&hl=ru&ie=UTF-8&sl=auto&tl=ru";
setTimeout(function() {
gBrowser.selectedTab = gBrowser.duplicateTab( gBrowser.mCurrentTab );
gBrowser.addEventListener("pageshow", function(e) {
this.removeEventListener("pageshow", arguments.callee, true);
content.document.location = url;
}, true);
}, 50)
var css = '@-moz-document domain("translate.google.com") {\
#gb, #gt-c:not([class="g-section"]) { display: none !important; }\
#contentframe { top: 0 !important; }\
}';
var uri = makeURI("data:text/css," + encodeURIComponent(css));
var sss = Cc["@mozilla.org/content/style-sheet-service;1"]. getService(Ci.nsIStyleSheetService);
try { sss.unregisterSheet(uri, sss.AGENT_SHEET) }
catch(e) { sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET) };
};
Назначаю для этой функции горячую клавишу, допустим:
var Key = 120; // Соответствует F9
addEventListener('keydown', function(e){
if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == Key)GooglePageNew_translate();
}, false);
В результате при нажатии на горячую клавишу функция срабатывает дважды, т.е. открываются две вкладки с переводом после исходной.
Если эту функцию addEventListener('keydown', function(e) использовать например для перевода в текущей вкладке вопросов с горячей клавишей не возникает, все происходит в штатном порядке.
Почему так получается и как это исправить или как тогда по другому назначить горячую клавишу?
Отсутствует
Andrey_Krropotkin
function translatePage() { var url = "http://translate.google.com/translate?u=" + content.location + "&hl=ru&ie=UTF-8&sl=auto&tl=ru"; var x = gBrowser.mCurrentTab._tPos +1; gBrowser.moveTabTo( gBrowser.selectedTab = gBrowser.addTab(url), x); }; var Key = 120; // Соответствует F9 addEventListener('keydown', function(e){ if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == Key) translatePage(); }, false, window ); var css = '@-moz-document domain("translate.google.com") {\ #gb, #gt-c:not([class="g-section"]) { display: none !important; }\ #contentframe { top: 0 !important; }\ }'; var uri = makeURI("data:text/css," + encodeURIComponent(css)); var sss = Cc["@mozilla.org/content/style-sheet-service;1"]. getService(Ci.nsIStyleSheetService); sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); addDestructor(function() { sss.unregisterSheet( uri, sss.AGENT_SHEET ) });
Добавлено 20-10-2013 19:59:34
или:
addEventListener('keydown', function(e) { if ( !e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == 120 ) { var url = "http://translate.google.com/translate?u=" + content.location + "&hl=ru&ie=UTF-8&sl=auto&tl=ru"; var x = gBrowser.mCurrentTab._tPos +1; gBrowser.moveTabTo( gBrowser.selectedTab = gBrowser.addTab(url), x); } }, false, window ); var css = '@-moz-document domain("translate.google.com") {\ #gb, #gt-c:not([class="g-section"]) { display: none !important; }\ #contentframe { top: 0 !important; }\ }'; var uri = makeURI("data:text/css," + encodeURIComponent(css)); var sss = Cc["@mozilla.org/content/style-sheet-service;1"]. getService(Ci.nsIStyleSheetService); sss.loadAndRegisterSheet(uri, sss.AGENT_SHEET); addDestructor(function() { sss.unregisterSheet( uri, sss.AGENT_SHEET ) });
Добавлено 20-10-2013 20:02:14
И возможно:
@-moz-document domain("translate.google.com") { #gb, #gt-c:not([class="g-section"]) { display: none !important; } #contentframe { top: 0 !important; } }
работает через userContent.css
Отредактировано bunda1 (20-10-2013 20:02:14)
Отсутствует
bunda1 спасибо, проверил, даже на чистом профиле открываются все равно две вкладки после исходной.
И еще один вопрос?
В этой функции я хочу заменить translatePage() на переменную:
addEventListener('keydown', function(e){
if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == Key) trans;
}, false, window );
Например:
var trans = translatePage();
var trans = "translatePage()";
В первом случае пишет что trans - не функция
Во втором просто не реагирует.
Отредактировано Andrey_Krropotkin (20-10-2013 22:16:43)
Отсутствует
bunda1 спасибо, проверил, даже на чистом профиле открываются все равно две вкладки после исходной.
Я проверил у меня открывает одну вкладку, ты что то делаешь не правильно.
Во втором случае trans это просто текст.
Отредактировано bunda1 (20-10-2013 21:36:26)
Отсутствует
okkamas_knife мне тоже понято что у меня не правильно, а как тогда правильно сделать?
Смысл такой я хочу определить клавиши для разных типов перевода:
для текста - в окне, в новой вкладке;
для страниц - в том же окне и в новой вкладке;
После этого выбрать один из нескольких переводчиков для этой клавиш.
На пример выбрал клавишу F9.
Для этой клавиши выбираю из: перевод в Gooole - translatePage() или перевод в Microsoft - translatePage1() или т.д.
Отсутствует
okkamas_knife мне тоже понято что у меня не правильно, а как тогда правильно сделать?
Смысл такой я хочу определить клавиши для разных типов перевода:
И в чём проблема:
addEventListener('keydown', function(e) { custombuttons.alertSlide("e.keyCode", e.keyCode); }, false, window );
Добавлено 20-10-2013 22:28:50
События клавиатуры | Учебник JavaScript
Отредактировано bunda1 (20-10-2013 22:28:50)
Отсутствует
bunda1 не понял.
Еще раз объясни.
Вот что у меня:
var Key = 120; // Клавища F9
addEventListener('keydown', function(e){
if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == Key) translatePage();
}, false, window );
Я хочу чтобы вместо translatePage() стояла переменная.
например
if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == Key3) trans;
где var trans = можно выбрать из translatePage() или translatePage1() или translatePage2() и т.д.
Но как это правильно сделать.
Отредактировано Andrey_Krropotkin (20-10-2013 23:04:37)
Отсутствует
Andrey_Krropotkin
var trans = translatePage2; var key = KeyEvent.DOM_VK_F9; // Клавиша F9 addEventListener('keydown', function(e){ if(!e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode == key) trans(); }, false); function translatePage() { alert("translatePage"); } function translatePage2() { alert("translatePage2"); } function translatePage3() { alert("translatePage3"); }
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher спасибо работает.
Отсутствует
Вопрос к знающим людям, как лучше для производительности.
В коде который создаёт меню добавлять обработчик для запуска функций к каждому пункту меню или один обработчик для всего меню и получить функцию для запуска через e.target
// Добавляем подменю в контекстного меню на странице для выделенного текста ................................ (function () { var contextMenu = document.getElementById("contentAreaContextMenu"); var menu = document.createElement("menu"); menu.setAttribute("label", "Find"); contextMenu.insertBefore( menu, document.getElementById("context-sep-properties") ); addEventListener("popupshowing", function() { menu.hidden = !gContextMenu.isTextSelected; }, false, contextMenu ); addDestructor(function() { contextMenu.removeChild( menu ) }); var array = [ { label:"Найти на странице", func: findToContex }, { label:"Поиск по сайту(google)", func: searchToSite }, { separator: '' }, { label:"Выделить текст на странице", func: highlightSel }, { label:"Автовыделение, добавить текст", func: addSel } ]; var menuPopup = menu.appendChild( document.createElement("menupopup") ); array.forEach(function( m ) { if ( "separator" in m ) { menuPopup.appendChild( document.createElement("menuseparator") ); return }; var mItem = document.createElement("menuitem"); mItem.setAttribute("label", m.label ); mItem.func = m.func; menuPopup.appendChild( mItem ); }); addEventListener("command", function(e) { e.target.func() }, false, menu ); function findToContex() { alert("Найти на странице"); }; function searchToSite() { alert("Поиск по сайту(google)"); }; function highlightSel() { alert("Выделить текст на странице"); }; function addSel() { alert("Автовыделение, добавить текст"); }; })();
Отсутствует
Вопрос к знающим людям, как лучше для производительности.
В коде который создаёт меню добавлять обработчик для запуска функций к каждому пункту меню или один обработчик для всего меню и получить функцию для запуска через e.target
Вряд ли в данном случае будет хоть сколько-нибудь заметная разница в производительности.
К тому же, особого смысла оптимизировать «действия по запросу» тоже обычно нету. Вот если что-то нужно выполнять часто, тогда да.
А так-то с одним обработчиком обычно удобнее. По скорости, видимо, сравнить не получится, а вот памяти, наверное, понадобится чуть меньше.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
bunda1
self._handlers – хранилище для добавленного через переопределенный addEventListener() (а не node.addEventListener()).
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Чайник
https://developer.mozilla.org/en-US/doc … us_Content
document.getAnonymousElementByAttribute(document.getElementById("searchbar"), "anonid", "search-go-button");
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Infocatcher
Написано там много и разобраться мне в этом затруднительно.
В двух словах: что надо подставлять в скобках?
Первым параметром родителя, правильно? А третьим параметром что - class? или anonid (если он есть)?
Отсутствует
Первым параметром родителя, правильно? А третьим параметром что - class? или anonid (если он есть)?
Это не совсем родитель, если уж на то пошло. Анонимные узлы в DOM Inspector'е подсвечены красным, а нужен ближайший не анонимный родитель. Атрибут может быль любой, просто принято использовать anonid.
https://developer.mozilla.org/en-US/doc … yAttribute
Parameters
elt - The element to retrieve anonymous children for.
attrName - The attribute name to look up.
attrValue - The attribute value to match.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Как сделать чтобы кнопка открывала поиск стилей того сайта на котором находишься, а не просто сайт userstyles.org
url=getBrowser().currentURI.spec; domen = url.split(/\/+/g)[1]; getBrowser (). selectedTab = getBrowser (). addTab ("http://userstyles.org/styles/browse_r?search_terms=" + domen +"&submit=Search");
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
villa7
var domain = content.document.domain; function userstylesOrgSearch() { if (/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/.test(domain)) return; var domain_parts = domain.split('.'); var hostName; switch(domain_parts.length) { case 2: hostName = domain_parts[0]; break; case 3: case 4: hostName = domain_parts[1]; break; } if (!hostName) return; var url = "http://userstyles.org/styles/browse/" + hostName; gBrowser.loadOneTab(url, { relatedToCurrent : true, inBackground : false }); } if (domain) userstylesOrgSearch();
Отсутствует
скрытый текстВыделить кодКод:
var domain = content.document.domain; function userstylesOrgSearch() { if (/^(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?)$/.test(domain)) return; var domain_parts = domain.split('.'); var hostName; switch(domain_parts.length) { case 2: hostName = domain_parts[0]; break; case 3: case 4: hostName = domain_parts[1]; break; } if (!hostName) return; var url = "http://userstyles.org/styles/browse/" + hostName; gBrowser.loadOneTab(url, { relatedToCurrent : true, inBackground : false }); } if (domain) userstylesOrgSearch();
Ууу, дела контентские. Ничего в них не смыслю, но
http://uk.weather.yahoo.com/ - «weather»
http://peverilpublishing.co.uk/ - «co»
Если добавишь, в свой код, или в код типа этого,
фич из ихнего Advanced, то кнопка будет ещё более хороша.
if (!content.document.domain) return; const uri = gBrowser.currentURI, tld = Services.eTLD; try { var str = tld.getBaseDomain(uri).replace("." + tld.getPublicSuffix(uri), "") } catch(ex) { return } gBrowser.loadOneTab( "http://userstyles.org/styles/browse/" + str + "?per_page=50", { relatedToCurrent : true, inBackground : false } );
Отсутствует