Normalerweise habe ich das folgende Code-Snippet verwendet, und dieses normalerweise funktioniert:
%Vor%Aber gelegentlich erhalte ich einen Fehler wie diesen auf Ссылка :
Weigerte sich, das Skript zu laden ' Ссылка ' weil es gegen die folgende Inhaltssicherheitsrichtlinienrichtlinie verstößt: "script-src 'unsafe-eval' 'self' 'nicht sicher-inline' 'unsafe-eval' Ссылка Ссылка Ссылка Ссылка Ссылка Ссылка Ссылка ".
Und die Lösung ist im Grunde, Sie müssen stattdessen die Header-Direktive @require
von TamperMonkey verwenden, etwa so:
Und das funktioniert gut, aber es lädt jQuery nicht sicher in die Variable jQ
, es clobbers $
. Ist das wirklich ein Problem? Ja, Sie können sehen, wie Paginierung in den Diskussionsthreads von steamcommunity.com bricht.
Gibt es einen Weg zu @require jQ=
und dann zu @grant jQ
- immer noch jQ
sowohl im Tampermonkey-Skript als auch in der Konsole, ohne Clobbering in-Page-Variablen ?
Abgesehen von der Vermeidung von Versionskonflikten und dem Brechen der Inhaltsseite mache ich eine Handvoll anderer Dinge in meiner Standard-Benutzerschablone, die jQuery enthält.
Die folgende Vorlage strebt an, die folgenden Ziele im Interesse einer universellen Vorlage für die Aufnahme von jQuery in neue Skripts zu erreichen, unabhängig vom aktuellen oder zukünftigen Status der Inhaltsseite in Bezug auf die eigene Aufnahme von jQuery Version.
Die Verwendung von @grant none ist hier der Schlüssel
%Vor%@grant funktioniert bei 99% meiner Skripte nicht. Sie ermöglicht einen einfachen Zugriff auf die Variablen, Funktionen und Objekte der Inhaltsseite, indem ein globaler Bereich für das UserScript (this) verwaltet wird und uneingeschränkter Zugriff auf den globalen Bereich der Inhaltsseite (Fenster) gewährt wird, indem beide Bereiche nach Variablen und Funktionsbezeichnern durchsucht werden , Fensterreihenfolge. Wenn Sie also verhindern, dass auf der Inhaltsseite vorhandene Kennungen dupliziert werden, können Sie auf Inhaltsseitenvariablen, Funktionen und Funktionsrückgabewerte zugreifen, ohne sich zu qualifizieren ("this." Oder "window."). Und Sie können dies von überall in Ihrem Skript tun.
Dies hebt das ursprüngliche Problem des OP hervor. Die Bequemlichkeit, die @grant keine bietet, ist auch der Grund, warum die @ require -Direktive die Referenzen $ und jQuery des Fensters beim Laden überschreibt. Die jQuery-Bibliothek enthält seit einiger Zeit die Funktion noConflict (), um genau dieses Problem zu behandeln.
Wir können sofort einige schnelle Verbesserungen an der obigen Antwort vornehmen, um unsere Sicherheit / Kompatibilität / Wiederverwendung zu erhöhen.
%Vor%Dieser Code stattdessen
%Vor%Dieser letzte Punkt ist wahrscheinlich übertrieben, aber warum nicht explizit sein und den jQuery-Bezeichner verwenden, um den noConflict-Aufruf zu machen. Es wäre zwar zu diesem Zeitpunkt unser Fehler, wenn $ nicht jQuery wäre, wenn dieser Aufruf ausgeführt wird (@require für eine andere Bibliothek, die $ verwendet, sie selbst verwendet, bevor dieser Code ausgeführt wird usw.), ist es eine freie Vorbeugung späterer Debugging-Bemühungen. p>
Obwohl wir damit fertig und glücklich sein können, können wir auch etwas weiter gehen, um die Kompatibilität auf den unterschiedlichsten Seiten und durch die größte Vielfalt an Änderungen der Inhaltsseite sicherzustellen.
%Vor%Auch wenn dies nicht garantiert ist, bietet dieses Muster Ihrem Funktionscode die beste Möglichkeit, die größte Vielfalt an Seitenlebenszyklus-Möglichkeiten zu nutzen, indem der $ Alias außerhalb des globalen Geltungsbereichs bleibt und jQuerys DOM-Ready-Ereignis genutzt wird, um den Seitenabschluss sicherzustellen. Nebenbei sorgt es auch für einen konsistenten undefinierten Wert für Ihren Code.
%Vor% TamperMonkey scheint diese Funktionalität nicht zu haben, aber eine Alternative wäre, $.noConflict
sofort mit dem Aufruf zu starten removeAll
Argument auf true
gesetzt. Dies bewirkt, dass jQuery die ursprünglichen $
und jQuery
auf ihre ursprünglichen Werte zurücksetzt.
Und Sie können an der folgenden Beispielkonsole sehen: jQ
ist die jQuery 2.1.3, die von @require
geladen wurde, jQuery
ist die Version von jQuery, die Seite wird geladen, und $
ist immer noch die Original-Prototyp-Bibliotheksobjekt, wie durch das Fehlen der fn
-Eigenschaft von jQuery belegt wird.
Tags und Links javascript jquery google-chrome tampermonkey