Uncaught ReferenceError: $ nie jest zdefiniowany?

657

Dlaczego ten kod rzuca

Uncaught ReferenceError: $ nie jest zdefiniowany

kiedy wcześniej było OK?

$(document).ready(function() {
    $('#tabs > ul').tabs({ fx: { opacity: 'toggle' } });
    $('#featuredvid > ul').tabs();
});

Wyniki w zakładkach już się nie zamykają.

W nagłówku znajduje się odwołanie do jQuery:

<script language="JavaScript" type="text/javascript" src="<?php echo get_option('siteurl') ?>/js/sprinkle.js"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo get_option('siteurl') ?>/js/jquery-1.2.6.min.js"></script>
<script language="JavaScript" type="text/javascript" src="<?php echo get_option('siteurl') ?>/js/jquery-ui-personalized-1.5.2.packed.js"></script>
Olivers
źródło
<script language = "JavaScript" type = "text / javascript" src = "<? php echo get_option ('siteurl')?> / js / jquery-1.2.6.min.js"> </script> Weź to na u góry
kapitanac
W moim przypadku JQuery znajdował się w sekcji stopki, więc najpierw uruchomiono funkcję JS.
Daniel Beltrami
Czy to odpowiada na twoje pytanie? ReferenceError: $ nie jest zdefiniowany
Brynn

Odpowiedzi:

687

Najpierw należy umieścić odniesienia do skryptów jquery.

<script language="JavaScript" type="text/javascript" src="/js/jquery-1.2.6.min.js"></script>
<script language="JavaScript" type="text/javascript" src="/js/jquery-ui-personalized-1.5.2.packed.js"></script>
<script language="JavaScript" type="text/javascript" src="/js/sprinkle.js"></script>
Jeremy
źródło
27
Dla pewności jest to jasne: nie można umieścić odwołania do skryptu do jquery-ui przed samym skryptem jquery. Właśnie to rozwiązało problem: najpierw jquery-xxxmin.js, a następnie jquery-ui-xxxxxx.js.
Wagner da Silva,
26
2 lata później odpowiedź nadal nie jest „zaznaczona”). W tym artykule opisano ten jeden i 4 kolejne częste przypadki wystąpienia tego błędu.
Uzbekjon
2
@Uzbekjon To dla mnie rozwiązało. Ścieżka do skryptu była nieprawidłowa w jednym z moich HTMLplików.
Adam Jensen
@Jeremy, wielkie dzięki. Umieść go także przed jakimkolwiek widokiem częściowym (mvc), aby był dostępny dla dowolnego skryptu w częściowym.
Andrew Day,
1
@Uzbekjon już prawie 10 lat i nadal nie jest zaznaczone. Dziękujemy za podanie linku do artykułu.
Modo,
235

Wywołujesz funkcję gotowości przed włączeniem JavaScript jQuery. Najpierw odwołaj się do jQuery.

Otwarte źródło
źródło
30
@RamSharma Właściwie to jest prawidłowa odpowiedź. Nie potrzebujesz nic innego do rozwiązania problemu.
Derek 朕 會 功夫
Tak. To był mój problem. Po prostu miałem jquery PO odwołaniu się do mojego pliku js. Nie!
Dogonaro z
W moim przypadku musiałem usunąć odroczenie klucza z <script src = "/ js / jquery-1.2.6.min.js" defer> </script>
Charden Daxicen
123

To właśnie dla mnie to rozwiązało. Pierwotnie poszedłem do Google i skopiowałem i wkleiłem sugerowany fragment kodu jQuery na stronie CDN:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

Fragment nie zawiera atrybutu HTTP:lub HTTPS:w srcatrybucie, ale moja przeglądarka FireFox go potrzebowała, więc zmieniłem ją na: edytuj: działało to również w przypadku Google Chrome

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

Potem zadziałało.

Marlin Mixon
źródło
13
Ściśle mówiąc, fragment kodu / przykład Google jest poprawny - ich atrybutem src jest adres URL bez protokołu, co oznacza, że ​​przeglądarka powinna używać protokołu (HTTP / HTTPS) strony wywołującej. Zobacz paulirish.com/2010/the-protocol-relative-url . Jest to najlepsza praktyka, aby unikać ostrzeżeń o mieszanej zawartości, jeśli Twoja strona jest kiedykolwiek wyświetlana przez SSL, a skrypty nie.
pwdst
12
Jednym z typowych problemów jest prawdopodobnie użycie adresów URL zależnych od protokołu podczas programowania, a w słoneczny dzień próbujesz załadować stronę z pliku lokalnego. Twoja przeglądarka optymistycznie spróbuje się załadować file://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.jsi zastanawiasz się, dlaczego nie pojawia się w konsoli sieciowej.
Pieter Ennes,
dzięki @PieterEnnes, tak właśnie było w moim przypadku. Dziękuję również odpowiadającemu!
jwg
43

Jeśli skrypt niestandardowy zostanie załadowany przed załadowaniem wtyczki jQuery do przeglądarki, może wystąpić ten problem. Dlatego po wywołaniu wtyczki jQuery zawsze zachowuj własny kod JavaScript lub kod jQuery, więc rozwiązaniem tego jest:

Najpierw dodaj link do pliku jQuery hostowanego na GoogleApis lub lokalnego pliku jQuery, który pobierzesz ze strony http://jquery.com/download/ i udostępnisz na swoim serwerze:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

lub dowolną wtyczkę do jQuery. Następnie umieść link lub kod niestandardowego pliku skryptu:

<script src="js/custom.js" type="text/javascript"></script>
Jnanaranjan
źródło
3
If your custom script is loaded before the jQuery plugin is loaded to the browser then this type of problem may occur idealna odpowiedź ... w moim przypadku skrypt był w stopce
echoashu
41

W moim przypadku umieszczałem .jsplik przed łączem skryptu jQuery, umieszczając .jsplik po rozwiązaniu problemu przez łącze skryptu jQuery.

<script src="http://code.jquery.com/jquery-1.10.2.js"></script>
<script src="http://code.jquery.com/ui/1.11.2/jquery-ui.js"></script>
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="exponential.js"></script>
Shivam
źródło
Właśnie użyłem tego, aby naprawić mój Jschart.
indofraiser
to naprawiło problem, .js plik powinien zostać umieszczony przed linkiem skryptu jQuery.
Metoda naukowa
27

Okej, mój problem był inny - był to model ochrony dokumentów w Chrome .

Patrząc na odpowiedzi tutaj, było oczywiste, że jakoś nie ładowałem moich plików jquery przed wywołaniem $(document).ready() funkcji itp. Wszyscy jednak byli na właściwych pozycjach.

W moim przypadku było to spowodowane tym, że uzyskiwałem dostęp do zawartości za pośrednictwem bezpiecznego połączenia HTTPS, podczas gdy strona próbowała pobrać dane hostowane przez CDN z Google itp. Rozwiązaniem było przechowywanie ich lokalnie, a następnie włączenie ich bezpośrednio zamiast z CDN za każdym razem.

Edycja : Innym sposobem na zrobienie tego jest link do wszystkich rzeczy hostowanych w CDN jako https: // zamiast http: // - wtedy model nie narzeka.

Sudipta Chatterjee
źródło
5
Pamiętaj również, że możesz pozostawić protokół wyłączony z łączy, a on wybierze odpowiedni w zależności od kontekstu (zakładając, że istnieją zarówno wersje http, jak i https). Zobacz stackoverflow.com/a/3622615/4332
Adrian Mouat,
tak. ten rozwiązał mój problem, ładowałem skrypty z adresu URL takiego jak ´ // cdnjs.cloudflare.com / ajax / libs / jquery / 1.12.0 / jquery.min.js´. Używanie „ cdnjs ...” działa świetnie
user9869932
25

Dodaj bibliotekę przed uruchomieniem skryptu. Możesz dodać dowolny z poniższych CDN, aby go uruchomić.

Google:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>

Microsoft

<script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.2.1.min.js"></script>

Jquery

Jeśli chcesz mieć inną wersję CDN Jquery, sprawdź ten link .

Po tym:

<script type="text/javascript">
$(function(){
    //your stuff
});
or
$(document).ready(function(){
    //your stuff
});    
</script>

Wordpress:

<script type="text/javascript">
var $ = jQuery;
jQuery(document).ready(function($){
     //your stuff
});
</script>
lalithkumar
źródło
19

Jeśli jest w Wordpress, może być konieczne, aby zmienić

$(document).ready(function() {

do

jQuery(document).ready(function($){

lub dodaj

var $ = jQuery;

przed

$(document).ready(function() {
xoxn-- 1'w3k4n
źródło
19

Miałem dokładnie ten sam problem i żadne z powyższych rozwiązań nie pomogło. jednak po prostu połączyłem .csspliki po .jsplikach i problem cudownie zniknął. Mam nadzieję że to pomoże.

zatłoczone
źródło
13
Po pierwsze, aby uzyskać lepszą wydajność renderowania stron, zawsze powinieneś łączyć pliki CSS przed plikami JS. Po drugie, kolejność plików css i js nie powinna mieć wpływu na bieżące cytowanie.
Uzbekjon
12
„To, co naprawiło problem, nie powinno go naprawić i nie powinieneś robić tego, co naprawiło problem”.
Andrew
15

Chciałem spróbować uczynić mój skrypt asynchronicznym . Potem zapomniałem o tym i kiedy uruchomiłem, plik [niestandardowy] .js ładował się tylko 50% czasu przed plikiem jQuery.js.

Więc się zmieniłem

<script async src="js/script.js"></script>

do

<script src="js/script.js"></script>
Sindri Þór
źródło
14

W moim przypadku miałem ten referencyjny błąd, ponieważ kolejność wywołań skryptów była nieprawidłowa. Rozwiązano to poprzez zmianę kolejności:

<script src="js/index.js"></script>
<script src="js/jquery-1.10.2.js"></script>

do

<script src="js/jquery-1.10.2.js"></script>
<script src="js/index.js"></script>
Yannis Dran
źródło
1
Był to głównie problem, który również znalazłem, gdy wystąpił błąd odniesienia dla „$”
Dipak
8

Miałem ten sam problem i rozwiązałem go, umieszczając jQuery na początku wszystkich kodów javascript, które mam w kodzie.

Coś takiego:

<script src="https://code.jquery.com/jquery-3.3.1.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script src="js/app.js" type="text/javascript"></script>
<script src="js/form.js" type="text/javascript"></script>
<script src="js/create.js" type="text/javascript"></script>
<script src="js/tween.js" type="text/javascript"></script>

Nadzieja może komuś pomóc w przyszłości.

Martwy człowiek
źródło
8

Wywołujesz tę ready()funkcję, zanim jQuery JavaScript zostanie dołączony. Najpierw odwołaj się do jQuery.

Jeśli korzystasz z ASP.NET MVC, możesz określić, kiedy ma być renderowany kod JS, wykonując następujące czynności:

1 W swojej page.cshtmlowinąć <script>tag w sekcji i nadać mu nazwę, nazwę potoczną do użytku jest „skrypty”:

@section scripts {
    <script>
        // JS code...
    </script>
}

2, Na _Layout.cshtmlstronie dodaj @RenderSection("Scripts", required: false), pamiętaj o umieszczeniu go po odwołaniu do źródła Jquery, spowoduje to, że kod JS będzie renderowany później niż Jquery.

Mayer Spitzer
źródło
6

Jeśli robisz to w .Net i poprawnie odwołujesz się do pliku skryptu, a jQuery wygląda dobrze, upewnij się, że użytkownicy mają dostęp do pliku skryptu. Projekt, nad którym pracowałem (współpracownik), miał swój web.config odmawiający dostępu anonimowym użytkownikom. Strona, nad którą pracowałem, była dostępna dla anonimowych użytkowników, dlatego nie mieli dostępu do pliku skryptu. Upuściłem następujące elementy do pliku web.config i wszystko było na świecie:

  <location path="Scripts">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>
peroija
źródło
6

W moim przypadku była to literówka, zapomniałem odwrotnego ukośnika i niepoprawnie odwoływałem się do źródła.

Przed src="/scripts/jquery.js"

Po    src="scripts/jquery.js"

Dennis
źródło
5

Plik źródłowy jquery-1.2.6.min.jsnie nazywa się polecenie jQuery $()jest wykonywane wcześniej niż<..src='jquery-1.2.6.min.js'> .

<.. src="/js/jquery-1.2.6.min.js..">Najpierw uruchom i upewnij się, że ścieżka src jest poprawna, a następnie uruchom komendę jquery

$(document).ready(function() 
Charles Hsu
źródło
5

Zdarzyło mi się to wcześniej.

Powodem było to, że podłączam Androida do widoku internetowego za pomocą JS. I wysłałem parametr bez cudzysłowów.

js.sayHello(hello);

a kiedy to zmieniłem na

js.sayHello('hello');

zadziałało.

Reinherd
źródło
Nie mam pojęcia, jaki parametr bez cudzysłowu oznacza ... Brzmi to tak, jakbyś miał błąd odniesienia.
Aluan Haddad
Miałem problem w Freemarker a powodem był brak apostrofami, więc wartość nie była traktowana jak struna, ale jako zmienna
Torina
4

Brak pliku JavaScript, więc wystąpił ten błąd. Wystarczy dodać plik JavaScript wewnątrz <head>tagu. Zobacz przykład:

<script src="js/sample.js" type="text/javascript"></script>
<link href="css/sample.css" rel="stylesheet" type="text/css" />

lub dodaj następujący kod w tagu:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
Gaurav Gupta
źródło
4

Błąd wystąpi również w następujących dwóch scenariuszach.

  1. W pliku HTML brakuje elementu @section scripts
  2. Błąd podczas uzyskiwania dostępu do elementów DOM. Na przykład dostęp do elementu DOM jest wymieniony jako $ („js-toggle”) zamiast $ („. Js-toggle”). W rzeczywistości brakuje okresu

A więc 3 rzeczy, których należy przestrzegać - sprawdź, czy wymagane skrypty zostały dodane, sprawdź, czy są dodane w wymaganej kolejności i czy występują trzecie błędy składniowe w skrypcie Java.

Sankar Krishnamoorthy
źródło
Tak. a dla atrybutów id $ ('# someDiv')
cagcak 28.04.17
3

Doh! W tagach miałem mieszane cytaty, które spowodowały uszkodzenie referencji jquery. Przeprowadzenie inspekcji w Chrome pozwoliło mi stwierdzić, że plik nie został poprawnie połączony.

justreed
źródło
3

W moim przypadku zapomniałem dołączyć:

 <script src ="jquery-2.1.1.js"></script>

Wcześniej dołączałem tylko jquery-mobile, który powodował ten błąd.

Anand
źródło
3

Zmodyfikowałem tag skryptu, aby wskazywał odpowiednią treść, i zmieniłem kolejność skryptów, aby była poprawna w edytorze. Ale całkowicie zapomniałem zapisać zmianę.

Hexodus
źródło
2

Miałem podobny problem i to dlatego, że brakowało> zamknięcia linku do arkusza stylów.

Jason
źródło
2
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript" src="local_xxx.js"></script>

Mam podobny problem i wiesz, co to jest, ponieważ sieć jest rozłączona, gdy testuję w widoku urządzenia z Androidem i nie zdaję sobie z tego sprawy, a lokalny js nie ma problemu z załadowaniem, ponieważ nie potrzebuje sieci. To wydaje się śmieszne, ale marnowanie mojej ~ 1 godziny to rozgryźć.

Owoc
źródło
2

Nie masz odniesienia do biblioteki jQuery.

Musisz umieścić linię podobną do tej w swoim HTML:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
asghar
źródło
2

Miałem podobny problem. Mój serwer testowy działał poprawnie z „http”. Jednak nie powiodło się w produkcji, która miała SSL.

Tak więc w produkcji dodałem „HTPPS” zamiast „HTTP”, a w teście zachowałem, że to „HTTP”.

Test:

wp_register_script( 'jquery', 'http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js', array(), null, false );

wp_register_script( 'custom-script', plugins_url( '/js/custom.js', __FILE__ ), array( 'jquery' ) );

Produkcja:

wp_register_script( 'jquery', 'https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js', array(), null, false );

wp_register_script( 'custom-script', plugins_url( '/js/custom.js', __FILE__ ), array( 'jquery' ) );

Mam nadzieję, że pomoże to komuś, kto pracuje nad wordpress.

użytkownik3671115
źródło
1

Dziwne, mój problem pochodził z PHP.

Wywołanie interfejsu API REST nie powiodło się, a następnie przerywało ładowanie bibliotek. Ponieważ błąd był spowodowany wywołaniem REST, nie dało mi to błędu kompilacji php.

Zachowaj to również jako opcję, jeśli ładowanie jquery wydaje się prawidłowe.

Aris
źródło
1

Miałem ten problem, kiedy przeglądałem internet przez mój mobilny punkt dostępu. kompresował także obrazy i dodał następujący skrypt na dole tagu body

<script language="javascript"><!--
bmi_SafeAddOnload(bmi_load,"bmi_orig_img");//-->
</script>

Po podłączeniu do właściwego połączenia Wi-Fi wszystko wydaje się działać dla mnie. Mam nadzieję, że komuś to pomoże.

bubb
źródło
1

Może się to również zdarzyć, jeśli występuje problem z siecią. Co oznacza, że ​​mimo że „skrypty jquery” są na miejscu i są uwzględnione przed użyciem, ponieważ skrypty jquery nie są dostępne, w momencie wczytywania strony, stąd definicje „$” są traktowane jako „niezdefiniowane odniesienia”.

DLA CELÓW TESTU / DEBUGOWANIA :: Możesz spróbować uzyskać dostęp do adresu URL „skryptu jquery” w przeglądarce. Jeśli jest dostępna, twoja strona powinna się poprawnie załadować, w przeciwnym razie pokaże wspomniany błąd (lub inne błędy związane ze skryptem). Przykład - http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js powinien być dostępny w przeglądarce (lub w jej stanach kontekstowych).

Miałem podobny problem, w którym mogłem załadować stronę HTML (używając skryptów) w mojej przeglądarce Windows-Host-przeglądarka, ale nie byłem w stanie załadować w vm-ubuntu. Rozwiązując problem z siecią, problem został rozwiązany.

parasrish
źródło
0
var $ = jQuery;
jQuery(document).ready(function($){
Jayanit Satani
źródło
1
To absolutnie nie jest odpowiedź. Musisz dodać wyjaśnienia.
jmlemetayer
Jest to rozwiązanie, o Wordpressktórym powinieneś wspomnieć.
Heksodus
Uratowałeś mi dzień. Walczyłem o to w WordPress i żadne z tych rozwiązań nie działało jak urok.
rahimv