2017-02-27 6 views
0

Ich arbeite an einer Chrome-Erweiterung. Ich injiziere ein Skript in Seiten und injiziere auch jquery, um in meinem Skript verwendbar zu sein.Jquery - So stellen Sie sicher, dass es nicht überschrieben wird

Ich habe eine andere Erweiterung namens Boomerang hinzugefügt, und seitdem ist jquery nicht definiert. Was ich bisher versucht habe:

myJquery = jQuery.noConflict(); 

Manchmal funktioniert, manchmal nicht. Wenn ich nach myJquery in der Konsole suche, existiert es manchmal, manchmal ist es undefined - so ist $ oder JQuery. Race Zustand?

jQuery.noConflict(); 

in einer Funktion für alle meine Vermögenswerte warten injiziert werden (mit einem `setInterval zu überprüfen, bis ich sie finden) funktioniert auf die gleiche - manchmal ja manchmal nicht.

Ich bin ein wenig aus Ideen. Es scheint, dass Boomerang die Wurzel des Problems ist, aber wenn es hier auftritt, könnte es auch mit anderen Erweiterungen auftreten. Gibt es eine Möglichkeit, dass ich meine Funktionen nicht in ihren eigenen Namespace oder so etwas definieren kann?

[EDIT] ich dekompilierten sie genau denselben Stapel wie mich verwenden Boomerang den Code und fand heraus: Gmail.js und JQuery. Hier in ihrem Code ist, was ich glaube, hier fehlerhaft zu sein:

function h() { 
    V = String(document.location); 
    "undefined" === typeof window.jQuery && 0 > V.indexOf("ContactManager") ? Eb = 
     setTimeout(h, 500) : (a = ia = window.jQuery.noConflict(!0), window.b4g.$ = a, setTimeout(Lc, 0), setTimeout(z, 0)) 
} 

ich nicht wirklich die Bedeutung dieses window.jQuery.noConflict(!0) verstehen, aber es sieht nicht gut aus ...

+2

Bearbeiten Sie jquery.js und ändern Sie den Namen der Standardvariablen in etwas absolut Einmaliges. – wOxxOm

+0

Hey, und danke. Aber ich kann das nicht tun - ich benutze Plugins und sie rufen jQuery, nicht MyLovelyJponey :) –

+2

Es scheint, dass das Problem von diesen Plugins verursacht wird, die nicht noConflict'ed jQuery-Namen berücksichtigen. Sie können Plugins auch bearbeiten. – wOxxOm

Antwort

0

So arbeitete ich es um. Hier ist was ich getan habe. Ich habe die Injektion von jQuery und seinen Abhängigkeiten verzögert, indem ich nur das Hauptskript injiziert habe. Und mit einem rekursiven setTimeout war ich in der Lage, jQuery aus dem injizierten Skript selbst zu injizieren, indem ich die centent_script-Datei mit einem benutzerdefinierten Ereignis document.dispatchEvent(new CustomEvent("eventName", {})) aufruft. Wenn das content_script dies erfasst, injiziert es jQuery auf die Seite und löst ein anderes benutzerdefiniertes Ereignis aus, das ich zum Auslösen der Hauptfunktion verwende, und fügt alles ein, was ich glücklich in die dom einfügen muss, indem ich jquery!

Verwandte Themen