Uncaught TypeError: undefined nie jest funkcją podczas ładowania jquery-min.js


104

Buduję normalną stronę internetową, która wymaga załadowania około pięciu plików CSS i dziesięciu plików Javascript.

  • Kiedy ładuję je osobno na stronie HTML, moja strona wczytuje się dobrze.
  • Teraz do produkcji, połączyłem cały JavaScript w jednym pliku, w wymaganej kolejności, a cały CSS w innym pliku. Ale kiedy próbuję uruchomić stronę internetową z połączonymi plikami, wyświetla błąd:

    Uncaught TypeError: undefined is not a function

W wierszu, w którym plik jquery.min.js jest ładowany w połączonym pliku Javascript.

Co mogę zrobić, aby to złagodzić? Chcę połączyć wszystkie pliki i zminimalizować je do produkcji. Proszę pomóż.


EDYCJA: Połączyłem JavaScript i CSS w kolejności, w jakiej były ładowane indywidualnie i działały dobrze.


5
skąd możemy wiedzieć, co jest, undefinedjeśli nie masz kodu do pokazania?
— Joseph

niezdefiniowany pojawia się w jquery-1.6.1.min.js, który jest ładowany. może jquery nie ładuje się poprawnie czy coś?
— ghostCoder

może zaakceptować odpowiedź o wysokiej randze?
— Allisone

Odpowiedzi:


179

Zakładając, że ten problem nadal nie został rozwiązany, wiele pojedynczych plików nie kończy swojego kodu średnikiem. Większość skryptów jQuery kończy się na (jQuery)i trzeba to mieć (jQuery);.

Jako oddzielne pliki skrypt będzie ładował się dobrze, ale jako pojedynczy plik potrzebujesz średników.


18
+1. Podczas konkatenacji kodu JavaScript należy zawsze łączyć je średnikami. Zbyt wiele z nich jest nadal aktualnych, a mniej prowadzi do błędów.
— Bergi

9
To niezwykle trudne do debugowania. Dzięki za naprawdę skuteczną odpowiedź!
— Ghayes

5
Najwyraźniej jednym z takich przykładów jest Bootstrap's js. Dzięki za to! To był prawdziwy drapak do makaronu.
— Kevin Beal

Próbuję zaimportować youtube iframe API, ale nie kończy się średnikiem i otrzymuję ten błąd. Nie łączę go z niczym ... Ładuję to za pomocą jQuery.getScript (). Więc ... Czy to może być przyczyną mojego błędu? A może to nie ma sensu?
— Daniel,

1
Jak możemy rozwiązać ten problem, jeśli widzimy ten błąd podczas pracy z biblioteką? Próbuję użyć 2.3.2 / js / bootstrap.min.js i /1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
— codeObserver

28

Być może będziesz musiał ponownie sprawdzić kolejność, w której scalasz pliki, powinno to wyglądać mniej więcej tak:

  1. jquery.min.js
  2. jquery-ui.js
  3. wszelkie ładowane wtyczki stron trzecich
  4. Twój niestandardowy JS

jest tak, tylko json2.js, jquery-1.6.1.min.js, wtyczki jquery, mój kod. jest w tej kolejności.
— ghostCoder

jeśli json2.js używa dowolnej funkcji jquery, to jquery.min.js powinno być pierwsze. sugerowałbym. jquery.min.js, jqueryPlugins, json2.js, mój kod.
— Bilal Murtaza


16

Otrzymałem ten sam błąd, mając dwa odwołania do różnych wersji jQuery.

Na mojej stronie wzorcowej:

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script>

A także na stronie:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"> </script>

7

Niedawno miałem ten problem z wtyczką jQuery Validation , używając Squishit , również otrzymując błąd js:

„undefined nie jest funkcją”

Naprawiłem go zmieniając odniesienie do unminified pliku jquery.validate.js zamiast jquery.validate.min.js.

@MvcHtmlString.Create(
    @SquishIt.Framework.Bundle.JavaScript()
        .Add("~/Scripts/Libraries/jquery-1.8.2.min.js")
        .Add("~/Scripts/Libraries/jquery-ui-1.9.1.custom.min.js")
        .Add("~/Scripts/Libraries/jquery.unobtrusive-ajax.min.js")
        .Add("~/Scripts/Libraries/jquery.validate.js")
        .Add("~/Scripts/Libraries/jquery.validate.unobtrusive.js")
         ... more files

Myślę, że zminimalizowana wersja niektórych plików, po dalszej kompresji, na przykład za pomocą Squishita, może w niektórych przypadkach nie poradzić sobie z brakującymi średnikami i tym podobnymi, jak sugeruje @Dustin, więc być może będziesz musiał poeksperymentować z plikami, które możesz podwójnie skompresuj i pozostaw do Squishit lub czegokolwiek, z czym się pakujesz.


Korzystanie z niezminifikowanej wersji było dla mnie biletem - dzięki.
— Paul Deen,

Dla mnie był to plik json2.min.js z wersji 1.0.2 pakietu NuGet, który powodował problem. Zmieniłem go na plik inny niż min i połączony plik Squishit działa teraz dobrze.
— billoreid

6

Dla tych, którzy nadal nie mogli tego naprawić, zrobiłem to, zmieniając moje „this” na „$ (this)” podczas używania jQuery.

NA PRZYKŁAD:

$('.icon').click(function() {
    this.fadeOut();
});

Naprawiony:

$('.icon').click(function() {
    $(this).fadeOut();
});

5

Natknąłem się na ten sam problem, gdy błędnie nazwano zmienną o tej samej nazwie, co funkcja.

Więc to:

isLive = isLive(data);

nie powiodło się, generowanie wspomnianego komunikatu o błędzie OP.

Naprawienie tego było tak proste, jak zmiana powyższego wiersza na:

isItALive = isLive(data);

Nie wiem, na ile to pomaga w tej sytuacji, ale postanowiłem udzielić tej odpowiedzi innym szukającym rozwiązania podobnych problemów.


5

Tak, naprawiłem też to, zmieniając w bibliotekach js na unminified.

Na przykład w tagu zmień:

<script type="text/javascript" src="js/jquery.ui.core.min.js"></script>
<script type="text/javascript" src="js/jquery.ui.widget.min.js"></script>
<script type="text/javascript" src="js/jquery.ui.rcarousel.min.js"></script>

Dla:

<script type="text/javascript" src="js/jquery.ui.core.js"></script>
<script type="text/javascript" src="js/jquery.ui.widget.js"></script>
<script type="text/javascript" src="js/jquery.ui.rcarousel.js"></script>

Wychodzenie z „min” jako niezminimalizowane.

Dzięki za pomysł.


3

Pamiętaj: funkcje JavaScript rozróżniają wielkość liter.

Miałem przypadek, w którym jestem prawie pewien, że mój kod będzie działał płynnie. Mimo to pojawił się błąd i sprawdziłem konsolę Javascript przeglądarki Google Chrome, aby sprawdzić, co to jest.

Moja linia błędu to

opt.SetAttribute("value",values[a]);

I otrzymałem ten sam komunikat o błędzie:

Uncaught TypeError: undefined is not a function

Nie ma nic złego w powyższym kodzie, ale nie był on uruchomiony. Rozwiązuję problem przez prawie godzinę, a następnie porównuję go z innym działającym kodem. Mój błąd polega na tym, że został ustawiony na SetAttribute, który powinien być setAttribute.


2

Na wypadek, gdyby byli tam jacyś kretyni tacy jak ja, miałem ten frustrujący problem, ponieważ zapomniałem prostego

new

słowo kluczowe przed utworzeniem wystąpienia nowego obiektu.


1

Właśnie otrzymałem tę samą wiadomość z następującym kodem (w IcedCoffeeScript):

f = (err,cb) ->
  cb null, true

await f defer err, res
console.log err if err  

Wydawało mi się, że to zwykły kod ICS. Rozwinąłem konstrukcję await-defer do zwykłego CoffeeScript:

f (err,res) ->
  console.log err if err

To, co naprawdę się wydarzyło, to to, że próbowałem przekazać 1 funkcję zwrotną (z 2 parametrami) do funkcji foczekującej dwóch parametrów, w rzeczywistości nie ustawionych cbwewnątrz f, co kompilator poprawnie zgłosił jakoundefined is not a function .

Błąd wystąpił, ponieważ ślepo wkleiłem standardowy kod w stylu wywołania zwrotnego. fnie potrzebuje errprzekazywanego do niego parametru, więc powinno być po prostu:

f = (cb) ->
  cb null, true
f (err,res) ->
  console.log err if err

W ogólnym przypadku zalecałbym podwójne sprawdzenie sygnatur funkcji i wywołań pod kątem pasujących znaków. Stos wywołań w komunikacie o błędzie powinien być w stanie dostarczyć przydatnych wskazówek.

W twoim szczególnym przypadku polecam poszukać definicji funkcji pojawiających się dwukrotnie w scalonym pliku, z różnymi podpisami lub przypisaniami do zmiennych globalnych przechowujących funkcje.


1

Upewnij się, że skomentowałeś wszelkie komentarze. Czasami podczas kopiowania i wklejania pominiesz znak „/ *!”

Również kiedy wejdziesz do konsoli, wyświetlą listę twoich błędów i powinieneś je rozpatrywać pojedynczo. Jeśli zobaczysz komunikat „Uncaught SyntaxError: Nieoczekiwany token *” Może to oznaczać, że odczytuje plik js i nie wychodzi poza pierwszą linię.

/ *! * jquery.tools 1.1.2 - Brakująca biblioteka interfejsu użytkownika dla sieci WWW * * [tools.tabs-1.0.4, tools.tooltip-1.1.2, tools.scrollable-1.1.2, tools.overlay-1.1.2, tools.expose-1.0.5] * * Copyright (c) 2009 Tero Piirainen * http://flowplayer.org/tools/ * Wygenerowano plik: środa 07 października 09:40:16 GMT 2009 * /


0

Otrzymałem to, gdy przypadkowo przekazałem zbyt wiele parametrów do funkcji jquery, która oczekiwała tylko jednego parametru wywołania zwrotnego.

W przypadku innych problemów: upewnij się, że wszystkie wywołania funkcji jQuery zawierają dodatkowe parametry.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.