2010-09-11 13 views
17

मैं फ़ायरफ़ॉक्स एक्सटेंशन के अंदर jQuery का उपयोग करने की कोशिश कर रहा हूं, और वास्तव में एक्सयूएल फ़ाइल के संदर्भ के विपरीत वर्तमान पृष्ठ के डीओएम में हेरफेर करने के लिए jQuery का उपयोग करना चाहता हूं। इस प्रकार, मैं अपनी एक्सयूएल फ़ाइल में jQuery लोड करता हूं, और इसे अपनी कुछ स्क्रिप्ट्स को एक सैंडबॉक्स में पास करता हूं (Greasemonkey एक्सटेंशन कंपाइलर http://arantius.com/misc/greasemonkey/script-compiler का उपयोग करके)। चूंकि jQuery को डीओएम पृष्ठ से लोड नहीं किया गया था, इसलिए मैं इसे अपने चयनकर्ता संदर्भ को पृष्ठ डीओएम पर हमेशा jQuery कॉल में पास करने के बजाय सेट करना चाहता हूं।डिफ़ॉल्ट jQuery चयनकर्ता संदर्भ ओवरराइड

मैंने How to use jQuery in Firefox Extension पर समाधान का पालन किया और यह लगभग जो भी मैं चाहता हूं उसे प्राप्त करता हूं।

jQuery.noConflict(); 
$ = function(selector,context){ return new jQuery.fn.init(selector,context||example.doc); }; 
$.fn = $.prototype = jQuery.fn; 

मैं jQuery() फ़ंक्शन पर कॉल करने में सक्षम हूं, और पृष्ठ DOM संदर्भ के रूप में उपयोग किया जाएगा। हालांकि, मैं jQuery.trim जैसे कार्यों का उपयोग नहीं कर सकता क्योंकि उनको परिभाषित नहीं किया गया है।

मैं समाधान

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

मेरे अपने jQuery वस्तु jQuery प्रोटोटाइप सभी गुणों की वारिस दूँगी से इस लाइन में सोचा है, लेकिन यह जाहिरा तौर पर नहीं करता है।

एक वेनिला jQuery ऑब्जेक्ट दें, मैं सभी jQuery कार्यों को संरक्षित करते समय चयनकर्ता संदर्भ के रूप में किसी निश्चित तत्व का उपयोग करने के लिए इसे फिर से परिभाषित कैसे करूं?

+0

मुझे आशा है कि यह आप के लिए काम करता है। जब मैंने एक एक्सटेंशन में jQuery का उपयोग करने की कोशिश की और इसे एक्सयूएल ओवरले में लोड किया, तो उसने किसी भी तरह से वेब डिवाइडर टूलबार जैसे अन्य प्लगइन के ओवरले तोड़ दिए। शायद यह अब बेहतर काम करता है। बस इसके लिए बाहर देखो! –

उत्तर

11

.trim(), .ajax() आदि स्थिर तरीके हैं, जिसका अर्थ है कि वे jQuery कन्स्ट्रक्टर से बंधे हैं और यह प्रोटोटाइप नहीं है।

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 $ 

हालांकि एक शायद अच्छा तरीका jQuery बरकरार छोड़ने के लिए और निम्न करने के लिए है:

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

यह भी संदर्भ मैन्युअल रूप से प्रत्येक क्वेरी के साथ अब और सेट करने की आवश्यकता नहीं करता है के बाद से एक अनुकूलन है।

+0

एक आकर्षण की तरह काम करता है। धन्यवाद! – pmc255

+0

अच्छा है! मैं घंटों तक संघर्ष कर रहा था और पूरी तरह से '$ .extend' भूल गया था। मैं एक और समाधान खोजने के अंत में। – BrunoLM

1

यह निर्माता अधिभावी है ऐसा करने का एक और तरीका है:

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

वह अंतिम पैरामीटर "आर" "rootjQuery" के लिए खड़ा है और यदि आप इसे शामिल नहीं करते हैं तो आपको "rootjQuery अपरिभाषित" कहने में त्रुटियां मिलती रहेंगी। मैंने सीखा कि एक कठिन तरीका है। पहले दो पैरामीटर लचीले हैं, इसलिए उनके लिए वास्तव में एक अच्छा नाम नहीं है। – Gerry

4
var jQueryInit = $.fn.init; 

$.fn.init = function(arg1, arg2, rootjQuery){ 
    arg2 = arg2 || window.document; 
    return new jQueryInit(arg1, arg2, rootjQuery); 
}; 
संबंधित मुद्दे