benötigt jQuery für eine sichere Variable im Tampermonkey-Skript und in der Konsole

8

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:

%Vor%

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 ?

    
roberto tomás 01.02.2015, 16:21
quelle

2 Antworten

20

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.

  • vermeide Sicherheits-Sandbox mit @grant none
  • bleiben im Allgemeinen unwissend darüber, wo das Skript eingefügt wird / wann es ausgeführt wird
  • enthält eine spezielle Version von jQuery für unser UserScript
  • Behalten Sie die $ und jQuery-Verweise der Inhaltsseite auf jQuery oder nicht.
  • Erlauben Sie unserem Skript, den $ Alias ​​für seine jQuery Version
  • zu verwenden

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 Aufruf qualifiziert $ nicht explizit für einen Bereich
  • Und es wird nicht besonders gut funktionieren, wenn die Inhaltsseite auch eine andere Bibliothek enthält, die Alias ​​$ hat. Vor allem, wenn die Content-Seite bereits jQuery noConflict selbst aufgerufen hat, bevor wir hier ankommen. Dies ist ein unnötiges Kaninchenloch, in dem man sich verfangen kann.
  • Dieser Code platziert den Verweis auf unsere Bibliothek etwas alarmierend in den Bereich des Fensters, wo er sehr wohl später durch die Inhaltsseite geändert werden könnte. Es ist in der Regel eine schlechte Methode, aus naheliegenden Gründen etwas dem Fensterbereich auszusetzen.

Dieser Code stattdessen

%Vor%
  • Hält unsere Bibliothek in unserem Bereich, wo sie hingehört
  • gibt uns den $ alias in unserem Bereich, den wir weiterhin in unserem Skript
  • verwenden können
  • stellt die $ - und jQuery-Aliase des Fensters wieder her, die beim Laden unserer jQuery geladen wurden, unabhängig davon, ob sie tatsächlich jQuery oder nicht
  • waren
  • gibt uns die beste Möglichkeit, das vom Skript geladene jQuery-Objekt zum Aufruf von noConflict
  • zu verwenden

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%     
Sonic Beard 31.03.2015, 08:01
quelle
5

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.

Beispiel UserScript:

%Vor%

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.

Beispiel Konsoleneingabe / -ausgabe:

%Vor%     
Alexander O'Mara 07.02.2015 23:40
quelle