Uncaught TypeError: undefined n'est pas une fonction lors du chargement de jquery-min.js

104

Je construis une page Web normale qui m'oblige à charger environ cinq fichiers CSS et dix fichiers Javascript.

  • Lorsque vous les chargez séparément dans la page HTML, ma page Web se charge bien.
  • Maintenant, pour la production, j'ai concaténé tout le Javascript dans un seul fichier, dans l'ordre nécessaire, et tout le CSS dans un autre fichier. Mais lorsque j'essaie d'exécuter la page Web avec les fichiers concaténés, une erreur s'affiche:

    Uncaught TypeError: undefined is not a function

Sur la ligne où jquery.min.js est chargé dans le fichier Javascript concaténé.

Que puis-je faire pour atténuer cela? Je souhaite concaténer tous les fichiers et les réduire pour la production. Veuillez aider.


EDIT: J'ai fusionné le Javascript et le CSS dans l'ordre dans lequel ils étaient lorsqu'ils étaient chargés individuellement et fonctionnaient bien.

ghostCoder
la source
5
comment pouvons-nous savoir ce que c'est undefinedsi vous n'avez pas de code à montrer?
Joseph
l'indéfini arrive dans le jquery-1.6.1.min.js qui se charge. peut-être que jquery n'est pas chargé correctement ou quelque chose?
ghostCoder
accepter la réponse de haut rang peut-être?
Allisone

Réponses:

179

En supposant que ce problème n'a toujours pas été résolu, de nombreux fichiers individuels ne terminent pas leur code par un point-virgule. La plupart des scripts jQuery se terminent par (jQuery)et vous devez avoir(jQuery); .

En tant que fichiers séparés, le script se chargera très bien, mais en tant que fichier individuel, vous avez besoin des points-virgules.

Dustin
la source
18
+1. Lors de la concaténation de code JavaScript, vous devez toujours les joindre par des points-virgules. Un trop grand nombre d'entre eux sont encore valides, tandis que moins conduisent à des erreurs.
Bergi
9
C'est incroyablement difficile à déboguer. Merci pour une réponse vraiment efficace!
ghayes
5
Le js de Bootstrap en est un exemple, apparemment. Merci pour cela! C'était un vrai grattoir à nouilles.
Kevin Beal
J'essaie d'importer l'API iframe youtube, et cela ne se termine pas par un point-virgule, et j'obtiens cette erreur. Je ne le concatène avec rien ... Je le charge avec jQuery.getScript (). Alors ... Serait-ce ce qui cause mon erreur? Ou cela n'a-t-il pas de sens?
Daniel
1
Comment résoudre ce problème si nous voyons cette erreur lorsque nous travaillons avec une bibliothèque? J'essaie d'utiliser 2.3.2 / js / bootstrap.min.js et /1.4.6/bootstrap-editable/js/bootstrap-editable.min.js
codeObserver
28

Vous devrez peut-être revérifier l'ordre dans lequel vous fusionnez les fichiers, cela devrait être quelque chose comme:

  1. jquery.min.js
  2. jquery-ui.js
  3. tous les plugins tiers que vous chargez
  4. votre JS personnalisé
Bilal Murtaza
la source
c'est comme ça que json2.js, jquery-1.6.1.min.js, jquery plugins, mon code. c'est dans cet ordre.
ghostCoder
si json2.js utilise une fonction jquery, jquery.min.js doit être le premier. je voudrais suggerer. jquery.min.js, jqueryPlugins, json2.js, mon code.
Bilal Murtaza
16

J'ai eu la même erreur d'avoir deux références à différentes versions de jQuery.

Dans ma page maître:

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

Et aussi sur la page:

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

J'ai eu ce problème récemment avec le plug-in jQuery Validation , en utilisant Squishit , obtenant également l'erreur js:

"undefined n'est pas une fonction"

Je l'ai corrigé en modifiant la référence au fichier jquery.validate.js non réduit au lieu de 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

Je pense que la version minifiée de certains fichiers, lorsqu'elle est davantage compressée à l'aide de Squishit, par exemple, pourrait dans certains cas ne pas traiter les points-virgules manquants, etc., comme le suggère @Dustin, vous devrez donc peut-être expérimenter avec quels fichiers vous pouvez compressez doublement, et que vous laissez simplement à Squishit ou à tout ce que vous associez.

Ralph Lavelle
la source
L'utilisation de la version non réduite était juste le ticket pour moi - merci.
Paul Deen
Pour moi, c'était le fichier json2.min.js de la version 1.0.2 d'un package NuGet qui causait le problème. Je l'ai basculé vers le fichier non-min et le fichier combiné Squishit fonctionne bien maintenant.
billoreid
6

Pour ceux qui ne pouvaient toujours pas résoudre ce problème, je l'ai fait en changeant mon «ceci» en «$ (this)» lors de l'utilisation de jQuery.

PAR EXEMPLE:

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

Fixé:

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

J'ai rencontré le même problème, lorsque j'ai nommé par erreur variable avec le même nom, comme fonction.

Donc ça:

isLive = isLive(data);

échoué, générant le message d'erreur mentionné par OP.

La résolution de ce problème était aussi simple que de changer la ligne ci-dessus en:

isItALive = isLive(data);

Je ne sais pas, à quel point cela aide-t-il dans cette situation, mais j'ai décidé de mettre cette réponse pour les autres à la recherche d'une solution à des problèmes similaires.

trejder
la source
5

Oui, je l'ai aussi corrigé en changeant dans les bibliothèques js en un minified.

Par exemple, dans la balise, modifiez:

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

Pour:

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

Quitter le 'min' comme non minimisé.

Merci pour l'idée.

Francisco Alonso
la source
3

N'oubliez pas: les fonctions Javascript sont SENSIBLES À LA CASE.

J'ai eu un cas où je suis à peu près sûr que mon code fonctionnerait correctement. Mais quand même, j'ai eu une erreur et j'ai vérifié la console Javascript de Google Chrome pour vérifier ce que c'est.

Ma ligne d'erreur est

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

Et j'ai le même message d'erreur:

Uncaught TypeError: undefined is not a function

Rien ne semble mal avec le code ci-dessus mais il ne fonctionnait pas. Je dépanne pendant près d'une heure, puis je l'ai comparé avec mon autre code en cours d'exécution. Mon erreur est qu'il a été réglé sur SetAttribute, ce qui devrait l'être setAttribute.

Logan Wayne
la source
2

Au cas où il y aurait des crétins comme moi, j'ai eu ce problème frustrant parce que j'ai oublié un simple

new

mot clé avant d'instancier un nouvel objet.

CodyBugstein
la source
1

Je viens d'avoir le même message avec le code suivant (dans IcedCoffeeScript):

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

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

Cela m'a semblé être un code ICS normal. J'ai déplié la construction await-defer en CoffeeScript standard:

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

Ce qui s'est vraiment passé, c'est que j'ai essayé de passer 1 fonction de rappel (avec 2 paramètres) pour fonctionner en fattendant deux paramètres, en fait sans définir à l' cbintérieur f, ce que le compilateur a correctement signalé undefined is not a function.

L'erreur s'est produite parce que j'ai collé aveuglément du code standard de style rappel. fn'a pas besoin d'un errparamètre passé, donc devrait simplement être:

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

Dans le cas général, je recommanderais de revérifier les signatures de fonction et les invocations pour les arités correspondantes. La pile d'appels dans le message d'erreur doit être en mesure de fournir des conseils utiles.

Dans votre cas particulier, je recommande de rechercher des définitions de fonctions apparaissant deux fois dans le fichier fusionné, avec des signatures différentes, ou des affectations à des variables globales contenant des fonctions.

Jens Jensen
la source
1

Assurez-vous d'avoir commenté tous les commentaires. Parfois, lors de la copie et du collage, vous omettez le "/ *!"

De plus, lorsque vous accédez à la console, ils répertorient vos erreurs et vous devez les prendre une à la fois. Si vous voyez "Uncaught SyntaxError: Uncaught token *" Cela peut signifier qu'il lit votre fichier js et qu'il ne dépasse pas la première ligne.

/ *! * jquery.tools 1.1.2 - La bibliothèque d'interface utilisateur manquante pour le 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/ * Fichier généré: Wed Oct 07 09:40:16 GMT 2009 * /

Tasha
la source
0

J'ai eu cela lorsque j'ai accidentellement passé trop de paramètres dans une fonction jquery qui n'attendait qu'un seul paramètre de rappel.

Pour le dépannage des autres: assurez-vous de vérifier tous vos appels de fonction jquery pour des paramètres supplémentaires.

JSideris
la source