JQuery - $ n'est pas défini

486

J'ai un simple événement de clic jquery

<script type="text/javascript">
    $(function() {
        $('#post').click(function() {
            alert("test"); 
        });
    });
</script>

et une référence jquery définie dans le site.master

<script src="<%=ResolveUrl("~/Scripts/jquery-1.3.2.js")%>" type="text/javascript"></script>

J'ai vérifié que le script est correctement résolu, je peux voir le balisage et afficher le script directement dans firebug, donc je dois être trouvé. Cependant, je reçois toujours:

$ n'est pas défini

et aucun des jquery ne fonctionne. J'ai également essayé les différentes variantes de ceci comme $ (document) .ready et jQuery etc.

C'est une application MVC 2 sur .net 3.5, je suis sûr que je suis vraiment dense, partout sur google dit de vérifier que le fichier est référencé correctement, ce que j'ai vérifié et vérifié à nouveau, veuillez conseiller! : /

Paul Creasey
la source
6
Voyez-vous réellement le jquery-1.3.2.js demandé et chargé avec le code de réponse HTTP200, si vous inspectez le chargement de la page avec l'outil Fiddler?
naïvistes
18
votre script s'exécute-t-il avant jquery?
Surya
2
Pouvez-vous afficher la source et cliquer sur le lien js. Il semble que votre requête ne soit pas chargée sur la page. Essayez l'écran de la console Firebug pour voir les erreurs Essayez également ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js dans votre balise de script
nemke
2
Votre script se déclenche-t-il avant le chargement de la source jquery?
Dave Bacher
1
@ Surya / Dave, je suis rentré chez moi maintenant, donc je vais vérifier à nouveau demain, et je reviendrai et posterai, mais je pense que probablement le problème,: / comment embarrassant!
Paul Creasey

Réponses:

560

Cette erreur ne peut être causée que par l'une des trois choses suivantes:

  1. Votre fichier JavaScript n'est pas correctement chargé dans votre page
  2. Vous avez une version bâclée de jQuery. Cela peut se produire parce que quelqu'un a édité le fichier core ou qu'un plugin a écrasé la variable $.
  3. Vous avez JavaScript en cours d'exécution avant le chargement complet de la page, et en tant que tel, avant le chargement complet de jQuery.

Tout d'abord, assurez-vous que le script est appelé correctement, il devrait ressembler à

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

et ne devrait pas avoir d'attributs asynchrones ou différés .

Ensuite, vous devriez vérifier le panneau net Firebug pour voir si le fichier est réellement chargé correctement. Sinon, il sera surligné en rouge et indiquera "404" à côté. Si le fichier se charge correctement, cela signifie que le problème est le numéro 2.

Assurez-vous que tout le code javascript jQuery est exécuté dans un bloc de code tel que:

$(document).ready(function () {
  //your code here
});

Cela garantira que votre code est chargé après l' initialisation de jQuery.

Une dernière chose à vérifier est de vous assurer que vous ne chargez aucun plugin avant de charger jQuery. Les plugins étendent l'objet "$", donc si vous chargez un plugin avant de charger le noyau jQuery, vous obtiendrez l'erreur que vous avez décrite.

Remarque: Si vous chargez du code qui ne nécessite pas l'exécution de jQuery, il n'est pas nécessaire de le placer dans le gestionnaire prêt pour jQuery. Ce code peut être séparé en utilisant document.readyState.

Mike Trpcic
la source
182
En ce qui concerne votre bloc de code, $(document)ne fonctionnera pas non plus sauf si vous avez une balise de script incluant jQuery avant cette déclaration ...
PatrikAkerstrand
3
Je voudrais ajouter que j'avais le même problème que l'OP et mon problème était que l'utilisation de https avec la bibliothèque de jquery ne fonctionne pas si bien.
Mike Cheel
20
(fonction ($) {}) (jQuery);
JackMahoney
2
@Patrik: Voir ma réponse pour une solution en utilisant une section de scripts dans la vue. De cette façon, jquery sera chargé en premier et $ sera correctement défini.
angularsen
1
Vérifiez si vous avez également async sur le script, c'est ce qui a causé le problème dans mon cas.
Anders
207

Il se peut que votre balise de script soit appelée avant l'appel du script jquery.

<script type="text/javascript" src="js/script.js"></script>

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

Il en résulte que $ n'est pas défini

Mettez le jquery.js avant votre balise de script et cela fonctionnera;) comme ceci:

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

<script type="text/javascript" src="js/script.js"></script>
Hanky ​​Panky
la source
1
Ceci est une excellente réponse. Je l'ai essayé et cela a fonctionné pour moi. J'utilise VS 2013 et ASP.net. Savez-vous comment je peux charger javascript avant que la page ne se charge automatiquement dans asp.net ou dois-je référencer javascript de cette façon dans tous mes fichiers?
Pat
Pour ajouter à votre réponse. Dans ASP.net, vous pouvez aller dans Shared_Layout.cshtml `<head> </head>`
Pat
@pat et assurez-vous d'écrire votre code dans une @section Scriptsbalise
Marc
Veuillez mettre à jour la réponse pour utiliser HTTPS et envisager l'utilisation de SPI devdocs.io/html/attributes#integrity-attribute
Josh Habdas
66

Vous devez d'abord vous assurer que le script jQuery est chargé. Cela peut provenir d'un CDN ou local sur votre site Web. Si vous ne le chargez pas avant d'essayer d'utiliser jQuery, il vous indiquera que jQuery n'est pas défini.

<script src="jquery.min.js"></script>

Cela pourrait être dans la tête ou dans le pied de page de la page, assurez-vous simplement de le charger avant d'essayer d'appeler tout autre élément jQuery.

Ensuite, vous devez utiliser l'une des deux solutions ci-dessous

(function($){
// your standard jquery code goes here with $ prefix
// best used inside a page with inline code, 
// or outside the document ready, enter code here
 })(jQuery); 

ou

jQuery(document).ready(function($){
// standard on load code goes here with $ prefix
// note: the $ is setup inside the anonymous function of the ready command
});

veuillez noter que plusieurs fois $ (document) .ready (function () {// code here}); ne fonctionnera pas.

Andrew Killen
la source
1
"jQuery n'est pas défini". Il existe cependant après le chargement de la page.
Paul Totzke
Je ne sais pas s'il s'agit d'une question ou d'une déclaration, mais je vérifierais que vous appelez le script jQuery avant d'essayer de l'utiliser. Cela ressemble à votre chargement dans le pied de page et à l'appel des choses plus haut sur la page.
Andrew Killen
Désolé, je pensais que c'était une technique que vous pouviez utiliser les scripts dans n'importe quel ordre. Oui, je l'utilisais dans la section corps dans le style MVC. mycode.js puis jQuery.js sont les 2 dernières choses sur la page.
Paul Totzke
Pas de soucis Paul, j'ai édité la solution pour inclure "vous devez ... charger d'abord". :)
Andrew Killen
Cela résout-il le problème de "Mes scripts sont dans le bon ordre mais les scripts sont chargés dans un ordre différent". Je me souviens d'avoir fait quelque chose comme ça il y a 4 ans, mais je ne me souviens pas quel problème cela a résolu.
Paul Totzke
50

Si l'appel du plugin jQuery est à côté de </body>et que votre script est chargé avant cela, vous devez faire en sorte que votre code s'exécute après l' window.onloadévénement, comme ceci:

window.onload = function() {
  //YOUR JQUERY CODE
}

"

ainsi, votre code ne s'exécutera qu'après le chargement de la fenêtre, lorsque tous les actifs auront été chargés. À ce stade, le jQuery ( $) sera défini.

Si vous l'utilisez:

$(document).ready(function () {
  //YOUR JQUERY CODE
});

"

le $n'est pas encore défini pour le moment, car il est appelé avant le chargement de jQuery, et votre script échouera sur cette première ligne de la console.

dandapereira
la source
Généralement une mauvaise idée de lier window.unload. Ce sera effectivement le seul événement qui se déroulera !!!
Rudi Strydom
Remarque: N'oubliez pas que vous ne pouvez affecter qu'une seule fonction window.onload, si vous lui affectez une autre fonction, la précédente ne sera pas exécutée.
Bruno Peres
28

Je viens de faire la même chose et j'ai trouvé que j'avais beaucoup de

type="text/javacsript"

Ils étaient donc en train de charger, mais aucune autre indication de pourquoi cela ne fonctionnait pas. Inutile de dire que l'orthographe correcte l'a corrigé.

George R
la source
Note du modérateur : la faute de frappe dans ce post est délibérée , pour illustrer un point. Veuillez ne pas modifier le message pour «corriger» cela.
Martijn Pieters
23

Utiliser une section de scripts dans la vue et la disposition principale.

Placez tous vos scripts définis dans votre vue dans une section Scripts de la vue. De cette façon, vous pouvez charger la disposition principale après le chargement de tous les autres scripts. Il s'agit de la configuration par défaut lors du démarrage d'un nouveau projet Web MVC5. Pas sûr des versions antérieures.

Vues / Foo / MyView.cshtml:

// The rest of your view code above here.

@section Scripts 
{ 
    // Either render the bundle defined with same name in BundleConfig.cs...
    @Scripts.Render("~/bundles/myCustomBundle")

    // ...or hard code the HTML.
    <script src="URL-TO-CUSTOM-JS-FILE"></script>

    <script type="text/javascript">
      $(document).ready(function () {

        // Do your custom javascript for this view here. Will be run after 
        // loading all the other scripts.            
      });
    </script>
}

Vues / Partagé / _Layout.cshtml

<html>
<body>
    <!-- ... Rest of your layout file here ... -->

    @Scripts.Render("~/bundles/jquery")
    @Scripts.Render("~/bundles/bootstrap")
    @RenderSection("scripts", required: false)
</body>
</html>

Notez comment la section des scripts est restituée en dernier dans le fichier de disposition principal.

angularsen
la source
2
Remarque: Les sections de vue ne sont pas prises en charge dans les vues partielles par conception.
Adam Naylor
C'est ce que je devais faire pour mon correctif .... et j'aurais dû mieux utiliser les @Scripts en premier lieu, mais je l'ai oublié jusqu'à ce que je cherche un correctif.
Caverman
12

assurez-vous que vous chargez vraiment jquery ce n'est pas jquery - c'est l'interface utilisateur!

  <script language="JavaScript" 
    src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.0/jquery-ui.min.js">
  </script>

Ceci est une source de script correcte pour jquery:

 <script language="JavaScript"  src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
Wolfgang Fahl
la source
11

Comme indiqué ci-dessus, cela se produit en raison du conflit de $ variable.

J'ai résolu ce problème en réservant une variable secondaire pour jQuery sans conflit.

var $j = jQuery.noConflict();

puis l'utiliser n'importe où

$j( "div" ).hide();

plus de détails peuvent être trouvés ici

Naveed Abbas
la source
8

Cela signifie que votre bibliothèque jQuery n'a pas encore été chargée.

Vous pouvez déplacer votre code après avoir extrait la bibliothèque jQuery.

ou vous pouvez utiliser quelque chose comme ça

window.onload = function(){
  // Your code here
};  
Nesar
la source
Cela se déclenche après le chargement du DOM, mais pas lorsque les contrôles, javascript et autres programmes exécutés en arrière-plan ont été chargés. Un délai devra être utilisé pour que cela fonctionne.
Fandango68
5

après quelques tests j'ai trouvé une solution rapide, vous pouvez ajouter en haut de votre page d'index:

<script>
$=jQuery;
</script>

ça marche très bien :)

Mimouni
la source
4
la question était: $ n'est pas défini, non?
Mimouni
Uncaught ReferenceError: jQuery n'est pas défini
Simon Schnell
L'avez-vous placé juste sous l'importation de la bibliothèque jQuery?
Mike Warren
4

J'ai reçu le même message d'erreur lorsque j'ai mal orthographié la référence jQuery et au lieu de type="text/javascript"j'ai tapé "... javascirpt". ;)

alan
la source
Eureka! J'avais le mien comme type="text/css". Merci d'avoir sauvé ma raison!
Jeriko
J'ai gaffé et je l'ai eu type="javascript". J'ai perdu 30 minutes à le trouver.
maçon
4

Il semble que jQuery ne se charge pas correctement. Quelle source / version utilisez-vous?

Alternativement, il pourrait s'agir d'une collision d'espace de noms, essayez donc d'utiliser explicitement jQuery au lieu de l'utiliser $. Si cela fonctionne, vous voudrez peut-être utiliser noConflictpour vous assurer que l'autre code utilisé $ne se casse pas.

Alexender Dumma
la source
3

Cette erreur signifie que jQuery n'a pas encore été chargé sur la page. Utiliser $(document).ready(...)ou toute variante de celui-ci ne servira à rien, tout comme $la fonction jQuery.

L'utilisation window.onloaddevrait fonctionner ici. Notez qu'une seule fonction peut être affectée à window.onload. Pour éviter de perdre la logique de chargement d'origine, vous pouvez décorer la fonction d'origine comme suit:

originalOnload = window.onload;
window.onload = function() {
  if (originalOnload) {
    originalOnload();
  }
  // YOUR JQUERY
};

Cela exécutera la fonction qui a été affectée à l'origine window.onload, puis s'exécutera // YOUR JQUERY.

Voir https://en.wikipedia.org/wiki/Decorator_pattern pour plus de détails sur le motif décorateur.

Kyle McVay
la source
2

J'utilise Url.Content et n'ai jamais de problème.

<script src="<%= Url.Content ("~/Scripts/jquery-1.4.1.min.js") %>" type="text/javascript"></script>
mdm20
la source
2

Dans la solution, il est mentionné - "Une dernière chose à vérifier est de vous assurer que vous ne chargez aucun plugin avant de charger jQuery. Les plugins étendent l'objet" $ ", donc si vous chargez un plugin avant de charger le noyau jQuery, alors vous obtiendrez l'erreur que vous avez décrite. "

Pour éviter cela -

De nombreuses bibliothèques JavaScript utilisent $ comme nom de fonction ou de variable, tout comme jQuery. Dans le cas de jQuery, $ est juste un alias pour jQuery, donc toutes les fonctionnalités sont disponibles sans utiliser $. Si nous devons utiliser une autre bibliothèque JavaScript avec jQuery, nous pouvons retourner le contrôle de $ à l'autre bibliothèque en appelant $ .noConflict ():


la source
1

J'ai eu ce problème une fois sans raison apparente. Il se produisait localement pendant que je courais via le serveur de développement aspnet. Cela fonctionnait et j'ai tout remis dans un état où cela fonctionnait auparavant et cela ne fonctionnait toujours pas. J'ai regardé dans le débogueur Chrome et le jquery-1.7.1.min.js s'était chargé sans aucun problème. C'était très déroutant. Je ne sais toujours pas quel était le problème, mais en fermant le navigateur, en fermant le serveur de développement, puis en réessayant.

cedd
la source
1

Placez simplement l'URL jquery en haut de votre code jquery

comme ça--

<script src="<%=ResolveUrl("~/Scripts/jquery-1.3.2.js")%>" type="text/javascript"></script>

<script type="text/javascript">
    $(function() {
        $('#post').click(function() {
            alert("test"); 
        });
    });
</script>
vikrantx
la source
1

J'ai eu le même problème et c'était parce que ma référence au jQuery.js n'était pas dans la balise. Une fois que j'ai changé cela, tout a commencé à fonctionner.

Anthony

Anthony
la source
1
  1. Vérifiez que le chemin exact de votre fichier jquery est inclus.

    <script src="assets/plugins/jquery/jquery.min.js"></script>

si vous ajoutez ceci en bas de votre page, veuillez appeler la fonction JS en dessous de cette déclaration.

  1. Vérifiez en utilisant ce test de code,

    <script type="text/javascript">
    /***
     * Created by dadenew
     * Submit email subscription using ajax
     * Send email address
     * Send controller
     * Recive response
     */
    $(document).ready(function() { //you can replace $ with Jquery
    
      alert( 'jquery working~!' );
    });

Paix!

Daniel Adenew
la source
0

Nous avons le même problème .... mais accidentellement, j'ai vérifié les propriétés du dossier et défini quelque chose ...

Vous devez vérifier les propriétés de chaque dossier auquel vous accédez.

  1. dossier clic droit
  2. onglet «autorisations»
  3. définir l'accès au dossier: PROPRIÉTAIRE: créer et supprimer des fichiers GROUPE: accéder aux fichiers AUTRES: accéder aux fichiers

J'espère que c'est la solution ......

RoyS_philippines
la source
0

Lorsque vous utilisez jQuery dans asp.net, si vous utilisez une page maître et que vous y chargez le fichier source jquery, assurez-vous de disposer de l'espace de contenu content header après toutes les références du script jquery.

J'ai eu un problème où toutes les pages qui utilisaient cette page maître retournaient «$ n'est pas défini» simplement parce que l'ordre incorrect faisait exécuter le code côté client avant la création de l'objet jquery. Assurez-vous donc d'avoir:

<head runat="server">
    <script type="text/javascript" src="Scripts/jquery-VERSION#.js"></script>
    <asp:ContentPlaceHolder id="Header" runat="server"></asp:ContentPlaceHolder>
</head>

De cette façon, le code s'exécutera dans l'ordre et vous pourrez exécuter le code jQuery sur les pages enfants.

Francis Musignac
la source
0

Dans mon cas, je pointais sur Google hébergé JQuery. Il était inclus correctement, mais j'étais sur une page HTTPS et je l'appelais via HTTP. Une fois que j'ai résolu le problème (ou autorisé le contenu non sécurisé), il s'est déclenché.

Anthony
la source
0

J'avais ce même problème et je ne pouvais pas comprendre ce qui en était la cause. J'ai récemment converti mes fichiers HTML du japonais en UTF-8, mais je n'ai rien fait avec les fichiers de script. D'une certaine manière, jquery-1.10.2.min.js a été corrompu dans ce processus (je ne sais toujours pas comment). Le remplacement de jquery-1.10.2.min.js par l'original l'a corrigé.

Gavin
la source
0

il semble que si vous localisez vos fichiers jquery.js sous le même dossier ou dans certains sous-dossiers où se trouve votre fichier html, le problème Firebug est résolu. Par exemple, si votre html est sous C: / dossier1 /, alors vos fichiers js doivent être quelque part sous C: / dossier1 / (ou C: / dossier1 / dossier2, etc.) également et adressés en conséquence dans le document html. J'espère que cela t'aides.

sc123
la source
0

J'ai le même problème et aucun cas ne me résout le problème. La seule chose qui fonctionne pour moi, c'est de mettre le fichier Site.master, le suivant:

<script src="<%= ResolveUrl("~/Scripts/jquery-1.7.1.min.js") %>" type="text/javascript"></script>
<script src="<%= ResolveUrl("~/Scripts/bootstrap/js/bootstrap.min.js") %>" type="text/javascript"></script>

Avec src = "<% = ResolveUrl (" ") ... la charge de jQuery dans les pages de contenu est correcte.

amélien
la source
0

J'ai eu un problème très similaire. Dans mon application C # MVC, JQuery n'était pas reconnu. J'avais besoin de déplacer le @ Scripts.Render ("~ / bundles / jquery") du bas de mon fichier _Layout.cshtml vers le début de la section. Assurez-vous également d'avoir saisi Jquery en tant que package Nuget si vous utilisez Visual Studio!

<head>
    @Scripts.Render("~/bundles/jquery")
</head>
BHOW
la source
0

Il existe un moyen de le faire charger automatiquement le javascript avant l'exécution du reste du code.

Allez dans Views \ Shared_Layout.html et ajoutez ce qui suit

<head>
  <*@ Omitted code*@>
  <script src="~/Scripts/jquery-1.10.2.min.js" type="text/javascript"></script>
</head>
Tapoter
la source
0

si la scriptbalise a un deferattribut, elle montre l'erreur

Uncaught ReferenceError: $ n'est pas défini

et doit supprimer l'attribut deferde la scriptbalise

AbdulAhmad Matin
la source
0

C'est le problème commun pour résoudre ce problème, vous devez vérifier un certain point

  1. Inclure la bibliothèque principale de Jquery
  2. Vérifier le problème du navigateur croisé
  3. Ajouter une bibliothèque en haut du code jquery
  4. Vérifiez que les CDN sont peut-être bloqués.

Tous les détails sont donnés dans ce blog cliquez ici

Anju Batta
la source