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.

ghostCoder
źródło
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.

Dustin
źródło
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
Bilal Murtaza
źródło
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>
scw
źródło
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.

Ralph Lavelle
źródło
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();
});
Jacek
źródło
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.

trejder
źródło
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ł.

Francisco Alonso
źródło
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.

Logan Wayne
źródło
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.

CodyBugstein
źródło
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.

Jens Jensen
źródło
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 * /

Tasza
źródło
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.

JSideris
źródło