2010-11-28 11 views
8

Bir jQuery eklentisi yazıyorum ve gelecekteki jQuery yerel yönteminin üzerine yazmadığımdan nasıl emin olacağımı merak ediyordum. Örneğin, eklentim Foo ve kullanımı $('selector').foo().jQuery eklentisinin jQuery yerel yönteminin üzerine yazılmayacağından emin olmanın en iyi yolu nedir?

jQuery 2.6, Foo'nun popülaritesini fark etti ve bunu çekirdek pakete dahil edeceğine karar verdi. Ayrıca $('selector').foo() üzerinden kullanılır.

Foo'm jQuery'nin yerel Foo'sunun (veya başka bir çakışma) üzerine yazılmasını istemiyorum.

Bu ben ile ne geldi edilir ...

(function($) { 

    // If jQuery adds this method, we don't want to overwrite it 
    if (typeof $.foo === 'function') { 
    return; 
    }; 

    $.fn.foo = function() { 
    // Foo 
    }; 

})(jQuery); 

bunu yapmak için en iyi yolu olabilir mi?

+0

... Gerçi iyi bir uygulama olabilir belki de deneyeceğim :-) –

cevap

8

if ifadelerini atlayabilir ve işlev bildiriminize tanım denetimi oluşturabilirsiniz.

(function($){ 

    $.fn.foo = $.fn.foo || function() { 
    // only used if $.fn.foo is undefined 
    } 

})(jQuery) 
+0

Bu çok seksi! Cevaplarınız için teşekkürler. Kimsenin bunu üstlenebileceğini sanmıyorum. Kısa devre değerlendirmesi ve ilk * gerçeği * işleneni döndüren JavaScript'i kullanmayı hep unutuyorum. – alex

+0

@alxed - Bu özellik için güvenli değil, örneğin .length', '.active' ve' 0' için varsayılan olan diğer şeylerin jQuery tarafından kullanıldığında bile burada geçersiz kılınacağını unutmayın. –

+0

@Nick jQuery prototipinde yalnızca üç işlevsiz özellik vardır: "jquery", "length" ve "selector". Eklentinizi isimlendirmediğiniz sürece, iyi olmalısınız. –

0

Muhtemelen bu, düzenli bir JavaScript programlama için getElementsByClassName işlevine benzer bir şekilde yapmak isteyebilirsiniz - var olup olmadığını kontrol edip etmediyseniz oluşturursunuz.

if ($.foo !== undefined) { 
    alert('there is something at foo'); 
    return; 
    }; 

Neden olmak, senin eklenti bu gibi görünebilir::

2

Sana ile daha iyi olacağını düşünüyorum

$.foo = { 
    doSomething: function() { /* do something*/ }, 
    doSomethingElse: function() { /* do something else*/ } 
    }; 

typeof yukarıda değil işlevi, ancak bu amaç Yani, örneğinizdeki koşul beklediğiniz gibi davranmayacaktır.

+0

Cevabınız için teşekkürler karim79. Belki yanlış bir şey yapıyorum, ama ben uyarmak ($. Unwrap) '' jQuery 1.4 ve 'uyarı ($) kullanıyorum olsa bile' undefined 'aldım,' 'toString()' verir küçültülmüş jQuery işlevi. – alex

+0

@alex - bunun anlamı şudur: http://jsfiddle.net/karim79/qgDSN/1/ yardımcı oluyorsa. – karim79

0

A biraz daha iyi (epeyce) sürümü: foo uygulamanız jQuery'nin sonra eklenti alacağı arabası daha differen't ise

jQuery.fn.foo || (jQuery.fn.foo = function(){ 
var $ = jQuery; 
(your code goes here) 
}); 
İlgili konular