Funktioniert es in anderen Browsern auch bei Code-Boxen in neuen und geänderten Beiträgen?
Beiträge von aborix
-
-
Wenn ihr einen Beitrag mit einer Code-Box ändert, funktioniert es dann in dieser Code-Box ohne Neuladen?
-
Manchmal funktioniert das nicht bei einer Box, erst wenn man einen Reload der Seite per F5 macht, öffnet sich die Box.
Geschieht das bei einer Box in einem neuen oder geänderten Beitrag oder sonst auch?
-
Bitte teste:
Code
Alles anzeigen// ==UserScript== // @name doubleclick toggle code // @include https://www.camp-firefox.de/forum/thema/* // ==/UserScript== addEventListener('pageshow', function() { let codeBoxes = document.querySelectorAll('.codeBox.collapsibleBbcode'); for (let codeBox of codeBoxes) { let toggleButton = codeBox.querySelector('.toggleButton.jsToggleButtonEnabled'); if (toggleButton) { codeBox.addEventListener('dblclick', function() { toggleButton.click(); getSelection().removeAllRanges(); }); }; }; }, {once: true});
-
Wie wäre es außerdem mit einer Art "Spielwiese", also ein Thread, in dem man die Funktionsweise des neuen Editors ausprobieren kann, ohne daß man eine konkrete Frage stellen muss?
Es gibt einen solchen Thread:
-
Könntest du ein paar Mozilla-Quellen angeben, die beschreiben, wie sich XUL- und JavaScript-Elemente für XHTML ändern werden?
Ich weiß keine Quellen, ich müsste erst danach suchen. Ich gebe die Frage an Sören Hentzschel weiter.
-
Bitte, gern geschehen.
(Gilt auch für die anderen Threads. :wink: )
-
Könnte ein allgemeines Problem mit Scripten für Tabs sein:Ja, dIe Ursache ist die gleiche, XUL-Elemente der Tabs wurden durch XHTML-Elemente ersetzt.
Bitte testet:
Code
Alles anzeigenvar tab_hover = { event:null, tid:null, getTab: function(element) { while (element && element.localName != 'tab') { element = element.parentNode; }; return element; }, onLoad: function() { gBrowser.tabContainer.addEventListener("mouseout", tab_hover.onMouseOut, false); gBrowser.tabContainer.addEventListener("mouseover", tab_hover.onMouseOver, false); }, onUnload: function() { gBrowser.tabContainer.removeEventListener("mouseover", tab_hover.onMouseOver, false); gBrowser.tabContainer.removeEventListener("mouseout", tab_hover.onMouseOut, false); }, onMouseOver: function(event) { tab_hover.event = event.target; tab_hover.tid = setTimeout(function() { gBrowser.selectedTab = tab_hover.getTab(tab_hover.event); }, 250); }, onMouseOut: function() { clearTimeout(tab_hover.tid); } }; tab_hover.onLoad();
-
Teste:
Code
Alles anzeigen(function() { if (!window.gBrowser) return; let frameScript = function() { function urlMatches(aUrl) { const urls = [ 'https://www.firefox-forum.com/', 'https://www.camp-firefox.de/forum/viewforum.php?f=1', 'https://www.camp-firefox.de/forum/viewonline.php?sk=a&sd=a&sg=0', 'https://www.camp-firefox.de/forum/viewonline.php?sk=a&sd=d&sg=0', 'https://www.camp-firefox.de/forum/viewonline.php?sg=0&sk=a&sd=a&start=0', 'https://www.camp-firefox.de/forum/viewonline.php?sg=0&sk=b&sd=d&start=0', 'https://www.camp-firefox.de/forum/viewonline.php' ]; const urlPrefixes = [ 'https://www.camp-firefox.de/forum/index.php', 'https://www.camp-firefox.de/forum/memberlist.php?mode=' ]; return urls.includes(aUrl) || urlPrefixes.some(string => aUrl.startsWith(string)); }; addEventListener('DOMContentLoaded', function(event) { let document = event.target; if (!urlMatches(document.location.href)) return; let timId; if (!document.hidden) { let wait = 9000; if (document.URL.startsWith('about:neterror?')) { wait = 1000; }; timId = content.setTimeout(function() { document.location.reload(); }, wait); }; document.addEventListener('visibilitychange', function() { if (document.hidden) { content.clearTimeout(timId); } else { document.location.reload(); } }); }); }; let frameScriptURI = 'data:,(' + frameScript.toString() + ')()'; window.messageManager.loadFrameScript(frameScriptURI, true); })();
-
Teste folgendes userChromeJS-Skript, das auf dem Tampermonkey-Skript basiert.
Die Urls bei const urls müssen mit denen der betreffenden Seiten genau übereinstimmen.
Die Strings bei const urlPrefixes müssen Anfangsabschnitte der Urls der betreffenden Seiten sein (entspricht in der Tampermonkey-Syntax mit * am Ende).Code
Alles anzeigen(function() { if (!window.gBrowser) return; let frameScript = function() { function urlMatches(aUrl) { const urls = [ 'https://www.firefox-forum.com/', 'https://www.camp-firefox.de/forum/viewforum.php?f=1', 'https://www.camp-firefox.de/forum/viewonline.php?sk=a&sd=a&sg=0', 'https://www.camp-firefox.de/forum/viewonline.php?sk=a&sd=d&sg=0', 'https://www.camp-firefox.de/forum/viewonline.php?sg=0&sk=a&sd=a&start=0', 'https://www.camp-firefox.de/forum/viewonline.php?sg=0&sk=b&sd=d&start=0', 'https://www.camp-firefox.de/forum/viewonline.php' ]; const urlPrefixes = [ 'https://www.camp-firefox.de/forum/index.php', 'https://www.camp-firefox.de/forum/memberlist.php?mode=' ]; return urls.includes(aUrl) || urlPrefixes.some(string => aUrl.startsWith(string)); }; addEventListener('DOMContentLoaded', function(event) { let document = event.target; if (!urlMatches(document.URL)) return; let timId; if (!document.hidden) { timId = content.setTimeout(function() { document.location.reload(); }, 9000); } document.addEventListener('visibilitychange', function() { if (document.hidden) { content.clearTimeout(timId); } else { document.location.reload(); } }); }); }; let frameScriptURI = 'data:,(' + frameScript.toString() + ')()'; window.messageManager.loadFrameScript(frameScriptURI, true); })();
-
Bitte testen:
Code
Alles anzeigen(function() { if (!window.gBrowser) return; gBrowser.tabContainer.addEventListener('dblclick', function(event) { if (event.button != 0) return; let element = event.target.parentNode; while (element) { if (element.localName == 'tab') { element.linkedBrowser.reload(); return; }; element = element.parentNode; }; }); })();
-
Teste:
Code
Alles anzeigen(function() { if (!window.gBrowser) return; setTimeout(() => { let tab = gBrowser.tabs[0]; while (tab && tab.pinned) { tab.linkedBrowser.reload(); tab = tab.nextSibling; }; while (tab) { if (tab.selected) { tab.linkedBrowser.reload(); } else { tab.notReloaded = true; }; tab = tab.nextSibling; }; gBrowser.tabContainer.addEventListener('TabSelect', event => { let tab = event.target; if (tab.notReloaded) { setTimeout(() => { tab.linkedBrowser.reload(); tab.notReloaded = undefined; }, 500); }; }, true); }, 2000); })();
-
Was ich jetzt auf die Schnelle nicht sehe: Man muss mit der linken Maustaste klicken?Ja, das wird im Event Listener für 'mousedown' abgefragt und im Event Listener für 'click' braucht man es dann nicht mehr.
-
-
-
Teste:
Code
Alles anzeigen(function() { if (location != 'chrome://browser/content/browser.xul') return; var bmToolbar = document.getElementById('PersonalToolbar'); var textbox = gURLBar.textbox; var goButton = gURLBar.goButton; var dropmarker = document.getAnonymousElementByAttribute(textbox, 'anonid', 'historydropmarker'); function showTb() { CustomizableUI.setToolbarVisibility('PersonalToolbar', true); }; function hideTb() { if (!bmToolbar.collapsed) { CustomizableUI.setToolbarVisibility('PersonalToolbar', false); }; }; hideTb(); textbox.addEventListener('keypress', function(event) { if (event.keyCode == 13) { // Enter-Taste hideTb(); }; }); window.addEventListener('click', function(event) { if (event.button == 0) { if (event.target == textbox && event.originalTarget != goButton && event.originalTarget != dropmarker && bmToolbar.collapsed) { showTb(); } else { hideTb(); }; } else if (event.button == 1) { hideTb(); }; }, true); })();
-
Noch eine neue Version, sie funktioniert in Fx 67 und 68. Das Autopopup erfolgt bei allen standardmäßig vorhandenen Menüs und Buttons, außerdem im Anpassen-Modus bei den drei Buttons unten und im Bibliotheksfenster. Das Ausblenden beim Mouseout funktioniert in Fx 68 meistens, in Fx 67 öfters nicht.
Code
Alles anzeigen// ==UserScript== // @name AutoPopup.uc.js // @description Auto popup menulist/menupopup // @compatibility Firefox 67+ // @author GOLF-AT, modified by gsf & aborix // @version 2019.05.18 // ==UserScript== (function() { const showDelay = 200; // delay of showing popups const hideDelay = 500; // delay of hiding popups const AlwaysPop = false; // show popups also when window is not focused var overElt = null; var PopElt = null; var PopTimer = null; var HideTimer = null; // elements are CSS selector strings var BlackIDs = []; // whitelist, and trigger action var whiteIDs = [ { id: 'omnibar-defaultEngine', popMemu: 'omnibar-engine-menu', run: function(overElem) { document.getElementById('omnibar-in-urlbar').click(0); } }, { id: 'ucjs_zoom_statuslabel', popMemu: 'ucjs_zoom-context', run: null }, { id: 'UserScriptLoader-icon', popMemu: 'UserScriptLoader-popup', run: null }, { id: 'readLater', popMemu: 'readLater-popup', run: null //function(overElem) {PopElt.popup();} }, { id: 'foxyproxy-toolbar-icon', popMemu: 'foxyproxy-toolbarbutton-popup', run: null } ]; var whitesInx = -1; const popupPos = ['after_start', 'end_before', 'before_start', 'start_before']; const searchBar = window.BrowserSearch ? BrowserSearch.searchBar : null; function IsButton(elt) { return elt && (elt.localName == 'toolbarbutton' || elt.localName == 'button'); } function IsWidgetBtn(elt) { return IsButton(elt) && ((elt.hasAttribute('widget-id') && elt.getAttribute('widget-type') == 'view') || elt.id == 'fxa-toolbar-menu-button' || elt.id == 'library-button' || elt.id == 'alltabs-button'); } function IsSearchBtn(elt) { return (elt && elt.className == 'searchbar-search-button') || whitesInx == 0; } function IsPanelMenuBtn(elt) { return elt && elt.id == 'PanelUI-menu-button'; } function IsDownloadBtn(elt) { return elt && elt.id == 'downloads-button'; } function IsMenuBtn(elt) { return IsPanelMenuBtn(elt) || IsDownloadBtn(elt) || IsWidgetBtn(elt) || (IsButton(elt) && getPopupMenu(elt)); } function IsOverflowBtn(elt) { return elt && elt == document.getElementById('nav-bar-overflow-button'); } function IsUrlbarDropmarker(elt) { try { return elt.getAttribute('anonid') == 'historydropmarker'; } catch(e) { } } function IsCustomizationBtn(elt) { return IsButton(elt) && elt.className == 'customizationmode-button'; } function IsAutoComplete(elt) { try { return elt.getAttribute('type').substr(0, 12) == 'autocomplete'; } catch(e) { } } function isBlackNode(elt) { return BlackIDs.some(function(css) { try { var nodes = document.querySelectorAll(css); } catch(e) { return false; } for (var node of nodes) { if (node == elt) return true; } return false; }) } function getPopupNode(node) { if (whitesInx > -1 && PopElt) return PopElt; if (IsSearchBtn(node) || IsOverflowBtn(node) || node.id == 'sidebar-switcher-target') return node; var elt, isPop, s; for (; node != null; node = node.parentNode) { if (node == PopElt) return node; isPop = false; // node isn't popup node s = node.localName; if (s == 'menupopup' || s == 'popup' || s == 'menulist' || IsAutoComplete(node) || IsMenuBtn(node)) { isPop = true; } else if (s == 'dropmarker') { if (node.getAttribute('type') == 'menu') { if (node.parentNode.firstChild.localName == 'menupopup') isPop = true; } else if (IsUrlbarDropmarker(node)) isPop = true; } else if (s == 'menu') { isPop = (node.parentNode.localName == 'menubar'); } else if (IsButton(node)) { for (elt = node; (elt = elt.nextSibling) != null;) { if (elt.localName == 'dropmarker' && elt.boxObject.width > 0 && elt.boxObject.height > 0) break; } if (elt) break; } if (isPop) break; } if (PopElt && node) { // whether node is child of PopElt for (elt = node.parentNode; elt != null; elt = elt.parentNode) { if (elt == PopElt) return PopElt; } } return isPop ? node : null; } function getPopupMenu(elt) { if (whitesInx > -1 && PopElt) return PopElt; var nodes = elt ? elt.ownerDocument.getAnonymousNodes(elt) || elt.childNodes : null; if (nodes) { for (let node of nodes) { if (node.localName == 'menupopup' || node.localName == 'panel') return node; } } var s = elt.getAttribute('popup'); return s ? document.getElementById(s) : null; } function getPopupPos(elt) { if (elt.id == 'bookmarks-menu-button') return null; var x, y, pos, box; for (pos = 0, x = elt.boxObject.screenX, y = elt.boxObject.screenY; elt != null; elt = elt.parentNode) { if (elt.localName == 'window' || !elt.parentNode) break; else if (elt.localName != 'toolbar' && elt.localName != 'hbox' && elt.localName != 'vbox'); else if (elt.boxObject.height >= 3 * elt.boxObject.width) { if (elt.boxObject.height >= 45) { pos = 9; break; } } else if (elt.boxObject.width >= 3 * elt.boxObject.height) { if (elt.boxObject.width >= 45) { pos = 8; break; } } } try { box = elt.boxObject; x = (pos & 1) ? (x <= box.width / 2 + box.screenX ? 1 : 3) : (y <= box.height / 2 + box.screenY ? 0 : 2); } catch(e) { x = 0; } return popupPos[x]; } function AutoPopup() { PopTimer = null; if (!overElt) return; if (whitesInx > -1 && PopElt && whiteIDs[whitesInx].run) { whiteIDs[whitesInx].run(overElt); return; } if (!PopElt) PopElt = overElt; if (overElt.localName == 'dropmarker') { if (IsUrlbarDropmarker(overElt)) { PopElt = gURLBar.panel; if (!gURLBar.textbox.hasAttribute('open')) overElt.click(); } else PopElt.showPopup(); } else if (overElt.localName == 'menulist') { overElt.open = true; } else if (IsPanelMenuBtn(overElt)) { PopElt = document.getElementById('appMenu-popup'); PanelUI.show(); } else if (IsWidgetBtn(overElt)) { PopElt = document.getElementById('customizationui-widget-panel'); if (overElt.hasAttribute('onmousedown')) overElt.dispatchEvent(new MouseEvent('mousedown')); else overElt.dispatchEvent(new UIEvent('command')); } else if (IsDownloadBtn(overElt)) { PopElt = document.getElementById('downloadsPanel'); DownloadsPanel.showPanel(); } else if (IsSearchBtn(overElt)) { searchBar.openSuggestionsPanel(); } else if (IsOverflowBtn(overElt)) { PopElt = document.getElementById('widget-overflow'); if (!overElt.open) overElt.click(); } else if (overElt.id == 'sidebar-switcher-target') { PopElt = document.getElementById('sidebarMenu-popup'); if (!overElt.classList.contains('active')) SidebarUI.toggleSwitcherPanel(); } else { PopElt = getPopupMenu(overElt); if (IsCustomizationBtn(overElt)) overElt.open = true; else { try { let Pos = getPopupPos(overElt); PopElt.removeAttribute('hidden'); PopElt.openPopup(overElt, Pos, 0, 0, false, false, null); } catch(e) { PopElt = null; } } } } function HidePopup() { try { if (overElt.localName == 'dropmarker') { try { PopElt.parentNode.closePopup(); } catch(e) { try { PopElt.hidePopup(); } catch(e) { } } } else if (overElt.localName == 'menulist') PopElt.open = false; else if (PopElt && PopElt.hidePopup) PopElt.hidePopup(); else if (PopElt.popupBoxObject) PopElt.popupBoxObject.hidePopup(); else if (IsSearchBtn(overElt)) searchBar.textbox.closePopup(); else if (IsPanelMenuBtn(overElt)) PanelUI.hide(); } catch(e) { } HideTimer = null; overElt = PopElt = null; } function MouseOver(e) { if (!AlwaysPop && !document.hasFocus()) return; var popNode, n = e.originalTarget; whitesInx = -1; if (n.hasAttribute('id') && whiteIDs.some(function(k,i,me) { if (k.id == n.id) { overElt = n; whitesInx = i; PopElt = document.getElementById(k.popMemu); PopTimer = setTimeout(AutoPopup, showDelay); return true; } })) return; popNode = getPopupNode(e.originalTarget); if (!popNode || (popNode && popNode.disabled) || isBlackNode(popNode)) { MouseOut(); return; } if (HideTimer) { window.clearTimeout(HideTimer); HideTimer = null; } try { if (IsAutoComplete(popNode)) { return; }; for (var elt = popNode; elt != null; elt = elt.parentNode) { if (elt.localName == 'menupopup' || elt.localName == 'popup') return; } } catch(e) { } if (PopElt && popNode == PopElt && PopElt != overElt) return; if (overElt && popNode != overElt) HidePopup(); overElt = popNode; PopElt = null; PopTimer = setTimeout(AutoPopup, showDelay); } function MouseOut() { if (PopTimer) { window.clearTimeout(PopTimer); PopTimer = null; } if (!HideTimer && PopElt) HideTimer = window.setTimeout(HidePopup, hideDelay); } window.addEventListener('mouseover', MouseOver, false); })();
-
-
-
Alles Gute!