Nicht gefangener TypeError: undefined ist keine Funktion beim Laden von jquery-min.js

104

Ich erstelle eine normale Webseite, auf der ich ungefähr fünf CSS-Dateien und zehn Javascript-Dateien laden muss.

  • Wenn ich sie separat in die HTML-Seite lade, wird meine Webseite einwandfrei geladen.
  • Jetzt für die Produktion habe ich das gesamte Javascript in der erforderlichen Reihenfolge zu einer einzigen Datei und das gesamte CSS zu einer anderen Datei verkettet. Wenn ich jedoch versuche, die Webseite mit den verketteten Dateien auszuführen, wird ein Fehler ausgegeben, der besagt:

    Uncaught TypeError: undefined is not a function

In der Zeile, in der jquery.min.js in die verkettete Javascript-Datei geladen wird.

Was kann ich tun, um dies zu mildern? Ich möchte alle Dateien verketten und für die Produktion minimieren. Bitte helfen Sie.


BEARBEITEN: Ich habe Javascript und CSS in der Reihenfolge zusammengeführt, in der sie einzeln geladen wurden und einwandfrei funktionierten.

GhostCoder
quelle
5
Wie können wir wissen, was ist, undefinedwenn Sie keinen Code zum Anzeigen haben?
Joseph
Das Undefinierte kommt in der jquery-1.6.1.min.js, die ich lade. Vielleicht wird jquery nicht richtig geladen oder so?
GhostCoder
Akzeptieren Sie die hochrangige Antwort vielleicht?
Allisone

Antworten:

179

Unter der Annahme, dass dieses Problem immer noch nicht gelöst ist, beenden viele einzelne Dateien ihren Code nicht mit einem Semikolon. Die meisten jQuery-Skripte enden mit (jQuery)und Sie müssen haben (jQuery);.

Als separate Dateien wird das Skript problemlos geladen, aber als einzelne Datei benötigen Sie die Semikolons.

Dustin
quelle
18
+1. Wenn Sie JavaScript-Code verketten, sollten Sie diese immer mit Semikolons verbinden. Zu viele von ihnen sind noch gültig, während weniger zu Fehlern führen.
Bergi
9
Das Debuggen ist unglaublich schwierig. Vielen Dank für eine wirklich effektive Antwort!
Ghayes
5
Bootstraps js ist anscheinend ein solches Beispiel. Danke dafür! Das war ein echter Nudelkratzer.
Kevin Beal
Ich versuche, die Youtube-Iframe-API zu importieren, und sie endet nicht mit einem Semikolon. Ich erhalte diesen Fehler. Ich verkette es mit nichts ... Ich lade es mit jQuery.getScript (). Also ... Könnte dies der Grund für meinen Fehler sein? Oder macht das keinen Sinn?
Daniel
1
Wie können wir das beheben, wenn dieser Fehler bei der Arbeit mit einer Bibliothek auftritt? Ich versuche, 2.3.2 / js / bootstrap.min.js und /1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
codeObserver
28

Möglicherweise müssen Sie die Reihenfolge, in der Sie die Dateien zusammenführen, erneut überprüfen. Dies sollte ungefähr so ​​aussehen:

  1. jquery.min.js
  2. jquery-ui.js
  3. Plugins von Drittanbietern, die Sie laden
  4. Ihre benutzerdefinierte JS
Bilal Murtaza
quelle
Es ist so nur json2.js, jquery-1.6.1.min.js, jquery Plugins, mein Code. Es ist in dieser Reihenfolge.
GhostCoder
Wenn json2.js eine jquery-Funktion verwendet, sollte jquery.min.js an erster Stelle stehen. ich würde vorschlagen. jquery.min.js, jqueryPlugins, json2.js, mein Code.
Bilal Murtaza
16

Ich habe den gleichen Fehler erhalten, weil ich zwei Verweise auf verschiedene Versionen von jQuery hatte.

Auf meiner Masterseite:

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

Und auch auf der Seite:

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

Ich hatte kürzlich dieses Problem mit dem jQuery Validation-Plug-In , das Squishit verwendet und auch den js-Fehler erhalten hat:

"undefiniert ist keine Funktion"

Ich habe das Problem behoben, indem ich den Verweis auf die nicht abgeschlossene Datei jquery.validate.js anstelle von jquery.validate.min.js geändert habe.

@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

Ich denke, dass die verkleinerte Version bestimmter Dateien, wenn sie beispielsweise mit Squishit weiter komprimiert wird, in einigen Fällen nicht mit fehlenden Semikolons und dergleichen umgehen kann, wie @Dustin vorschlägt, sodass Sie möglicherweise experimentieren müssen, mit welchen Dateien Sie arbeiten können doppelt komprimieren und die Sie einfach Squishit überlassen oder was auch immer Sie bündeln.

Ralph Lavelle
quelle
Die Verwendung der nicht minimierten Version war genau das Richtige für mich - danke.
Paul Deen
Für mich war es die Datei json2.min.js aus Version 1.0.2 eines NuGet-Pakets, die das Problem verursachte. Ich habe es auf die Nicht-Min-Datei umgestellt und die kombinierte Squishit-Datei funktioniert jetzt einwandfrei.
Billoreid
6

Für diejenigen da draußen, die dies immer noch nicht beheben konnten, habe ich mein 'this' bei Verwendung von jQuery in '$ (this)' geändert.

Z.B:

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

Fest:

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

Ich bin auf dasselbe Problem gestoßen, wenn ich fälschlicherweise eine Variable mit demselben Namen als Funktion benannt habe.

Also das:

isLive = isLive(data);

fehlgeschlagen, wodurch die erwähnte Fehlermeldung des OP generiert wurde.

Die Behebung dieses Problems war so einfach wie das Ändern der obigen Zeile in:

isItALive = isLive(data);

Ich weiß nicht, wie viel es in dieser Situation hilft, aber ich habe beschlossen, diese Antwort anderen zu geben, die nach einer Lösung für ähnliche Probleme suchen.

Trejder
quelle
5

Ja, ich habe es auch behoben, indem ich es in den js-Bibliotheken auf unminified geändert habe.

Ändern Sie beispielsweise im Tag Folgendes:

<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>

Zum:

<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>

Beenden der 'min' als nicht beendet.

Danke für die Idee.

Francisco Alonso
quelle
3

Denken Sie daran: Javascript-Funktionen sind CASE SENSITIVE.

Ich hatte einen Fall, in dem ich mir ziemlich sicher bin, dass mein Code reibungslos funktionieren würde. Trotzdem habe ich einen Fehler bekommen und die Javascript-Konsole überprüft von Google Chrome überprüft, um zu überprüfen, was es ist.

Meine Fehlerzeile ist

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

Und bekam die gleiche Fehlermeldung:

Uncaught TypeError: undefined is not a function

Mit dem obigen Code scheint nichts falsch zu sein, aber er wurde nicht ausgeführt. Ich habe fast eine Stunde lang Fehler behoben und sie dann mit meinem anderen laufenden Code verglichen. Mein Fehler ist, dass es eingestellt wurde SetAttribute, was sein sollte setAttribute.

Logan Wayne
quelle
2

Für den Fall, dass es da draußen Idioten wie mich gibt, hatte ich dieses frustrierende Problem, weil ich ein einfaches vergessen habe

new

Schlüsselwort vor dem Instanziieren eines neuen Objekts.

CodyBugstein
quelle
1

Ich hatte gerade die gleiche Nachricht mit dem folgenden Code (in IcedCoffeeScript):

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

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

Dies schien mir ein normaler ICS-Code zu sein. Ich habe das Wait-Defer-Konstrukt zu regulärem CoffeeScript entfaltet:

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

Was wirklich geschah, war, dass ich versuchte, 1 Rückruffunktion (mit 2 Parametern) an die Funktion zu übergeben, wobei ich fzwei Parameter erwartete, die praktisch nicht im cbInneren eingestellt waren fund als die der Compiler korrekt gemeldet hatte undefined is not a function.

Der Fehler ist aufgetreten, weil ich blind den Callback-Code eingefügt habe. fEs muss kein errParameter übergeben werden, daher sollte es einfach sein:

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

Im Allgemeinen würde ich empfehlen, Funktionssignaturen und Aufrufe auf übereinstimmende Aritäten zu überprüfen. Der Aufrufstapel in der Fehlermeldung sollte hilfreiche Hinweise geben können.

In Ihrem speziellen Fall empfehle ich, nach Funktionsdefinitionen zu suchen, die zweimal in der zusammengeführten Datei mit unterschiedlichen Signaturen oder Zuweisungen zu globalen Variablen mit Funktionen angezeigt werden.

Jens Jensen
quelle
1

Stellen Sie sicher, dass Sie Kommentare auskommentiert haben. Manchmal wird beim Kopieren und Einfügen das "/ *!"

Auch wenn Sie in die Konsole gehen, werden Ihre Fehler aufgelistet und Sie sollten es einzeln nehmen. Wenn "Uncaught SyntaxError: Unexpected token *" angezeigt wird, bedeutet dies möglicherweise, dass Ihre js-Datei gelesen wird und die erste Zeile nicht überschritten wird.

/ *! * jquery.tools 1.1.2 - Die fehlende UI-Bibliothek für das Web * * [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/ * Generierte Datei: Mi Okt 07 09:40:16 GMT 2009 * /

Tasha
quelle
0

Ich habe dies erhalten, als ich versehentlich zu viele Parameter an eine jquery-Funktion übergeben habe, die nur einen Rückrufparameter erwartet hat.

Für andere Fehlerbehebung: Stellen Sie sicher, dass Sie alle Aufrufe Ihrer jquery-Funktion auf zusätzliche Parameter überprüfen.

JSideris
quelle