Die deutsche Version des Skripts ist wohl von Mithrandir, vielleicht liest er mit.
userChrome.js Scripte für den Fuchs (Zusammenstellung)
-
loshombre -
23. Mai 2011 um 00:55 -
Erledigt
-
-
Das Skript habe ich damals nur hochgeladen. Übersetzung stammt vermutlich von loshombre, ich habe auch keine Zeit mehr mich in die Skripte (vor allem die ich nicht benutze) zu vertiefen, sorry.
BTW: ich lese hier mit. Extra PNs sind unnötig. Ich melde mich halt nur, wenn ich etwas zu sagen habe (oder eben quasi dazu gedrängt werde).
-
Testet mal bitte:
Code
Alles anzeigen// ==UserScript== // @charset UTF-8 // @note 大阪弁いややったらラベルとか書き換えて~や // ==/UserScript== (function() { // 検索バーにヒットした件数を表示する var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status'); var sep = document.createElement("toolbarspacer"); var count = document.createElement("label"); count.hidden = true; status.parentNode.insertBefore(sep, status); status.parentNode.insertBefore(count, status); gFindBar.__proto__._foundMatches = count; gFindBar.__proto__._updateMatchesCount = function(aRes) { if (!this._updateMatchCountTimeout) window.clearTimeout(this._updateMatchCountTimeout); this._updateMatchCountTimeout = window.setTimeout(function(aRes, aSelf) { aSelf._updateMatchesCountWorker(aRes); }, 0, aRes, this); } gFindBar.__proto__._updateMatchesCountWorker = function(aRes) { var word = this._findField.value; if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) { this._foundMatches.hidden = true; this._foundMatches.value = ""; } else { var matchesCount = this._countMatches(word).toString(); if (matchesCount != "0") { if (matchesCount == "1") this._foundMatches.value = matchesCount + " Begriffe gefunden"; else if (matchesCount == "-1") { var matchLimit = 100; this._foundMatches.value = "extrem viel Treffer"; //var key = (matchLimit > 1000) ? "Decrease" : "Increase"; } else this._foundMatches.value = matchesCount + " Begriffe gefunden"; this._foundMatches.hidden = false; } else { this._foundMatches.hidden = true; this._foundMatches.value = ""; } window.clearTimeout(this._updateMatchCountTimeout); } } gFindBar.__proto__._countMatches = function(aWord, aWindow) { var win = aWindow || this.browser.contentWindow; var countFound = 0; for (var i = 0, count; win.frames && i < win.frames.length; i++) { if ((count = this._countMatches(aWord, win.frames[i])) != -1) countFound += count; else return count; } var doc = win.document; if (!doc || !(doc instanceof HTMLDocument)) return countFound; var body = doc.body; var count = body.childNodes.length; var searchRange = doc.createRange(); var startPt = doc.createRange(); var endPt = doc.createRange(); searchRange.setStart(body, 0); searchRange.setEnd(body, count); startPt.setStart(body, 0); startPt.setEnd(body, 0); endPt.setStart(body, count); endPt.setEnd(body, count); var retRange = null; var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"] .createInstance() .QueryInterface(Components.interfaces.nsIFind); finder.caseSensitive = this._shouldBeCaseSensitive(aWord); var matchLimit = 100; while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) { if (this._rangeIsVisible(retRange, win)) { if (this._findMode == this.FIND_LINKS) { if (this._rangeStartsInLink(retRange)) ++ countFound; } else ++ countFound; } if (countFound == matchLimit) { countFound = -1; break; } startPt = doc.createRange(); startPt.setStart(retRange.startContainer, retRange.startOffset + 1); } return countFound; } gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) { var node = aRange.startContainer; if (node.nodeType == node.ELEMENT_NODE) { if (node.hasChildNodes) { var childNode = node.childNodes[aRange.startOffset]; if (childNode) node = childNode; } } while (node && node.nodeType != node.ELEMENT_NODE) node = node.parentNode; if (node) { var style = aWindow.getComputedStyle(node, ""); if (style) { if (style.visibility == "hidden" || style.visibility == "collapse" || style.display == "none") return false; if (style.left != "auto" && style.width != "auto") if (style.left < 0 && style.left + style.width < 0) return false; if (style.top != "auto" && style.height != "auto") if (style.top < 0 && style.top + style.height < 0) return false; } } return true; } gFindBar.__proto__._rangeStartsInLink = function(aRange) { var isInsideLink = false; var node = aRange.startContainer; if (node.nodeType == node.ELEMENT_NODE) { if (node.hasChildNodes) { var childNode = node.childNodes[aRange.startOffset]; if (childNode) node = childNode; } } const XLink_NS = "http://www.w3.org/1999/xlink"; do { if (node instanceof HTMLAnchorElement) { isInsideLink = node.hasAttribute("href"); break; } else if (typeof node.hasAttributeNS == "function" && node.hasAttributeNS(XLink_NS, "href")) { isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple"); break; } node = node.parentNode; } while (node); return isInsideLink; } eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}"); eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}"); // 検索バーをCtrl + Fでトグルする eval('gFindBar.open = ' + gFindBar.open.toString().replace('{','{if(!this.hidden){gFindBar.close();return;}')); // 検索バーからフォーカスを外し画面クリックで検索バーを閉じる function closeFindbar(e){ if(!gFindBar.hidden) { // if(e.target.id != "FindToolbar"){ // console.log('* '+e.target+' '+e.target.nodeName); // console.log('* '+e.originalTarget+' '+e.originalTarget.nodeName); if (e.target.nodeName != 'tabbrowser') { gFindBar.close(); } } } addEventListener('mousedown', closeFindbar, false); addEventListener('keydown', closeFindbar, false); // 検索バーの上をマウスホイールで↑↓検索 gFindBar.addEventListener('DOMMouseScroll', function (event){ gFindBar.onFindAgainCommand(event.detail < 0); }, false); })(); // 検索バーに消去ボタンを付けたったで (function ClearFindbarButton() { var refNode = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'find-next'); if (!refNode) return; const locale = (Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch).getCharPref("general.useragent.locale")).indexOf("zh")==-1; var ClearFindbarBtn = document.createElement("toolbarbutton"); ClearFindbarBtn.setAttribute("id", "clearFindbar-button"); ClearFindbarBtn.setAttribute("type", "button"); ClearFindbarBtn.setAttribute("class", "toolbarbutton-1"); ClearFindbarBtn.setAttribute("oncommand", "clearFindbarTweak.onCommand(event);"); ClearFindbarBtn.setAttribute("label", " Löschen "); ClearFindbarBtn.setAttribute("tooltiptext", "Inhalt der Suchleiste löschen"); ClearFindbarBtn.style.listStyleImage = "url('')"; refNode.parentNode.insertBefore(ClearFindbarBtn, refNode); clearFindbarTweak = { onCommand: function(event) { // var findBar = document.getElementById('FindToolbar'); // var findField = document.getElementById('FindToolbar').getElement('findbar-textbox'); var findBar = gFindBar; var findField = findBar.getElement('findbar-textbox'); var highlightBtn = findBar.getElement("highlight"); var historyfindBar = document.getElementById('historyfindbar'); var historyfindField = document.getElementById('find-field2'); if (findBar.hidden == false) { findField.focus(); findField.select(); findField.value = ""; } /* if (historyfindBar.hidden == false && historyfindField != null) { historyfindField.focus(); historyfindField.select(); historyfindField.value = ""; } */ else return; } } })();
-
Hallo aborix,
danke, deine Version des Skripts funktioniert.
Grüße
milupo
-
Allerdings.. Nur das die Suchleiste nach wenigen Sekunden wieder einklappt und kein Löschbutton vorhanden ist.. dies war vorher anders, bzw. wird durch das Script verändert..
-
Dass der Löschbutton fehlt, kann ich insofern bestätigen, als er bei mir nur im ersten Tab vorhanden ist.
Die Leiste klappt ein, wenn man in einen Bereich außerhalb der Leiste klickt. Das ist genauso beim Originalskript, ich habe es in Fx 24esr getestet. Das lässt sich aber ändern. -
Also, wenn ich auf einer bestimmten Seite suche, z. B. nach "sorben" auf der Wikipedia-Seite "Sorben" fehlt die Löschen-Schalttfläche nicht. Wenn ich mit Google nach "sorben" suche und dann mir die Findbar anzeigen lasse, dann fehlt die Schaltfläche auch nicht. Welche Suchmöglichkeiten gibt es noch?
-
Öffne eine Seite in einem neuen Tab und öffne dort die Findbar.
-
Ja, da fehlt die Löschen-Schaltfläche.
-
Das Script Conquuery Modoki.uc.xul funktioniert in der aktuellen Nightly nicht bei mir.Nutzt es jemand und kann dies
bestätigen? -
Findbar Plus:
Testet bitte:
Code
Alles anzeigen// ==UserScript== // @charset UTF-8 // @note 大阪弁いややったらラベルとか書き換えて~や // ==/UserScript== (function() { // 検索バーにヒットした件数を表示する var status = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'match-case-status'); var sep = document.createElement("toolbarspacer"); var count = document.createElement("label"); count.hidden = true; status.parentNode.insertBefore(sep, status); status.parentNode.insertBefore(count, status); gFindBar.__proto__._foundMatches = count; gFindBar.__proto__._updateMatchesCount = function(aRes) { if (!this._updateMatchCountTimeout) window.clearTimeout(this._updateMatchCountTimeout); this._updateMatchCountTimeout = window.setTimeout(function(aRes, aSelf) { aSelf._updateMatchesCountWorker(aRes); }, 0, aRes, this); } gFindBar.__proto__._updateMatchesCountWorker = function(aRes) { var word = this._findField.value; if (aRes == this.nsITypeAheadFind.FIND_NOTFOUND || !word) { this._foundMatches.hidden = true; this._foundMatches.value = ""; } else { var matchesCount = this._countMatches(word).toString(); if (matchesCount != "0") { if (matchesCount == "1") this._foundMatches.value = matchesCount + " Begriffe gefunden"; else if (matchesCount == "-1") { var matchLimit = 100; this._foundMatches.value = "extrem viel Treffer"; //var key = (matchLimit > 1000) ? "Decrease" : "Increase"; } else this._foundMatches.value = matchesCount + " Begriffe gefunden"; this._foundMatches.hidden = false; } else { this._foundMatches.hidden = true; this._foundMatches.value = ""; } window.clearTimeout(this._updateMatchCountTimeout); } } gFindBar.__proto__._countMatches = function(aWord, aWindow) { var win = aWindow || this.browser.contentWindow; var countFound = 0; for (var i = 0, count; win.frames && i < win.frames.length; i++) { if ((count = this._countMatches(aWord, win.frames[i])) != -1) countFound += count; else return count; } var doc = win.document; if (!doc || !(doc instanceof HTMLDocument)) return countFound; var body = doc.body; var count = body.childNodes.length; var searchRange = doc.createRange(); var startPt = doc.createRange(); var endPt = doc.createRange(); searchRange.setStart(body, 0); searchRange.setEnd(body, count); startPt.setStart(body, 0); startPt.setEnd(body, 0); endPt.setStart(body, count); endPt.setEnd(body, count); var retRange = null; var finder = Components.classes["@mozilla.org/embedcomp/rangefind;1"] .createInstance() .QueryInterface(Components.interfaces.nsIFind); finder.caseSensitive = this._shouldBeCaseSensitive(aWord); var matchLimit = 100; while ((retRange = finder.Find(aWord, searchRange, startPt, endPt))) { if (this._rangeIsVisible(retRange, win)) { if (this._findMode == this.FIND_LINKS) { if (this._rangeStartsInLink(retRange)) ++ countFound; } else ++ countFound; } if (countFound == matchLimit) { countFound = -1; break; } startPt = doc.createRange(); startPt.setStart(retRange.startContainer, retRange.startOffset + 1); } return countFound; } gFindBar.__proto__._rangeIsVisible = function(aRange, aWindow) { var node = aRange.startContainer; if (node.nodeType == node.ELEMENT_NODE) { if (node.hasChildNodes) { var childNode = node.childNodes[aRange.startOffset]; if (childNode) node = childNode; } } while (node && node.nodeType != node.ELEMENT_NODE) node = node.parentNode; if (node) { var style = aWindow.getComputedStyle(node, ""); if (style) { if (style.visibility == "hidden" || style.visibility == "collapse" || style.display == "none") return false; if (style.left != "auto" && style.width != "auto") if (style.left < 0 && style.left + style.width < 0) return false; if (style.top != "auto" && style.height != "auto") if (style.top < 0 && style.top + style.height < 0) return false; } } return true; } gFindBar.__proto__._rangeStartsInLink = function(aRange) { var isInsideLink = false; var node = aRange.startContainer; if (node.nodeType == node.ELEMENT_NODE) { if (node.hasChildNodes) { var childNode = node.childNodes[aRange.startOffset]; if (childNode) node = childNode; } } const XLink_NS = "http://www.w3.org/1999/xlink"; do { if (node instanceof HTMLAnchorElement) { isInsideLink = node.hasAttribute("href"); break; } else if (typeof node.hasAttributeNS == "function" && node.hasAttributeNS(XLink_NS, "href")) { isInsideLink = (node.getAttributeNS(XLink_NS, "type") == "simple"); break; } node = node.parentNode; } while (node); return isInsideLink; } eval("gFindBar._updateCaseSensitivity=" + gFindBar._updateCaseSensitivity.toString().slice(0, -1) + "this._updateMatchesCount();}"); eval("gFindBar._updateStatusUI=" + gFindBar._updateStatusUI.toString().slice(0, -1) + "this._updateMatchesCount();}"); // 検索バーをCtrl + Fでトグルする eval('gFindBar.open = ' + gFindBar.open.toString().replace('{','{if(!this.hidden){gFindBar.close();return;}')); // 検索バーからフォーカスを外し画面クリックで検索バーを閉じる function closeFindbar(e){ if (!gFindBar.hidden) { // if(e.target.id != "FindToolbar"){ // console.log('* '+e.target+' '+e.target.nodeName); // console.log('* '+e.originalTarget+' '+e.originalTarget.nodeName); if (e.target.nodeName != 'tabbrowser') { gFindBar.close(); } } } addEventListener('mousedown', closeFindbar, false); addEventListener('keydown', closeFindbar, false); // 検索バーの上をマウスホイールで↑↓検索 gFindBar.addEventListener('DOMMouseScroll', function (event){ gFindBar.onFindAgainCommand(event.detail < 0); }, false); function ClearFindbarButton() { /* // var elem = gBrowser.getBrowserForTab(event.target).parentNode; var elem = gFindBar; console.log('* '+elem.nodeName); var refNode = document.getAnonymousElementByAttribute(elem, 'anonid', 'find-next'); console.log('* '+refNode); */ var ClearFindbarBtn = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'clearFindbar-button'); if (ClearFindbarBtn) return; var refNode = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'find-next'); if (!refNode) return; ClearFindbarBtn = document.createElement("toolbarbutton"); ClearFindbarBtn.setAttribute("anonid", "clearFindbar-button"); ClearFindbarBtn.setAttribute("type", "button"); ClearFindbarBtn.setAttribute("class", "toolbarbutton-1"); ClearFindbarBtn.setAttribute("oncommand", "clearFindbarTweak.onCommand(event);"); ClearFindbarBtn.setAttribute("label", " Löschen "); ClearFindbarBtn.setAttribute("tooltiptext", "Inhalt der Suchleiste löschen"); ClearFindbarBtn.style.listStyleImage = "url('')"; refNode.parentNode.insertBefore(ClearFindbarBtn, refNode); clearFindbarTweak = { onCommand: function(event) { var findBar = gFindBar; var findField = findBar.getElement('findbar-textbox'); // var highlightBtn = findBar.getElement("highlight"); // var historyfindBar = document.getElementById('historyfindbar'); // var historyfindField = document.getElementById('find-field2'); if (!findBar.hidden) { findField.focus(); findField.select(); findField.value = ""; }; } }; }; ClearFindbarButton(); gBrowser.tabContainer.addEventListener('TabSelect', ClearFindbarButton); })(); /* // 検索バーに消去ボタンを付けたったで (function ClearFindbarButton() { var refNode = document.getAnonymousElementByAttribute(gFindBar, 'anonid', 'find-next'); if (!refNode) return; const locale = (Components.classes["@mozilla.org/preferences-service;1"] .getService(Components.interfaces.nsIPrefBranch).getCharPref("general.useragent.locale")).indexOf("zh")==-1; var ClearFindbarBtn = document.createElement("toolbarbutton"); ClearFindbarBtn.setAttribute("id", "clearFindbar-button"); ClearFindbarBtn.setAttribute("type", "button"); ClearFindbarBtn.setAttribute("class", "toolbarbutton-1"); ClearFindbarBtn.setAttribute("oncommand", "clearFindbarTweak.onCommand(event);"); ClearFindbarBtn.setAttribute("label", " Löschen "); ClearFindbarBtn.setAttribute("tooltiptext", "Inhalt der Suchleiste löschen"); ClearFindbarBtn.style.listStyleImage = "url('')"; refNode.parentNode.insertBefore(ClearFindbarBtn, refNode); clearFindbarTweak = { onCommand: function(event) { // var findBar = document.getElementById('FindToolbar'); // var findField = document.getElementById('FindToolbar').getElement('findbar-textbox'); var findBar = gFindBar; var findField = findBar.getElement('findbar-textbox'); var highlightBtn = findBar.getElement("highlight"); var historyfindBar = document.getElementById('historyfindbar'); var historyfindField = document.getElementById('find-field2'); if (findBar.hidden == false) { findField.focus(); findField.select(); findField.value = ""; } if (historyfindBar.hidden == false && historyfindField != null) { historyfindField.focus(); historyfindField.select(); historyfindField.value = ""; } else return; } } })(); */
-
Ja, jetzt ist auch beim Öffnen einer Seite in einem neuen Tab die Löschen-Schaltfläche vorhanden.
-
Prima, der Button ist zurück
Wo muss man ansetzen um die Zeit bis zum automatischen Verschwinden entweder zu verlängern oder aber ganz zu unterbinden? -
Die ausgedünnte (viele Kommentare entfernt) Variante des Skripts liegt jetzt auch auf Github.
Zum Timeout bis zum Schliessen: Wenn man die Findbar zunächst mit Strg+F öffnet, bleibt sie offen. Ansonsten kannst du hier mal stöbern: http://kb.mozillazine.org/Accessibility.…eadfind.timeout
-
-
Technischer Hintergrund, wen es interessiert:
Seit Fx 25 gibt es nicht mehr eine Findbar für das gesamte Fenster, sondern für jeden Tab eine.
Im DOM ist damit einiges anders und damit funktioniert das alte Skript nicht mehr.Zitat von milupoIch glaube, ich habe die Ursache gefunden.
Seit Fx 26 werden die Methoden getAnonymousNodes, getAnonymousElementByAttribute, getBindingParent und loadBindingDocument beim Objekt document nicht mehr unterstützt, siehe hier unter XBL-related methods have been removed:
Site Compatibility for Firefox 26
Die in Zeile 9 des Skripts vorkommende Methode getAnonymousElementByAttribute gehört dazu.
Das hat im diesem Fall damit nichts zu tun, denn:Es gibt im Browserfenster den chrome-Bereich, das ist die Benutzeroberfläche von Firefox, und den content-Bereich, das ist die angezeigte Webseite (oder about:-Seite, lokale Seite usw.).
Siehe dazu auch MDN - Chrome.
Die Funktionen getAnonymousNodes usw. wurden für das Objekt document im content-Bereich entfernt, für den chrome-Bereich bleiben sie.Zitat von aborix
Die Leiste klappt ein, wenn man in einen Bereich außerhalb der Leiste klickt. [...] Das lässt sich aber ändern.
Um das zu ändern, sind diese Zeilen (168 und 169 in der neuen Version auf github) auszukommentieren:Zitat
addEventListener('mousedown', closeFindbar, false);
addEventListener('keydown', closeFindbar, false);
Die Änderung funktioniert nur, wenn die Leiste über Bearbeiten → Suchen oder mit Strg+F geöffnet wird; nicht beim Öffnen durch Eintippen. -
Findbar Plus:
Sitzt bei euch der Löschen-Button auch zwischen den beiden Pfeilen?
[attachment=0]screenshot_013.png[/attachment]
ganz links wäre er mir lieber.
-
Ja ist hier auch so...
-
Löschbutton links:
Ersetze in Zeile 180 'find-next' durch 'find-previous' .
-
-