2010-09-11 6 views
17

Ich versuche, jQuery in einer Firefox-Erweiterung zu verwenden, und möchte jQuery verwenden, um das DOM der aktuellen Seite im Gegensatz zum Kontext der XUL-Datei zu bearbeiten. Daher lade ich jQuery in meine XUL-Datei und übergebe sie an einige meiner Skripte in einer Sandbox (mit dem Greasemonkey-Extension-Compiler http://arantius.com/misc/greasemonkey/script-compiler). Da jQuery nicht mit dem Seiten-DOM geladen wurde, möchte ich seinen Auswahlkontext auf das Seiten-DOM setzen, anstatt es immer in jQuery-Aufrufe zu übergeben.Standard-jQuery-Selektor-Kontext überschreiben

Ich folgte der Lösung bei How to use jQuery in Firefox Extension und es erreicht fast, was ich will.

Ich bin in der Lage, Aufrufe der jQuery() -Funktion zu machen, und die Seite DOM wird als Kontext verwendet. Allerdings kann ich Funktionen wie jQuery.trim nicht verwenden, da diese nicht definiert sind.

dachte ich diese Zeile aus der Lösung

$.fn = $.prototype = jQuery.fn; 

mein eigenes jQuery-Objekt erbt alle der jQuery Prototyp Eigenschaften, aber es offenbar nicht lassen.

Geben Sie ein Vanille-jQuery-Objekt, wie definiere ich es neu, um ein bestimmtes Element als Selektorkontext zu verwenden, während alle jQuery-Funktionen beibehalten werden?

+0

ich es für Sie hoffen funktioniert. Als ich versuchte, jQuery in einer Erweiterung zu verwenden und es in ein XUL-Overlay zu laden, löste es irgendwie die Überlagerungen anderer Plugins wie die Webdeveloper-Symbolleiste. Vielleicht klappt es jetzt besser. Passen Sie nur auf! –

Antwort

11

.trim(), .ajax() usw. sind statische Methoden, was bedeutet, dass sie an den jQuery-Konstruktor und nicht an dessen Prototyp gebunden sind.

jQuery.noConflict(); 
$ = function(selector,context){ return new jQuery.fn.init(selector,context||example.doc); }; 
$.fn = $.prototype = jQuery.fn; 
jQuery.extend($, jQuery); // copy's trim, extend etc to $ 

jedoch eine vielleicht nette Weise ist jQuery intakt und gehen Sie wie folgt zu verlassen:

var fromDoc = $(document); 
// and if you want to find stuff: 
fromDoc.find('div').doSomething(); 
fromDoc.find('.someClass').doSomethingElse(); 

Dies ist auch eine Optimierung, da der Kontext muß nicht mehr manuell mit jeder Abfrage festgelegt werden müssen.

+0

Funktioniert wie ein Charme. Vielen Dank! – pmc255

+0

Nice one! Ich habe stundenlang gekämpft und komplett "$ .extend" vergessen. Am Ende finde ich eine andere Lösung. – BrunoLM

1

Eine andere Möglichkeit, es zu tun mit dem Konstruktor überschreibt:

var initjQuery = jQuery.fn.init; 
$.fn.init = function(s,c,r) { 
    c = c || window.document; 
    return new initjQuery(s,c,r); 
}; 
+0

Dieser letzte Parameter "r" steht für "rootjQuery" und wenn Sie es nicht einschließen, erhalten Sie Fehler, die sagen, "rootjQuery ist nicht definiert". Das habe ich auf die harte Tour gelernt. Die ersten beiden Parameter sind flexibel, daher gibt es keinen wirklich guten Namen für sie. – Gerry

4
var jQueryInit = $.fn.init; 

$.fn.init = function(arg1, arg2, rootjQuery){ 
    arg2 = arg2 || window.document; 
    return new jQueryInit(arg1, arg2, rootjQuery); 
};