Alewww, если кнопка не принципиально, букмарклет:
javascript:%20if%20(window.getSelection)%20selected%20=%20window.getSelection();%20else%20if%20(document.getSelection)%20selected%20=%20document.getSelection();%20else%20selected%20=%20document.selection.createRange().text;%20$s=%20''+selected;%20if(!$s)void%20($s=prompt('%D0%A7%D1%82%D0%BE%20%D0%B8%D1%81%D0%BA%D0%B0%D1%82%D1%8C-%D1%82%D0%BE%20%D0%B1%D1%83%D0%B4%D0%B5%D0%BC?','???'));if($s!=null)void(open('http://www.google.com/search?num=100&q=site:'+%20document.location.hostname+%20'+%20%22'+$s+'%22'))
На форуме
други, помогите с букмарклетом или кнопкой
ситуация: нужен букмарклет или кнопка для выделения желтым цветом (как маркером) текста на странице
оригинал тут: https://gist.github.com/agibsonsw/a993c14ee172dfeb4d96
оригинал выдает пустую страницу с надписью null
пытался скорректировать вставками/удалениями из похожих, но не очень получается, выдает ошибку invalid identifier
javascript: (function() { var count = 0, text, dv; text = '' + selected; if (window.getSelection) selected = window.getSelection(); else if (document.getSelection) selected = document.getSelection(); else selected = document.selection.createRange().text; if (text == null || text.length == 0) return; dv = document.defaultView; function searchWithinNode(node, te, len) { var pos, skip, spannode, middlebit, endbit, middleclone; skip = 0; if (node.nodeType == 3) { pos = node.data.toUpperCase().indexOf(te); if (pos >= 0) { spannode = document.createElement("SPAN"); spannode.style.backgroundColor = "yellow"; middlebit = node.splitText(pos); endbit = middlebit.splitText(len); middleclone = middlebit.cloneNode(true); spannode.appendChild(middleclone); middlebit.parentNode.replaceChild(spannode, middlebit); count; skip = 1; } } else if (node.nodeType == 1 && node.childNodes && node.tagName.toUpperCase() != "SCRIPT" && node.tagName.toUpperCase != "STYLE") { for (var child = 0; child < node.childNodes.length; child) { child = child searchWithinNode(node.childNodes[child], te, len); } } return skip; } searchWithinNode(document.body, text.toUpperCase(), text.length); })();
Добавлено 30-04-2020 01:08:21
поправка: для выделения желтым цветом (как маркером) ВЫДЕЛЕННОГО мышкой текста на странице
Отредактировано dezhnev (30-04-2020 01:08:21)
Отсутствует
vitalii201, не принципиально. Но как теперь букмарклет поместить в кнопку.
var vert = ` javascript:%20if%20(window.getSelection)%20selected%20=%20window.getSelection();%20else%20if%20(document.getSelection)%20selected%20=%20document.getSelection();%20else%20selected%20=%20document.selection.createRange().text;%20$s=%20''+selected;%20if(!$s)void%20($s=prompt('%D0%A7%D1%82%D0%BE%20%D0%B8%D1%81%D0%BA%D0%B0%D1%82%D1%8C-%D1%82%D0%BE%20%D0%B1%D1%83%D0%B4%D0%B5%D0%BC?','???'));if($s!=null)void(open('http://www.google.com/search?num=100&q=site:'+%20document.location.hostname+%20'+%20%22'+$s+'%22'))` ; gBrowser. loadURI(vert, { triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal() });
начал немного про javascript читать, хотя я больше по python
как узнать текущий url вкладки?
Выводит
И где можно прочитать про встроенные функции, методы и тп. например какие методы есть у gbrowser?
Лазить чисто по форуму и искать рабочие функции? Пока нашел совсем немного, но хотелось бы побольше функций:
/* function UrlsToClipboard(){ gClipboard.write(Array.from(gBrowser.tabs).map( tab => tab.linkedBrowser.currentURI.spec.replace(/^http(?!s)/, "$&s") ).join("\n")); } UrlsToClipboard(); function OpenUrl(url){ gBrowser.addTrustedTab(url,{relatedToCurrent: false, index: 0}); } OpenUrl('https://ya.ru/') */ // custombuttons.alertBox("Файл не найден", "text"); // расширенный alert // document.getElementById("Browser:Reload").doCommand(); //обновить вкладку // BrowserReload(); //обновить вкладку // gClipboard.read(); //читаем буфер // gClipboard.write(); //записываем в буфер // gBrowser.removeAllTabsBut(gBrowser.selectedTab); //закрыть другие вкладки кроме активной
Отредактировано Alewww (30-04-2020 17:07:19)
Отсутствует
букмарклет или кнопка для выделения желтым цветом (как маркером) текста на странице
оригинал тут: https://gist.github.com/agibsonsw/a993c14ee172dfeb4d96
Ну, не совсем так. Выделяется жёлтым только текст,
который может быть найден целиком внутри одной текстовой ноды.
оригинал выдает пустую страницу с надписью null
пытался скорректировать вставками/удалениями из похожих, но не очень получается, выдает ошибку invalid identifier
Выдаёт null потому, что функция-обёртка зачем-то возвращает null,
а в скорректированном куда-то разбежались знаки плюс (+).
Вольный пересказ оригинала:
javascript:(function(className) { var sel = getSelection().toString(); if (!sel) return Array.from( document.getElementsByClassName(className) ).forEach(span => { var pn = span.parentNode; if (pn) span.replaceWith(span.textContent), pn.normalize(); }); var txt = sel.toUpperCase(), len = txt.length; var ignore = "script,style,textarea"; /* ,etc" */ (function searchWithinNode(node) { var type = node.nodeType; if (type == node.TEXT_NODE) { var pos = node.data.toUpperCase().indexOf(txt); if (pos >= 0) { var middlebit = node.splitText(pos); middlebit.splitText(len); var span = document.createElement("span"); span.className = className; span.style.backgroundColor = "yellow"; middlebit.replaceWith(span); span.append(middlebit); return 2; } } else if (type == node.ELEMENT_NODE && !node.matches(ignore)) for( var ind = 0; ind < node.childNodes.length; ind += searchWithinNode(node.childNodes.item(ind)) || 1 ); })(document.body); })("yellow-marker-span_class_name");
И где можно прочитать про встроенные функции, методы и тп. например какие методы есть у gbrowser?
Прочитать кому?
Сами они и так всё знают, а нас для них больше не существует.
Раньше была дока типа такой, теперь чтиво — вкладка с адресом
chrome://browser/content/tabbrowser.js или тому подобное.
Отсутствует
Dumby спасибо, выручил от установки еще одного вебекста с кучей лишнего функционала
а нас для них больше не существует
и ведь не поспоришь, как есть так и есть
как заберут долю рынка, чтобы отказаться от 1% квалифицированных пользователей, все, прощай iddqd
вопрос времени, года 4, пока гуглу не надоест и не перейдет на мобильный рынок полностью, по-другому мацареле не выгорит
Отсутствует
Прочитать кому?
я про себя говорил, хотел ознакомиться с мануалами, думал они есть
Dumby, через кнопку можно отправить post запрос? Типа такого:
def ha_toggle(): url = "http://192.168.1.64:8123/api/services/homeassistant/toggle" headers = { "Authorization": "tttoooookkkkeeeennnn", "content-type": "application/json", } data = '{"entity_id": "some_light"}' response = requests.post(url, headers=headers, data=data)
Отсутствует
Dumby, через кнопку можно отправить post запрос?
Меня об этом бесполезно спрашивать, я не сетевой человек,
но это же вэб-технологии, которые, как раз, документированы неплохо.
Вот пример использования fetch, пробуй.
Отсутствует
Alewww пишетDumby, через кнопку можно отправить post запрос?
Меня об этом бесполезно спрашивать, я не сетевой человек,
но это же вэб-технологии, которые, как раз, документированы неплохо.
Вот пример использования fetch, пробуй.
то что надо, спасибо!
Отсутствует
«Merge Day»
custom_buttons-0.0.7.0.0.12-fx.txt
Выручайте в кнопке Save не работает Открыть выделенный текст в внешнем редакторе, в контекстном меню. в консоле пишет ReferenceError: custombuttonsUtils is not defined
Да, за всем не уследишь.
//Save try {CustomizableUI.createWidget({ id: "ucf-cbbtn-Save", localized: false, get initCode() { delete this.initCode; return this.initCode = Cu.readUTF8URI(Services.io.newURI( "chrome://user_chrome_files/content/custom_scripts/Save.js" )); }, cbu: { types: { 128: "Bool", boolean: "Bool", 64: "Int", number: "Int", 32: "String", string: "String" }, getPrefs(pref) { try { return Services.prefs[`get${ this.types[Services.prefs.getPrefType(pref)] }Pref`](pref); } catch {return null;} }, setPrefs(pref, val) { Services.prefs[`set${this.types[typeof val]}Pref`](pref, val); } }, gClipboard: { get ch() { delete this.ch; return this.ch = Cc["@mozilla.org/widget/clipboardhelper;1"] .getService(Ci.nsIClipboardHelper); }, write(str) { this.ch.copyStringToClipboard(str, Services.clipboard.kGlobalClipboard); } }, custombuttonsUtils: { writeFile(path, data) { try { if (path.includes(":\\")) path = path.replace(/\//g, "\\"); var file = Cc["@mozilla.org/file/local;1"].createInstance(Ci.nsIFile); file.initWithPath(path); file.exists() && file.remove(false); var strm = Cc["@mozilla.org/network/file-output-stream;1"] .createInstance(Ci.nsIFileOutputStream); strm.init(file, 0x04 | 0x08, 420, 0); strm.write(data, data.length); strm.flush(); strm.close(); } catch(ex) { Cu.reportError("Custom Buttons: " + [path, "---", ex, ex.stack].join("\n")); } } }, addDestructor(destructor, context) { this._destructors.push({destructor, context}); }, addEventListener(...args) { var trg = args[3]; if (!trg) trg = args[3] = this.ownerGlobal; trg.addEventListener(...args); this._handlers.push(args); }, onCreated(btn) { var win = btn.ownerGlobal; btn._handlers = new win.Array(); btn._destructors = new win.Array(); win.addEventListener("unload", this, {once: true}); new win.Function( "self,_id,cbu,xhtmlns,addDestructor,addEventListener,gClipboard,custombuttonsUtils", this.initCode ).call( btn, btn, this.id, this.cbu, "http://www.w3.org/1999/xhtml", this.addDestructor.bind(btn), this.addEventListener.bind(btn), this.gClipboard, this.custombuttonsUtils ); }, handleEvent(e) { var btn = e.target.getElementById(this.id); for(var args of btn._handlers) args.pop().removeEventListener(...args); delete btn._handlers; for(var {destructor, context} of btn._destructors) try {destructor.call(context, "destructor");} catch(ex) {Cu.reportError(ex);} delete btn._destructors; } });} catch(ex) {Cu.reportError(ex);}
Отсутствует
Отсутствует
Dumby
В FF76 перестала работать кнопка
// Дв. клик по панели вкладок.............. (selectors => addEventListener("dblclick", e => { /* if ( e.button || e.ctrlKey || e.shiftKey || e.altKey || !e.originalTarget.matches(selectors) ) */ if (e.button || e.ctrlKey || e.shiftKey || e.altKey || !( e.target.className == "tabbrowser-arrowscrollbox" || e.originalTarget.matches(selectors) )) return; var hbuTabs = [], param = {animate: false}; gBrowser.selectedTab = gBrowser.tabs[0]; for(var tab of gBrowser.visibleTabs.reverse()) //if (tab.pinned) break; else gBrowser._hasBeforeUnload(tab) ? hbuTabs.push(tab) : gBrowser.removeTab(tab, param); for(tab of hbuTabs) gBrowser.removeTab(tab, param); }, false, document.getElementById("TabsToolbar") || 1))("" + [ "#tabbrowser-tabs [class*=scrollbox]", "toolbarspring", "#TabsToolbar", ]);
Отсутствует
В FF76 перестала
Bug 1625895 - Change tabbrowser-arrowscrollbox from class to id
Так, наверно
//e.target.className == "tabbrowser-arrowscrollbox" e.target.id == "tabbrowser-arrowscrollbox"
Отредактировано Dumby (05-05-2020 12:11:01)
Отсутствует
«Merge Day»
custom_buttons-0.0.7.0.0.12-fx.txt
В следйющей версии дополнения, добавьте пожалуйста строку для Pale Moon 29, чтобы не ругался....
С 27-й, т.к. есть ещё фанаты остающиеся на этой версии браузера.
<!-- Pale Moon --> <em:targetApplication> <Description> <em:id>{8de7fcbb-c55c-4fbe-bfc5-fc555c87dbc4}</em:id> <em:minVersion>27.0</em:minVersion> <em:maxVersion>*</em:maxVersion> </Description> </em:targetApplication>
То бишь Pale Moon 29 ругается на дополнения без этой подпись.
Отредактировано Quartz1t (06-05-2020 13:57:17)
Отсутствует
Dumby подскажи на 76 выскакивает вот такая ошибка
TypeError: Custom Buttons: addEventListener: eventTarget is not instanceof nsIDOMEventTarget or EventTarget
Причем, если открыть и закрыть кнопку, то код работает
// Редактировать размеры поля выбора вкладок в окне добавления закладки звёздочки ((panel, css) => addEventListener("popupshowing", { pref: "CB.editBMPanel_folderTreeRow_WidthHeight", handleEvent(e) { css = encodeURIComponent(css.replace(/;/g, " !important;")); var args = ["data:text/css," + css, windowUtils.USER_SHEET]; windowUtils.loadSheetUsingURIString(...args); var row = this.row = document.getElementById("editBMPanel_folderTreeRow"); addEventListener("popuphidden", this, false, panel); addDestructor(reason => { windowUtils.removeSheetUsingURIString(...args); row.removeAttribute("width"); row.removeAttribute("height"); reason == "delete" && Services.prefs.clearUserPref(this.pref); }); this.handleEvent = e => e.target == panel && this[e.type](); this.popupshowing(); }, popupshowing() { var [width, height] = Services.prefs.getStringPref(this.pref, "332 184").split(" "); this.row.width = width; this.row.height = height; gEditItemOverlay.toggleFolderTreeVisibility(); }, popuphidden() { var {width, height} = this.row; Services.prefs.setStringPref(this.pref, width + " " + Math.max(184, height)); } }, false, panel || 1))(document.getElementById("editBookmarkPanel"), ` #editBookmarkPanel #editBMPanel_folderTreeRow { resize: both; overflow: hidden; min-width: 332px; } #editBookmarkPanel box.panel-header { padding: 0; border: none; } #editBookmarkPanel #editBookmarkPanelRows { padding-top: 0; } #editBookmarkPanel #editBMPanel_keywordRow, #editBookmarkPanel #editBMPanel_locationRow { visibility: visible; } #editBookmarkPanel #editBMPanel_tagsRow > hbox, #editBookmarkPanel #editBMPanel_folderRow > hbox, #editBookmarkPanel #editBookmarkPanelRows > vbox:not([id*="folderTree"]):not([id*="tagsSelector"]) { display: flex; align-items: center; } #editBookmarkPanel #editBMPanel_tagsField, #editBookmarkPanel #editBMPanel_folderMenuList, #editBookmarkPanel #editBookmarkPanelRows > vbox > label:first-child + * { flex-grow: 1; } #editBookmarkPanel moz-input-box { width: 100%; } `);
//Открыть всё из папки закладок в новых вкладках не загружая страниц от 23.03.2019...................................................................... ((g, id) => { addDestructor(r => r[5] == "e" && id in g && (g.PlacesUIUtils[id] = g[id]) && delete g[id]); if (id in g) return; g[id] = g.PlacesUIUtils[id]; var func = g => PlacesUIUtils.openMultipleLinksInTabs = async function(nodeOrNodes, event, view) { var where, win = getBrowserWindow(view.ownerWindow); var newWin = !win || (where = win.whereToOpenLink(event, false, true)) == "window"; var items = PlacesUtils.nodeIsContainer(nodeOrNodes) ? PlacesUtils.getURLsForContainerNode(nodeOrNodes) : Array.from(nodeOrNodes).filter(PlacesUtils.nodeIsURI); if (newWin) { var args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray); args.appendElement(PlacesUtils.toISupportsString(items.shift().uri)); win = Services.ww.openWindow( win || null, AppConstants.BROWSER_CHROME_URL, null, "chrome,dialog=no,all", args ); if (!items.length) return; await new Promise(resolve => win.addEventListener("load", resolve, {once: true})); } var loadInBackground = where == "tabshifted"; var insertAfterCurrent = !newWin && Services.prefs.getBoolPref("browser.tabs.insertAfterCurrent"); var triggeringPrincipal_base64 = g.Utils.SERIALIZED_SYSTEMPRINCIPAL || g.E10SUtils.SERIALIZED_SYSTEMPRINCIPAL; var multi = items.length > 1; var params = { skipAnimation: multi || newWin, bulkOrderedOpen: multi, createLazyBrowser: true }; if (insertAfterCurrent) params.index = win.gBrowser.selectedTab._tPos; var first = true; for(var {uri, title} of items) { if (insertAfterCurrent) params.index += 1; var tab = win.gBrowser.addTrustedTab(null, params); var state = { index: 1, hidden: false, attributes: {}, lastAccessed: 0, entries: [{url: uri, title, triggeringPrincipal_base64}] }; var image = await new Promise(resolve => PlacesUtils.favicons.getFaviconDataForPage( Services.io.newURI(uri), (uri, len, data, type) => { if (!len) return resolve(); var reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.readAsDataURL(new Blob([new Uint8Array(data)], {type})); }, 16 )); if (image) state.image = image; g.SessionStore.setTabState(tab, JSON.stringify(state)); if (first) { first = false; if (newWin) continue; if (multi && insertAfterCurrent) params.index = tab._tPos; // if (!loadInBackground) win.gBrowser.selectedTab = tab; } } } Services.scriptloader.loadSubScript("data:," + encodeURIComponent( `(${func})(Cu.import("resource:///modules/sessionstore/SessionStore.jsm", {}))` ), g); })(Cu.import("resource:///modules/PlacesUIUtils.jsm", {}), "openMultipleLinksInTabs");
Отредактировано Andrey_Krropotkin (07-05-2020 09:26:01)
Отсутствует
подскажи на 76 выскакивает вот такая ошибка
TypeError: Custom Buttons: addEventListener: eventTarget is not instanceof nsIDOMEventTarget or EventTarget
Так и должно быть, специально написано: «panel || 1»,
чтобы листенер молча не ушёл в окно, если с panel что-то случится.
̣
А с panel случилось то, что её засунули в <html:template>,
и, похоже, собираются такое проделывать не только с ней.
У меня сейчас так:
((css, panel) => ({ init() { panel = document.getElementById("editBookmarkPanel"); if (panel) { addEventListener("popupshowing", this, false, panel); this.destroy && this.destroy(); return; } else if (this.destroy) return; var mo = new MutationObserver(this.init.bind(this)); mo.observe(document.getElementById("mainPopupSet"), {childList: true}); addDestructor(this.destroy = reason => { mo.disconnect(); if (reason) return; self._destructors.splice(self._destructors.findIndex( d => d.destructor == this.destroy ), 1); delete this.destroy; }); }, pref: "CB.editBMPanel_folderTreeRow_WidthHeight", handleEvent(e) { css = encodeURIComponent(css.replace(/;/g, " !important;")); var args = ["data:text/css," + css, windowUtils.USER_SHEET]; windowUtils.loadSheetUsingURIString(...args); var row = this.row = document.getElementById("editBMPanel_folderTreeRow"); addEventListener("popuphidden", this, false, panel); addDestructor(reason => { windowUtils.removeSheetUsingURIString(...args); row.removeAttribute("width"); row.removeAttribute("height"); reason == "delete" && Services.prefs.clearUserPref(this.pref); }); this.handleEvent = e => e.target == panel && this[e.type](); this.popupshowing(); }, popupshowing() { var [width, height] = Services.prefs.getStringPref(this.pref, "332 184").split(" "); this.row.width = width; this.row.height = height; gEditItemOverlay.toggleFolderTreeVisibility(); gEditItemOverlay._paneInfo.visibleRows.add("keywordRow"); gEditItemOverlay._element("keywordRow").collapsed = false; gEditItemOverlay._initKeywordField().catch(Cu.reportError); }, popuphidden() { var {width, height} = this.row; Services.prefs.setStringPref(this.pref, width + " " + Math.max(184, height)); } }).init())(` #editBookmarkPanel #editBMPanel_folderTreeRow { resize: both; overflow: hidden; min-width: 332px; } #editBookmarkPanel box.panel-header { padding: 0; border: none; } #editBookmarkPanel #editBookmarkPanelInfoArea { display: none; } #editBookmarkPanel #editBookmarkPanelRows { padding-top: 0; } #editBookmarkPanel #editBMPanel_locationRow { visibility: visible; } #editBookmarkPanel #editBMPanel_tagsRow > hbox, #editBookmarkPanel #editBMPanel_folderRow > hbox, #editBookmarkPanel #editBookmarkPanelRows > vbox:not([id*="folderTree"]):not([id*="tagsSelector"]) { display: flex; align-items: center; } #editBookmarkPanel #editBMPanel_tagsField, #editBookmarkPanel #editBMPanel_folderMenuList, #editBookmarkPanel #editBookmarkPanelRows > vbox > label:first-child + * { flex-grow: 1; } #editBookmarkPanel moz-input-box { width: 100%; } `);
и вот еще одна ошибка - TypeError: g.Utils is undefine
Можно так записать: g.Utils && g.Utils.SERIALIZED_SYSTEMPRINCIPAL
или вообще удалить.
Отсутствует
Dumby спасибо, разобрался
Отсутствует
egorsemenov06
В custom_script.js
try {Services.obs.addObserver(function closer(s, topic, data) { Services.obs.removeObserver(closer, topic); if (data != "shutdown") return; var file = Services.dirsvc.get("ProfD", Ci.nsIFile); file.launch(file.append("sqlite.bat")); }, "quit-application", false);} catch(ex) {Cu.reportError(ex);}
Отсутствует
В чем фишка custom_script.js , чем кнопка хуже? И почему батник, а не VBS ?
тоже интересовал вопрос повальной переписью кнопок на ucjs, это конечно не плохо, я сам начал с ucjs, потом уже нашел кнопки)
но почему в формате Виталия, вероятно, чтобы поддерживать форум
погалаю, что автор предусматривает возможность закрытия поддержки CB, устал, понимаю
Отсутствует
В чем фишка custom_script.js , чем кнопка хуже?
Код инициализации кнопок исполняется в каждом окне браузера,
после открытия окна, а также после редактирования и при взаимодействии
с режимом «Персонализация…» (при перетаскивании — многократно).
А custom_script.js исполняется только один раз, при старте браузера.
Говоря нестрого, его можно назвать филиалом config.js в профиле.
То есть, для данной задачи, подходит идеально.
И почему батник, а не VBS ?
А мне-то почём знать? Это надо спрашивать у того, кто запускает.
вероятно,
погалаю, что
Да-да, вариант «просто потому, что чел попросил,
и попросил в определённом формате» совершенно невероятен,
примерно так же, как то, что всё зависит от факторов, куда более
серьёзных и могущественных, чем чьи-то там «предусмотрения».
Отсутствует