Nur zur Klarstellung, damit es niemand missversteht:
Webseiten werden hier ausschliesslich mit Stylus behandelt.
Das funktioniert nicht mit den about:-Seiten, und, nicht zu vergessen, auch nicht mit den Seiten von Addons (moz-extension:).
Nur zur Klarstellung, damit es niemand missversteht:
Webseiten werden hier ausschliesslich mit Stylus behandelt.
Das funktioniert nicht mit den about:-Seiten, und, nicht zu vergessen, auch nicht mit den Seiten von Addons (moz-extension:).
Änderung 07.04.2021: Aktualisierung für Firefox 87 – file://- und chrome://-Adressen werden als lokale Ressource erkannt, ebenso viele about:-Seiten, die zuvor als unbekannte Identität eingestuft worden waren (was ich, anscheinend nicht ganz zu Unrecht, für einen Bug gehalten habe).
das Script funktioniert erst, wenn ich den Javascript-Chache lösche
Ich weiß nicht, ob das noch etwas bewirkt, ich hab es seit Urzeiten in meiner userChrome.js (also die Datei im Profil-Chrome-Verzeichnis):
Du kannst ja mal testen, ob es bei dir hilft.
Das tut mir leid, wenn du ein Problem damit hast, wie ich meine Frage formuliert habe, aber es war eine legitime Frage, woher diese Annahme stammt.
OK.
Wie kommst du darauf, dass Link Prefetching dafür sorgen würde, dass ein nicht besuchter Link als besucht markiert wird?
Das stimmt definitiv nicht und würde auch keinen Sinn ergeben.
Ja, dann lag ich eben falsch und du hast es richtig gestellt.
(Der vorwurfsvolle Stil Deiner Frage gefällt mir gar nicht.)
Habe ein js-script gefunden
Habe ein weiteres js-script gefunden
Einerseits: Nett, dass Du auf Funde hinweist, aber andererseits: Wäre es nicht einfacher, direkt auf https://github1s.com/aminomancer/uc…b/master/script und eventuell sogar die Originalseite https://github.com/aminomancer/uc.css.js zu verlinken? Dann könnten sich andere auch (leichter) die weiteren Skripte ansehen.
Das Script stellt das alte Verhalten für einmalige Suchmaschinen-Schaltflächen wieder her
Alternativer Tipp von mir: alternative_searchbar.uc.js von https://github.com/Aris-t2/CustomJSforFx.
Ich habe festgestellt das es mitunter sehr schwierig ist in der Chronik die richtige Webseit heraus zu finden.
Man kann die Chronik auch noch durchsuchen.
Warum ist beim erneuten Aufruf der Seite, nach dem löschen der Chronik, der Link rot wenn ich diesen noch nicht angewählt habe.
Hast Du eventuell Prefetch aktiviert? Siehe dazu im Mozilla-Support: Firefox baut unaufgefordert Verbindungen auf – Vorabladen von Inhalten.
Die testweise Installation der Skripte zur Umgehung der Altersbeschränkung auf Youtube hatte keine Wirkung.
YouTube: Age Verification Bypass funktioniert bei mir.
Ich habe gestern angefangen den readme für das Script zu erweitern.
Gefällt mir. Wer nicht weiß, wie man die Werte ändert, kann doch nachfragen …
Bei manchen ist die Quelle auch überhaupt nicht mehr bekannt. Und es kursieren auch oft mehrere Versionen.
Man hat das Skript mal irgendwo herbekommen. Diesen Link gibt man dann an.
Aborix stellt seine Skripte nur hier rein.
Hier wäre das dann der Link zum jeweiligen Posting.
Man müsste also das Forum nach den Skripten durchsuchen, um die Beiträge zu finden.
Nein, wenn man sich den Link in die erste Zeile des Skripts als Kommentar kopiert. Das hätte den angenehmen Nebeneffekt, dass er bei einer Neuveröffentlichung automatisch mit kopiert würde – er muss dann natürlich angepasst werden, wenn es ein Update gibt. Mach ich für mich bei Skripten hier aus dem Forum seit Jahren so (Aris und AliceWhite0775 haben selbst entsprechende identifizierende Zeilen in ihren Skripten). Es wird dann noch wenige Ausnahmen geben, wo das alles nicht möglich ist, damit muss man dann leben (wenn das Skript ursprünglich in einer Konversation veröffentlicht wurde, könnte darauf aber beispielsweise hingewiesen werden; ich würde mir selbst dann den Link auf dieses Posting setzen). Hier im Thread habe ich es nicht gemacht, weil ich der Meinung war, dass es aus dem Kontext klar wird.
Wir können von mir aus hiermit aber Schluss machen, weil ich das Gefühl habe dass ich sinnlos gegen Windmühlen ankämpfe.
Du benötigst ein sogenanntes Userskript (nicht zu verwechseln mit UserChrome-Skript). Dazu musst Du dir eines der Monkey-Addons installieren und dann nach einem passenden Skript suchen. das Problem ist, dass YouTube immer mal wieder Änderungen durchführt und bisherige Skripte dann manchmal nicht mehr funktionieren, so dass man dann nach aktualisierten Skripten suchen muss, denn leider machen das nicht alle der Skriptautoren.
Wegen der Addons: Ich selbst benutze Violentmonkey, aber vielleicht kommst Du mit dem Original Greasemonkey oder mit Tampermonkey besser klar – und ich habe eben einen interessanten Neuling entdeckt: FireMonkey (der auch Userstile integriert!).
Wegen der Skripte: Man muss immer mal wieder in Greasy Fork oder OpenUserJS nach "youtube autoplay" suchen. Ich selbst nutzte sehr lange No Youtube Autoplay - Next video button disable / disabled, das aber letztes Jahr nicht mehr funktionieren wollte und weswegen ich auf YouTube Click To Play auswich, was wiederum kürzlich ebenfalls Probleme machte. Das alte Skript hatte ich zum Glück nicht gelöscht, sondern nur deaktiviert, so dass ich bemerkte, dass es kürzlich ein Update gab.
Mein Vorschlag dazu das Script so wie es ab Firefox 87 läuft
bei Github hochladen und in der readme dann weitere Erklärungen und
Änderungsbeispiele anführen.
Gute Idee! Also nochmal
Milupo, noch einmal …
Allerdings hast Du natürlich insofern Recht, als es viiiel einfacher ist, nur den dritten Wert an den zweiten anzupassen.
Das war gewissermaßen schon eine Art des Einlenkens, während ich meinen Beitrag schrieb.
Hilft aber nur, wenn man auch dorthin verlinkt.
Das ist ja im Prinzip seit Jahren mein Reden, dass man die Quelle wenigstens nennt … einerseits wegen der Urheberschaft, aber auch, weil man dann unter Umständen nach Aktualisierungen sehen kann (externe Skripte, Skripte hier in einem Thema, das man verpasst hat …). Ich erzeuge damit aber irgendwie immer schlechte Laune.
Das kann jeder für sich entscheiden, vielleicht fügt man einen Kommentar in das Skript ein, der auf die unterschiedlichen Möglichkeiten hinweist.
Dann benötigt man aber den Repeating-Linear-Gradient nicht und keine drei Wertangaben und auch keine Angabe zum Winkel, sondern es würde ein weiterer Linear-Gradient ausreichen (also ein vor den schon vorhandenen gesetzter). Allerdings hast Du natürlich insofern Recht, als es viiiel einfacher ist, nur den dritten Wert an den zweiten anzupassen.
Endor bevorzugt gestreift und ich verwende derzeit auch gestreift.
Me too. War meines Erachtens auch schon bei den Addons so.
Einfach die URL eines Themas oder Beitrags einfügen,
(etc.) Danke!
Du kannst jederzeit die manuelle Link-Funktion nutzen.
So, wie ich es schon die ganze Zeit mache … deswegen ja die Nachfrage.
Das funktioniert bei mir gar nicht im Nightly. Ich habe dann z-index entfernt und dann läuft es.
Hmpf, dabei habe ich das extra in einem neuen Profil getestet – allerdings nicht ohne Z-Index.
Übrigens, bei der letzten Farbangabe von repeating-linear-gradient entscheidet die Pixelangabe darüber, ob der Balken durchgehend farbig (6px) oder nicht durchgehend farbig (12px) erscheint.
Oh, das ist ein Fehler. Bei mir selbst ist dieser Faux-Pas nicht vorhanden (stand schon seit weiß-ich-nicht-mehr auf 12px, vielleicht hatte ich das mal für mich korrigiert), aber ich hatte das Skript hier von weiter oben kopiert. Die Pixelangaben im Repeating-Linear-Gradient hängen natürlich voneinander ab; man könnte zum Beispiel auch den dritten Wert auf 6px belassen und dafür den zweiten auf 3px setzen. Bei gleichen Werten ergibt diese Deklaration keinen Sinn.
Endor , ich habe das Skript in Beitrag 30 aktualisiert. Neben der anderen Pixelangabe und der Entfernung des Z-Indexes habe ich auch ein (bei mir) unnötiges !important entfernt.
Sören Hentzschel (oder jemand anderes): wie fügt man das eigentlich hier ein? Also außer durch direktes Eintippen. Ich habe bisher immer ausschließlich die Linkfunktion genutzt (und mag die Einblendungen auch nicht, aber evtl. gibt es zum Teil doch Vorteile).
Ich habe jetzt mal bei #urlbar-background in meinem CSS-Code left: 2em; z-index: -2 dazugefügt und die Prozessleiste funktioniert nun:
[…]
Die Werte für left und z-index sind willkürlich gewählt. Wichtig ist hier, dass der Wert von z-index negativ sein muss.
Wow! Da denke ich mir doch, warum nicht alles auf #urlbar-background anwenden? Und das sieht bei mir mit dem anderen Userstil sogar besser aus!
(Edit: Ein Fehler im CSS-Code repariert: 1x 6px → 12px, entsprechend folgender Postings Z-Index in #urlbar-background entfernt.)
/* LoadingBar.uc.js */
// Location Bar Enhancer5.1; Loading Bar0.3.0
(function(){
var cssStr = `
#urlbar-background {
background-image: repeating-linear-gradient(-45deg, rgba(255,255,255,0), rgba(255,255,255,0) 6px, rgba(255,255,255,1) 6px, rgba(255,255,255,1) 12px), linear-gradient(to right, rgba(255,255,255) 0%, rgba(69,69,69) 100%);
background-size:0 0;
background-repeat:repeat-x, no-repeat;
transition: background-size 350ms ease 0s;
}
#urlbar-background:not([style="background-size: 0% 100%;"]) {
animation: progress-bar-stripes 2s linear infinite;
}
@keyframes progress-bar-stripes {
from {
background-position: 0 0;
}
to {
background-position: 51px 0;
}
}
`.replace(/\s{2,}|\r|\n/,"");
var style = document.createProcessingInstruction("xml-stylesheet", "type=\"text/css\"" + " href=\"data:text/css;base64," + btoa(cssStr) + "\"");
var mainW = document.getElementById("main-window");
document.insertBefore(style, mainW);
function main(window) {
var {document, gBrowser} = window;
function $(id) { return document.getElementById(id) };
var urlbar = $("urlbar-background");
let pageProgress = 0;
let async = makeWindowHelpers(window).async;
var LoadingBar = {
listener: {
onChangeTab: function(e) {
urlbar.style.backgroundSize = '0% 100%';
pageProgress = 0;
},
onProgressChange: function(aBrowser,webProgress,request,curSelfProgress,maxSelfProgress,curTotalProgress,maxTotalProgress) {
if (gBrowser.contentDocument === aBrowser.contentDocument) {
var val = (curTotalProgress-1)/(maxTotalProgress-1);
pageProgress = val;
urlbar.style.backgroundSize = (100*val) + '% 100%';
if (val > 0.9)
async(function() {
if (pageProgress > 0.95)
urlbar.style.backgroundSize = '100% 100%';
}, 1000);
}
},
onStateChange: function() {
if (pageProgress > 0.95){
async(function() {
urlbar.style.backgroundSize = '0% 100%';
pageProgress = 0;
}, 1000);
}else{
urlbar.style.backgroundSize = '0% 100%';
}
}
}
};
gBrowser.tabContainer.addEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
gBrowser.addTabsProgressListener(LoadingBar.listener);
unload(function() {
gBrowser.tabContainer.removeEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
gBrowser.removeTabsProgressListener(LoadingBar.listener);
}, window);
}
watchWindows(main, "navigator:browser");
function runOnLoad(window, callback, winType) {
window.addEventListener("load", function() {
window.removeEventListener("load", arguments.callee, false);
if (window.document.documentElement.getAttribute("windowtype") == winType)
callback(window);
}, false);
}
function runOnWindows(callback, winType) {
function watcher(window) {
try {
callback(window);
}
catch(ex) {}
}
let browserWindows = Services.wm.getEnumerator(winType);
while (browserWindows.hasMoreElements()) {
let browserWindow = browserWindows.getNext();
if (browserWindow.document.readyState == "complete")
watcher(browserWindow);
else
runOnLoad(browserWindow, watcher, winType);
}
}
function watchWindows(callback, winType) {
function watcher(window) {
try {
callback(window);
}
catch(ex) {}
}
runOnWindows(callback, winType);
function windowWatcher(subject, topic) {
if (topic == "domwindowopened")
runOnLoad(subject, watcher, winType);
}
Services.ww.registerNotification(windowWatcher);
unload(function() { Services.ww.unregisterNotification(windowWatcher) });
}
function unload(callback, container) {
let unloaders = unload.unloaders;
if (unloaders == null)
unloaders = unload.unloaders = [];
if (callback == null) {
unloaders.slice().forEach(function(unloader) { unloader() });
unloaders.length = 0;
return null;
}
if (container != null) {
container.addEventListener("unload", removeUnloader, false);
let origCallback = callback;
callback = function() {
container.removeEventListener("unload", removeUnloader, false);
origCallback();
}
}
function unloader() {
try {
callback();
}
catch(ex) {}
}
unloaders.push(unloader);
function removeUnloader() {
let index = unloaders.indexOf(unloader);
if (index != -1)
unloaders.splice(index, 1);
}
return removeUnloader;
}
function makeWindowHelpers(window) {
let {clearTimeout, setTimeout} = window;
function async(callback, delay) {
delay = delay || 0;
let timer = setTimeout(function() {
stopTimer();
callback();
}, delay);
function stopTimer() {
if (timer == null)
return;
clearTimeout(timer);
timer = null;
}
}
return {
async: async,
};
}
})();
Alles anzeigen
Endor , wenn es so läuft und Du das wieder übernimmst, erwähne auch und vor allem Milupo. Ich habe hier übrigens z-index: -1 gewählt. Und beachten: Ich habe nicht nur innerhalb des CSS-Bereichs etwas geändert, sondern auch in Zeile 33 32, damit das Skript überhaupt auf den Urlbar-Hintergrund angewandt wird. Das Skript habe ich wieder von weiter oben übertragen, kann also sein, dass die Farbangaben wieder geändert werden müssen.
O je, bei mir ist auch noch noch dieses aktiv: Adressleiste per CSS entsprechend Sicherheitsstatus einfärben.
Man findet darin diese Stilregel:
Endor ,
@laubenpieper oder milupo: Könnt ihr mal probeweise in das Skript im CSS-Bereich innerhalb desselben Urlbar-Selektors die beiden Deklarationen eintragen? Es geht hier, soweit ich mich erinnere, vor allem um den Z-Index.
Allerdings funktioniert das Skript so oder so nicht mehr exakt so wie früher.
Milupo, versteh ich das richtig, dass die Rundungen über den Userstil von dir selbst eingefügt sind, oder sind die demnächst Standard?
Vielen Dank für die Bearbeitung!
![]()
Habe es hochgeladen.
[…]
Gebe nun nochmals MIthrandir Bescheid.Erledigt
Freut mich alles!
Nachdem ich mich vor längerer Zeit mal damit beschäftigt hatte (vergleiche Posting vom 18. Juli 2019), hatte ich das Skript fast vergessen. Es lief einfach weiter und funktionierte. Ich benutzte die Version, wie sie Endor oben in Beitrag #2 präsentierte.
Nun fiel mir in Version 86 aber auf, dass es einen Fehler und eine Warnung verursachte (sicher schon länger), und ich hab es daraufhin leicht umgebaut (Änderungen nur in den Zeilen 5, 15, 17, 20 und 23 plus Kommentarzeile nach vorn verschoben):
/* LoadingBar.uc.js */
// Location Bar Enhancer5.1; Loading Bar0.3.0
(function(){
var cssStr = `
#urlbar {
background-image: repeating-linear-gradient(-45deg, rgba(255,255,255,0), rgba(255,255,255,0) 6px, rgba(255,255,255,1) 6px, rgba(255,255,255,1) 6px), linear-gradient(to right, rgba(255,255,255) 0%, rgba(69,69,69) 100%);
background-size:0 0;
background-repeat:repeat-x, no-repeat;
transition: background-size 350ms ease 0s !important;
}
#urlbar:not([style="background-size: 0% 100%;"]) {
animation: progress-bar-stripes 2s linear infinite;
}
@keyframes progress-bar-stripes {
from {
background-position: 0 0;
}
to {
background-position: 51px 0;
}
}
`.replace(/\s{2,}|\r|\n/,"");
var style = document.createProcessingInstruction("xml-stylesheet", "type=\"text/css\"" + " href=\"data:text/css;base64," + btoa(cssStr) + "\"");
var mainW = document.getElementById("main-window");
document.insertBefore(style, mainW);
function main(window) {
var {document, gBrowser} = window;
function $(id) { return document.getElementById(id) };
var urlbar = $("urlbar");
let pageProgress = 0;
let async = makeWindowHelpers(window).async;
var LoadingBar = {
listener: {
onChangeTab: function(e) {
urlbar.style.backgroundSize = '0% 100%';
pageProgress = 0;
},
onProgressChange: function(aBrowser,webProgress,request,curSelfProgress,maxSelfProgress,curTotalProgress,maxTotalProgress) {
if (gBrowser.contentDocument === aBrowser.contentDocument) {
var val = (curTotalProgress-1)/(maxTotalProgress-1);
pageProgress = val;
urlbar.style.backgroundSize = (100*val) + '% 100%';
if (val > 0.9)
async(function() {
if (pageProgress > 0.95)
urlbar.style.backgroundSize = '100% 100%';
}, 1000);
}
},
onStateChange: function() {
if (pageProgress > 0.95){
async(function() {
urlbar.style.backgroundSize = '0% 100%';
pageProgress = 0;
}, 1000);
}else{
urlbar.style.backgroundSize = '0% 100%';
}
}
}
};
gBrowser.tabContainer.addEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
gBrowser.addTabsProgressListener(LoadingBar.listener);
unload(function() {
gBrowser.tabContainer.removeEventListener('TabSelect',LoadingBar.listener.onChangeTab,false);
gBrowser.removeTabsProgressListener(LoadingBar.listener);
}, window);
}
watchWindows(main, "navigator:browser");
function runOnLoad(window, callback, winType) {
window.addEventListener("load", function() {
window.removeEventListener("load", arguments.callee, false);
if (window.document.documentElement.getAttribute("windowtype") == winType)
callback(window);
}, false);
}
function runOnWindows(callback, winType) {
function watcher(window) {
try {
callback(window);
}
catch(ex) {}
}
let browserWindows = Services.wm.getEnumerator(winType);
while (browserWindows.hasMoreElements()) {
let browserWindow = browserWindows.getNext();
if (browserWindow.document.readyState == "complete")
watcher(browserWindow);
else
runOnLoad(browserWindow, watcher, winType);
}
}
function watchWindows(callback, winType) {
function watcher(window) {
try {
callback(window);
}
catch(ex) {}
}
runOnWindows(callback, winType);
function windowWatcher(subject, topic) {
if (topic == "domwindowopened")
runOnLoad(subject, watcher, winType);
}
Services.ww.registerNotification(windowWatcher);
unload(function() { Services.ww.unregisterNotification(windowWatcher) });
}
function unload(callback, container) {
let unloaders = unload.unloaders;
if (unloaders == null)
unloaders = unload.unloaders = [];
if (callback == null) {
unloaders.slice().forEach(function(unloader) { unloader() });
unloaders.length = 0;
return null;
}
if (container != null) {
container.addEventListener("unload", removeUnloader, false);
let origCallback = callback;
callback = function() {
container.removeEventListener("unload", removeUnloader, false);
origCallback();
}
}
function unloader() {
try {
callback();
}
catch(ex) {}
}
unloaders.push(unloader);
function removeUnloader() {
let index = unloaders.indexOf(unloader);
if (index != -1)
unloaders.splice(index, 1);
}
return removeUnloader;
}
function makeWindowHelpers(window) {
let {clearTimeout, setTimeout} = window;
function async(callback, delay) {
delay = delay || 0;
let timer = setTimeout(function() {
stopTimer();
callback();
}, delay);
function stopTimer() {
if (timer == null)
return;
clearTimeout(timer);
timer = null;
}
}
return {
async: async,
};
}
})();
Alles anzeigen
Endor, willst Du das bei dir auf der Github-Ressource veröffentlichen? Mithrandir scheint ja leider völlig inaktiv zu sein.