Наверно букмарклет меняет цвет выделения на открытой странице.
У меня это получается со всеми букмарклетами, которые открывают вкладку (или окно, без разницы).
Вот простейший букмарклет, что тут может менять цвет выделения?
javascript:(function(){ function htmlEscape(s){s=s.replace(/&/g,'&');s=s.replace(/>/g,'>');s=s.replace(/</g,'<');return s;} x=window.open(); x.document.write('<pre>' + htmlEscape('<html>\n' + document.documentElement.innerHTML + '\n</html>')); x.document.close(); })();
Отсутствует
Почему у меня на странице, открытой букмарклетом, выделение видно серым цветом?
Видимо, фокус не на странице, а где-то еще, например, в адресной строке.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Видимо, фокус не на странице, а где-то еще, например, в адресной строке.
У меня тоже эта мысль была. Но я специально щёлкал на странице, чтобы переместить на неё фокус.
Я заметил, что серое выделение получается с букмарклетами, где идёт window.open(), а потом document.write()
Совпадение?
Отсутствует
rbfyec
Можно попробовать добавить вызов window.focus() в конце.
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Можно попробовать добавить вызов window.focus() в конце.
Это я уже пробовал. Не помогает.
Я запускаю на странице код через FireGestures:
И он показывает Body. Значит, фокус на теле страницы?
Отсутствует
Караул , заметил глюк на FF24 + custombuttons-0.0.5.7pre1-20130923
Если в кнопке которое открывает меню есть строка this.type = "menu-button" код кнопки инициализируется два раза и все обработчики дублируются.
Попробуйте новую сборку custombuttons-0-0-5-7pre2-20131103
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Как можно передать в функцию свои аргументы
function rgbToHex(r, g, b) { var rgb = b | (g << 8) | (r << 16); return ((b | g << 8 | r << 16) / 0x1000000).toString(16).substring(2); }
если они у меня в виде rgb(111, 222, 333) и они меняются?
Отсутствует
Сорри если не сумел сформулировать
Короче получилась у меня функция
var bgColor=window.getComputedStyle(myElm, '').backgroundColor; function rgbToHex(r, g, b) { var rgb = b | (g << 8) | (r << 16); return ((b | g << 8 | r << 16) / 0x1000000).toString(16).substring(2); } var r=bgColor.match(/[0-9]+/g)[0]; var g=bgColor.match(/[0-9]+/g)[1]; var b=bgColor.match(/[0-9]+/g)[2]; rgbToHex(r, g, b)
Работает, но если фона под myElm нет, то выдаёт ошибку. Что надо добавить?
Отсутствует
Как можно передать в функцию свои аргументы
Выделить кодКод:
function rgbToHex(r, g, b) { var rgb = b | (g << 8) | (r << 16); return ((b | g << 8 | r << 16) / 0x1000000).toString(16).substring(2); }если они у меня в виде rgb(111, 222, 333) и они меняются?
Тут просто eval просится:
function rgb (r, g, b) { return ((b | g << 8 | r << 16) / 0x1000000). toString (16). substring (2); } var s = "rgb(111,222,333)"; var r = eval (s);
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
Anton пишет:
Тут просто eval просится:
function rgb (r, g, b) { return ((b | g << 8 | r << 16) / 0x1000000). toString (16). substring (2); } var s = "rgb(111,222,333)"; var r = eval (s);
Что-то у меня это не идёт... Если я вызываю функцию
то работает, но если
то получаю null.
А как всё же сделать в этой конструкции, чтобы при отсутствии фона не давало ошибку?
Отредактировано Ferguss114 (05-11-2013 18:23:14)
Отсутствует
А вы не вызывайте функцию rgb. Пусть её eval вызывает.
Время настанет, время придет...
И лис кОнкурiентов на части порвет !!!
Отсутствует
bunda1 пишетКараул , заметил глюк на FF24 + custombuttons-0.0.5.7pre1-20130923
Если в кнопке которое открывает меню есть строка this.type = "menu-button" код кнопки инициализируется два раза и все обработчики дублируются.Попробуйте новую сборку custombuttons-0-0-5-7pre2-20131103
Спасибо, вроде теперь работает как надо. Правда кнопки с this.type = "menu-button" теперь инициализируется при старте три раза но это мелочь.
Заметил другой глюк - если после старта браузера открыть окошко редактирования кнопки в который столько кода что появляется скролбар и прокрутить код вниз и кликнуть на коде правым кликом то код сам покрутится к началу. Эсли потом кликать правым то глюка не будет.
Отсутствует
bunda1
Есть у меня такая кнопка переключения прокси
var trtext; var ctabpos; var mainicon="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUA/wAAAACIiIjd3d2AgID///9WXziYAAAAAXRSTlMAQObYZgAAAFRJREFUeF4tydERgCAMBNFABUQr8KjAXAcODTD034s5cb/ezJohs6wuMpow3X8MTeH5prBnXTHHEIAN+LHRGSQFBLJcgGfTindml1lO3qcAJRTP2gv/MBEl7nzAMAAAAABJRU5ErkJggg=="; //------------------------Page context menu------------------------------------------------- (function UseAsProxy(){ const kXULNS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; var contextMenu = document.getElementById("contentAreaContextMenu"); var separator = document.getElementById("context-viewsource"); var eventTarget = null; var menu = document.createElementNS(kXULNS, "menu"); menu.id = "UseAsProxy"; menu.setAttribute("label", "Прокси"); menu.setAttribute("class", "menu-iconic"); menu.setAttribute("image", mainicon); menu.hidden = true; contextMenu.insertBefore(menu, separator ); var menuPopup = document.createElementNS(kXULNS, "menupopup"); menu.appendChild(menuPopup); var lst = [ { label:"Адрес Прокси", command: proxyadres, image:mainicon }, { label:"Порт Прокси", command:proxyport, image:mainicon } ]; for(var i = 0, m; m = lst[i]; i++){ if (m.label=="separator"){ var menuItem = document.createElementNS(kXULNS, "menuseparator"); menuItem.id = "UseAsProxy" + m.label.toString(); menuPopup.appendChild(menuItem); } else { var menuItem = document.createElementNS(kXULNS, "menuitem"); menuItem.setAttribute("label", m.label); menuItem.setAttribute("class", "menuitem-iconic"); menuItem.setAttribute("image", m.image); menuItem.setAttribute("type", "m.radio"); menuItem.addEventListener("command", m.command, false); menuItem.id = "UseAsProxy" + m.label.toString(); menuPopup.appendChild(menuItem); } } contextMenu.addEventListener("popupshowing", setMenuDisplay, false); function setMenuDisplay(aEvent) { if (gContextMenu.isTextSelected) { var doc = getBrowser (). contentDocument; seltxt = doc. defaultView. getSelection (); trtext=seltxt.toString(); ctabpos = gBrowser.mCurrentTab._tPos +1; document.getElementById("UseAsProxy").hidden = false; } else document.getElementById("UseAsProxy").hidden = true; } //--------proxyadres-------------- function proxyadres(){ custombuttons.setPrefs("network.proxy.http", trtext); custombuttons.alertSlide("Установлен адрес прокси:", trtext); } //---------proxyport--------------- function proxyport(){ var curset=trtext.replace(/\D*/g,"") var curset=(+curset); custombuttons.setPrefs("network.proxy.http_port", curset); custombuttons.alertSlide("Установлен порт прокси:", curset); } })(); this.timer = 0; this. onmouseover = function (event) { var curadr=custombuttons.getPrefs("network.proxy.http") var curport=custombuttons.getPrefs("network.proxy.http_port") var curstat=custombuttons.getPrefs("network.proxy.type") var proxystat if (curstat==0){proxystat="Выключен";} else{proxystat="Включен";} this.tooltipText="Текущие настройки прокси:\n"+"Адрес:"+curadr+" Порт:"+curport+"\n"+proxystat; clearTimeout(this.timer); }; var curstat=custombuttons.getPrefs("network.proxy.type") if (curstat==0){ this.checked=false; this.image='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUA/wAAAACIiIjd3d2AgID///9WXziYAAAAAXRSTlMAQObYZgAAAFRJREFUeF4tydERgCAMBNFABUQr8KjAXAcODTD034s5cb/ezJohs6wuMpow3X8MTeH5prBnXTHHEIAN+LHRGSQFBLJcgGfTindml1lO3qcAJRTP2gv/MBEl7nzAMAAAAABJRU5ErkJggg=='; }else{ this.checked=true; this.image='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEUA/wCIiIgAAADd3d3///8AAICAAAD/AAAAAP8pkhnQAAAAAXRSTlMAQObYZgAAAF1JREFUeF4tyUERg0AQRNEJDjprAAYFQztYCglYWAlwzi2y053kn17Vj4AK9djJmo3jPP94exqv7zR6prFXvy8D+AG59DGExiJpoKC0gFQ9pmxUzwhNbqsBJ2iq+QNw+RI4rlZUrAAAAABJRU5ErkJggg=='; } this.onclick = function(event) { if(event.button == 0) { var curstat=custombuttons.getPrefs("network.proxy.type") if (curstat==0){ custombuttons.setPrefs("network.proxy.type", 1); this.checked=true; this.image='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEUA/wCIiIgAAADd3d3///8AAICAAAD/AAAAAP8pkhnQAAAAAXRSTlMAQObYZgAAAF1JREFUeF4tyUERg0AQRNEJDjprAAYFQztYCglYWAlwzi2y053kn17Vj4AK9djJmo3jPP94exqv7zR6prFXvy8D+AG59DGExiJpoKC0gFQ9pmxUzwhNbqsBJ2iq+QNw+RI4rlZUrAAAAABJRU5ErkJggg=='; }else{ custombuttons.setPrefs("network.proxy.type", 0); this.checked=false; this.image='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAElBMVEUA/wAAAACIiIjd3d2AgID///9WXziYAAAAAXRSTlMAQObYZgAAAFRJREFUeF4tydERgCAMBNFABUQr8KjAXAcODTD034s5cb/ezJohs6wuMpow3X8MTeH5prBnXTHHEIAN+LHRGSQFBLJcgGfTindml1lO3qcAJRTP2gv/MBEl7nzAMAAAAABJRU5ErkJggg=='; } } }
Отредактировано villa7 (05-11-2013 21:00:57)
Лучше спросить у знающих - чем лезть не зная.
Отсутствует
Спасибо всем, вроде разобрался
Отсутствует
Чайник пишетПервым параметром родителя, правильно? А третьим параметром что - class? или anonid (если он есть)?
Это не совсем родитель, если уж на то пошло. Анонимные узлы в DOM Inspector'е подсвечены красным, а нужен ближайший не анонимный родитель. Атрибут может быль любой, просто принято использовать anonid.
https://developer.mozilla.org/en-US/doc … yAttributeParameters
elt - The element to retrieve anonymous children for.
attrName - The attribute name to look up.
attrValue - The attribute value to match.
Infocatcher, я обрадовался, что вроде понял принцип как получить анонимный узел. Оказалось рано радовался.
Почему у меня не выходит получить
В DOM Inspector'е видно, что ближайший не анонимный родитель — это searchbar.
И вот если я пишу
document.getAnonymousElementByAttribute(document.getElementById("searchbar"), "anonid", "textbox-input-box")
то получаю null.
ЧЯДНП?
Отсутствует
Чайник
document.getAnonymousElementByAttribute(document.getElementById("searchbar").textbox, "anonid", "textbox-input-box")
// http://forum.mozilla-russia.org/viewtopic.php?id=53319 // Searchbar Cleaner button for Custom Buttons // (code for "initialization" section) // (c) bunda1 // version 0.0.1 - 2012-01-16 // mod 0.0.3 - 2013-11-07 2k1dmg "use strict"; var cb_searchbarCleaner = { options: { defaultEngine: false, clearOnBlur: false }, clearBar: function(event) { var sb = cb_searchbarCleaner.sb; if (event.type == "blur" && !cb_searchbarCleaner.options.clearOnBlur) { return; } setTimeout(function() { sb.value = ""; if (cb_searchbarCleaner.options.defaultEngine) { sb.currentEngine = sb.engines ? sb.engines[0] : sb._engines[0]; } }, 500); }, clearFunc: function(event) { var sb = cb_searchbarCleaner.sb; if (event.keyCode == KeyEvent.DOM_VK_RETURN) { cb_searchbarCleaner.clearBar(event); } }, clearFuncBut: function(event) { if (event.button == 0 || event.button == 1) { cb_searchbarCleaner.clearBar(event); } }, init: function() { cb_searchbarCleaner.sb = document.getElementById("searchbar"); this.sb.addEventListener("blur", this.clearBar, true); this.sb.addEventListener('keydown', this.clearFunc, true); document.getAnonymousElementByAttribute(this.sb, "anonid", "search-go-button").addEventListener("click", this.clearFuncBut, true); var inputBox = document.getAnonymousElementByAttribute(this.sb.textbox, "anonid", "textbox-input-box"); document.getAnonymousElementByAttribute(inputBox, "anonid", "paste-and-search").addEventListener("click", this.clearBar, true); }, uninit: function() { this.sb.removeEventListener("blur", this.clearBar, true); this.sb.removeEventListener('keydown', this.clearFunc, true); document.getAnonymousElementByAttribute(this.sb, "anonid", "search-go-button").removeEventListener("click", this.clearFuncBut, true); var inputBox = document.getAnonymousElementByAttribute(this.sb.textbox, "anonid", "textbox-input-box"); try { document.getAnonymousElementByAttribute(inputBox, "anonid", "paste-and-search").removeEventListener("click", this.clearBar, true); } catch (ex) {} }, destroy: function() { this.uninit(); }, destructor: function(reason) { this.destroy(); } }; cb_searchbarCleaner.init(); if (typeof addDestructor == "function" && // userChromeJS/uc addDestructor != ("addDestructor" in window && window.addDestructor)) { let _this = cb_searchbarCleaner; addDestructor(_this.destructor, _this); }
Отредактировано 2k1dmg (07-11-2013 14:02:32)
Отсутствует
Чайник
Проблема в том, что нужный узел определен в binding'e для (анонимного) textbox.searchbar-textbox, а не #searchbar. И в таком случае подсветка красным уже не помогает.
Настоящего родителя можно узнать через getBindingParent(): в DOM Inspector'e можно справа выбрать «Объект JavaScript», в контекстном меню корневого узла вызвать «Вычислить JavaScript» и там уже выполнить что-нибудь вроде
var p = target.ownerDocument.getBindingParent(target); alert(p.nodeName + (p.id ? "#" + p.id : "") + (p.className ? "." + p.className.split(/\s+/).join(".") : ""));
Прошлое – это локомотив, который тянет за собой будущее. Бывает, что это прошлое вдобавок чужое. Ты едешь спиной вперед и видишь только то, что уже исчезло. А чтобы сойти с поезда, нужен билет. Ты держишь его в руках. Но кому ты его предъявишь?
Виктор Пелевин. Желтая стрела
Отсутствует
Чайник Попробуй так, у меня так добавлена кнопка(menuItem).
var searchbar = document.getElementById("searchbar");
var it = document.getAnonymousElementByAttribute(searchbar, "anonid", "searchbar-textbox");
var im = document.getAnonymousElementByAttribute(it, "anonid", "textbox-input-box");
var go = im.lastChild;
im.insertBefore(menuItem, go);
Отсутствует