2010-09-11 25 views
17

jQuery'yi bir Firefox eklentisi içinde kullanmaya çalışıyorum ve aslında XUL dosyasının içeriğinin aksine geçerli sayfanın DOM'sini değiştirmek için jQuery'yi kullanmak istiyorum. Bu nedenle, jQuery'yi XUL dosyasına yüklerim ve bir kum havuzundaki bazı komut dosyalarına (Greasemonkey eklenti derleyicisi http://arantius.com/misc/greasemonkey/script-compiler kullanarak) aktarırım. JQuery, sayfa DOM ile yüklenmediğinden, jQuery çağrılarına geçmek yerine, seçici bağlamını DOM'ye ayarlamak istiyorum.Varsayılan jQuery seçici kapsamını geçersiz kıl

Çözümü How to use jQuery in Firefox Extension numaralı telefondan takip ettim ve neredeyse istediğimi elde ettim.

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

jQuery() işlevine çağrı yapmak mümkün, ve sayfa DOM bağlam olarak kullanılacaktır. Ancak, tanımlı olmayan jQuery.trim gibi işlevleri kullanamıyorum.

ben kendi jQuery nesnesi jQuery prototip özelliklerin tümünü miras sağlayacak çözümü

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

bu çizgiyi düşündüm, ama görünüşe göre değil.

Bir vanilla jQuery nesnesi verin, jQuery işlevlerinin tümünü korurken, seçici bağlam olarak belirli bir öğeyi kullanmak için onu nasıl yeniden tanımlayabilirim?

+0

senin için işe yarar. JQuery'yi bir uzantıda kullanmaya çalışıp bir XUL kaplamasına yüklediğimde, Webdeveloper araç çubuğu gibi diğer eklentilerin yer paylaşımlarını bir şekilde kırdı. Belki şimdi daha iyi çalışır. Sadece bunun için dikkat! –

cevap

11

.trim(), .ajax() vb statik yöntemlerdir, yani jQuery yapıcısına bağlı ve prototip değillerdir.

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 $ 

Ancak bir belki güzel bir yol izleyen jQuery bozulmamış terk edip yapmaktır:

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

Bu aynı zamanda el ile her sorgu ile artık ayarlanmalıdır edicek bağlamda beri bir optimizasyon olduğunu.

+0

Bir çekicilik gibi çalışır. Teşekkürler! – pmc255

+0

Güzel olan! Saatlerce uğraşıyordum ve "$ .extend" i tamamen unutuyordum. Başka bir çözüm bulmaya çalışıyorum. – BrunoLM

1

o yapıcısı kıldı yapmanın bir başka yolu:

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

Bu "r" son parametresi "rootjQuery" anlamına gelir ve eklemezseniz "rootjQuery undefined" ("rootjQuery undefined") hatalarını almaya devam edersiniz. Bunu zor yoldan öğrendim. İlk iki parametre esnektir, bu yüzden onlar için gerçekten iyi bir isim yoktur. – Gerry

4
var jQueryInit = $.fn.init; 

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