TypeError: $ jQuery işlevi çağrılırken bir işlev değildir


214

Böyle bir jQuery sarıcı kullanan bir WordPress eklentisi basit bir jQuery komut dosyası var:

$(document).ready(function(){

    // jQuery code is in here

});

Bu komut dosyasını WordPress Dashboard içinden çağırıyorum ve jQuery çerçevesi yüklendikten SONRA yüklüyorum.

Firebug'daki sayfayı kontrol ettiğimde sürekli olarak hata mesajını almaya devam ediyorum:

TypeError: $ bir işlev değil

$ (Document) .ready (function () {

Ben belki bu işlevde komut dosyası sarmak gerekir:

(function($){

    // jQuery code is in here

})(jQuery);

Bu hatayı birkaç kez yaşadım ve nasıl ele alınacağından emin değilim.

Herhangi bir yardım büyük mutluluk duyacağız.


3
Eğer yazarsanız $konsolu ve basında girmek - ne görüyorsunuz?
zerkms

Konsolda $ çalıştırırken "tanımsız" alıyorum
Jason

Yanıtlar:


320

Wordpress'te jQuery'yi enqueue yaparken varsayılan olarak kullanmanız gerekir jQueryve $kullanılmaz (bu, diğer kitaplıklarla uyumluluk içindir).

Sarma çözümünüz functioniyi çalışır veya jQuery'yi başka bir şekilde yükleyebilirsiniz (ancak muhtemelen Wordpress'te iyi bir fikir değildir).

Kullanmanız gerekiyorsa document.ready, aslında $işlev çağrısına geçebilirsiniz :

jQuery(function ($) { ...

Ben ancak işe yaramadı ikinci sürümü denedim, ilk sürümü yaptı ama ben sadece jQuery çağırmak iki katına değil emin olmak istiyorum.
Jason

@ Jason buna ihtiyacın bile yok; tam olarak ne gönderdiğim: jsfiddle.net/vcbYJ
Patlama Hapları


Ve dışarıda herhangi bir seçici varsa jQuery(function ($) { ..., jQuerybunun yerine kullanmak zorundasınız$
Misha Rudrastyh

Sağ ol, kanka. Takdir edin
Desper

154

Bu sorunu düzeltmelidir:

jQuery(document).ready(function($){
  //you can now use $ as your jQuery object.
  var body = $( 'body' );
});

Basitçe söylemek gerekirse, WordPress yapmadan önce kendi komut dosyalarını çalıştırır ve $ var olan diğer çarpışmayacak şekilde . WordPress her türlü web sitesi, uygulama ve elbette bloglar için kullanıldığından, bu tamamen mantıklıdır.

Belgelerinden:

WordPress ile gelen jQuery kitaplığı noConflict () moduna ayarlanmıştır (bkz. Wp-include / js / jquery / jquery.js). Bu, WordPress'in bağlayabileceği diğer JavaScript kitaplıklarıyla uyumluluk sorunlarını önlemek içindir.

NoConflict () modunda, jQuery için global $ kısayolu kullanılamaz ...


28

Bu çözüm benim için çalıştı

;(function($){
    // your code
})(jQuery);

Kodunuzu kapağın içine taşıyın ve $yerinejQuery

Yukarıdaki çözümü /magento/33348/uncaught-typeerror-undefined-is-not-a-function-when-using-a-jquery-plugin-in-ma içinde buldum

... çok fazla aradıktan sonra


2
Harika bir çözüm. Bu çalışmanın ana nedeni, ";" zaten etkin olan başka herhangi bir jquery örneğini kapatır ve aynı zamanda yerel olarak başka bir jquery bildirir. Üretimde bir düzeni uygulamak için sadece birkaç saniyeniz veya çok sayıda wordpress eklentisi çalıştırarak bunu yapabilirsiniz. Ancak, sorunu çözmeniz gerektiğini unutmayın, bu sadece bir yara bandıdır, ancak bir bilgi sayfasıysa sorun yoktur.
luis

@Martha James Bu benim için çalışıyor bu yüzden dahil. Başkaları için işe yarayabilir veya çalışmayabilir
Bikram Shrestha

19

Böyle bir çatışmayı önleyebilirsiniz

var jq=jQuery.noConflict();
jq(document).ready(function(){  
  alert("Hi this will not conflict now");
  jq('selector').show();
});

7
Veya $ = jQuery.noConflict ();
Cyssoo


13

Bunu dene:

<script language="JavaScript" type="text/javascript" src="jquery/jquery.js"></script>
<script>
    jQuery.noConflict();
    (function ($) {
        function readyFn() {
            // Set your code here!!
        }

        $(document).ready(readyFn); 
    })(jQuery);

</script>

8

() İşlevinde $ iletmeniz gerekiyor

<script>
jQuery(document).ready(function($){

// jQuery code is in here

});
</script>

3
Bu, yukarıda verilen cevaptan (üç yıl öncesinden) nasıl farklıdır?
rnevius

8

$işareti şu şekilde değiştirin jQuery :

jQuery(function(){
//your code here
});

7

JQuery referanslarınızı iki kez kontrol edin. Bir kereden fazla başvuruda bulunmanız veya işlevinizi çok erken çağırmanız mümkündür (jQuery tanımlanmadan önce). Yorumlarımda belirtildiği gibi deneyebilir ve herhangi bir jQuery referansını dosyanızın başına (başa) koyabilir ve bunun yardımcı olup olmadığını görebilirsiniz.

JQuery kapsüllemesini kullanıyorsanız, bu durumda yardımcı olmamalıdır. Ben daha güzel ve daha belirgin olduğunu düşünüyorum çünkü deneyin, ama jQuery tanımlanmadıysa aynı hataları alırsınız.

Sonunda ... jQuery şu anda tanımlanmamış.


Sanırım bir şey JQuery'ye erişmeden önce tanımlanmadan önce her şeyi kırar. Senin taşımayı deneyin scripthangi başvuruları JQuery, aramalarınızdan üstüne index.htmlve muhtemelen çalışacaktır
Dan Moldovan

Bu cevap daha fazla görünürlük gerektirir. Evet, standart ad alanı başka bir eklenti aracılığıyla yüklenmiş bir jQuery sürümü ile alınırsa, diğerleri geçerlidir. Ancak, jQuery'yi birden fazla kez istemeden (ve muhtemelen gereksiz yere) yüklemediğinizi kontrol edin.
edkay


5

kullanım

jQuery(document).

onun yerine

$(document).

veya

İşlev içinde $ beklediğiniz gibi jQuery'yi gösterir

(function ($) {
   $(document).
}(jQuery));

4

Benim için ne işe yaradı. İçe aktarılacak ilk kütüphane sorgu kütüphanesidir ve hemen ardından jQuery.noConflict () yöntemini çağırın.

<head>
 <script type="text/javascript" src="jquery.min.js"/>
 <script>
  var jq = jQuery.noConflict();
  jq(document).ready(function(){
  //.... your code here
    });
 </script>


3
<script>
var jq=jQuery.noConflict();
(function ($) 
    {
    function nameoffunction()
    {
        // Set your code here!!
    }

    $(document).ready(readyFn); 
    })(jQuery);

şimdi jQuery yerine jq kullanın


3

İşlev adınız ve dosyadaki kimlik adlarından biri aynı olduğunda bu sorunla karşılaşırsınız. dosyadaki tüm kimlik adlarınızın benzersiz olduğundan emin olun.


2

Kullanabilirsiniz

jQuery(document).read(function(){ ... });

veya

(function ($) { ... }(jQuery));
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.