J'ai un problème où la page se charge si rapidement, que jquery n'a pas fini de se charger avant d'être appelé par un script ultérieur. Existe-t-il un moyen de vérifier l'existence de jquery et s'il n'existe pas, attendez un moment, puis réessayez?
En réponse aux réponses / commentaires ci-dessous, je publie une partie du balisage.
La situation ... asp.net masterpage et childpage.
Dans la masterpage, j'ai une référence à jquery. Ensuite, dans la page de contenu, j'ai une référence au script spécifique à la page. Lorsque le script spécifique à la page est en cours de chargement, il se plaint que "$ n'est pas défini".
J'ai mis des alertes à plusieurs endroits dans le balisage pour voir l'ordre dans lequel les choses se déclenchaient et j'ai confirmé qu'il se déclenche dans cet ordre:
- En-tête de page maître.
- Bloc de contenu 1 de la page enfant (situé à l'intérieur de l'en-tête de la page maître, mais après l'appel des scripts de la page maître).
- Bloc de contenu de la page enfant 2.
Voici le balisage en haut de la page principale:
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site.master.cs" Inherits="SiteMaster" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title>Reporting Portal</title>
<link href="~/Styles/site.css" rel="stylesheet" type="text/css" />
<link href="~/Styles/red/red.css" rel="stylesheet" type="text/css" />
<script type="text/Scripts" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script>
<script type="text/Scripts" language="javascript" src="../Scripts/jquery.dropdownPlain.js"></script>
<script type="text/Scripts" language="javascript" src="../Scripts/facebox.js"></script>
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
Ensuite, dans le corps de la page maître, il y a un ContentPlaceHolder supplémentaire:
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
Dans la page enfant, cela ressemble à ceci:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Dashboard.aspx.cs" Inherits="Data.Dashboard" %>
<%@ Register src="../userControls/ucDropdownMenu.ascx" tagname="ucDropdownMenu" tagprefix="uc1" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
<link rel="stylesheet" type="text/css" href="../Styles/paserMap.css" />
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
***CONTENT HERE***
<script src="../Scripts/Dashboard.js" type="text/javascript"></script>
</asp:Content>
Voici le contenu du fichier "../Script/Dashboard.js":
$(document).ready(function () {
$('.tgl:first').show(); // Show the first div
//Description: East panel parent tab navigation
$('.tabNav label').click(function () {
$('.tabNav li').removeClass('active')
$(this).parent().addClass('active');
var index = $(this).parent('li').index();
var divToggle = $('.ui-layout-content').children('div.tgl');
//hide all subToggle divs
divToggle.hide();
divToggle.eq(index).show();
});
});
la source
$(document).ready(function(){...});
?<script src="...">
balises, cela ne peut pas arriver. Utilisez-vous quelque chose comme RequireJS ou LABjs?$(document).ready()
ou$(window).load()
? Pouvons-nous voir un exemple?type="text/Scripts"
àtype="text/javascript"
, ou se débarrasser de tout cela ensemble , il est pas nécessaire plus, se débarrasser aussi dulanguage="javascript
. Autant commencer à essayer des choses.Réponses:
Éditer
Pourriez-vous essayer le type correct pour vos balises de script? Je vois que vous utilisez
text/Scripts
, qui n'est pas le bon type MIME pour javascript.Utilisez ceci:
terminer la modification
ou vous pouvez jeter un œil à require.js qui est un chargeur pour votre code javascript.
en fonction de votre projet, cela pourrait cependant être un peu exagéré
la source
En retard à la fête, et similaire à la question de Briguy37, mais pour référence future, j'utilise la méthode suivante et transmets les fonctions que je veux différer jusqu'à ce que jQuery soit chargé:
Il appellera récursivement la méthode defer toutes les 50 ms jusqu'à ce qu'il
window.jQuery
existe, moment où il sort et appellemethod()
Un exemple avec une fonction anonyme:
la source
script
balise qui charge jQuery avait undefer
attribut, cela causerait le problème en ne se chargeant que plus tard, malgré l'ordre défini par le code des scripts.vous pouvez utiliser l'attribut defer pour charger le script à la fin.
mais normalement charger votre script dans le bon ordre devrait faire l'affaire, alors assurez-vous de placer l'inclusion jquery avant votre propre script
Si votre code se trouve dans la page et non dans un fichier js séparé, vous ne devez donc exécuter votre script qu'une fois le document prêt et l'encapsulation de votre code comme celle-ci devrait également fonctionner:
la source
Encore une autre façon de le faire, bien que la méthode de report de Darbio soit plus flexible.
la source
le moyen le plus simple et le plus sûr est d'utiliser quelque chose comme ceci:
la source
Vous pouvez essayer l'événement onload. Il s'est déclenché lorsque tous les scripts ont été chargés:
Mais gardez à l'esprit que vous pouvez remplacer d'autres scripts où window.onload utilise.
la source
J'ai trouvé que la solution suggérée ne fonctionnait qu'en tenant compte du code asynchrone. Voici la version qui fonctionnerait dans les deux cas:
la source
load
fonction, mais vous la réutilisez égalementsetTimeout
.C'est un problème courant, imaginez que vous utilisez un moteur de création de modèles PHP sympa, donc vous avez votre mise en page de base:
Et bien sûr, vous lisez quelque part, il vaut mieux charger Javascript en bas de page, pour que votre contenu dynamique ne sache pas qui est jQuery (ou le $).
Vous avez aussi lu quelque part que le petit Javascript en ligne est bon, alors imaginez que vous avez besoin de jQuery dans une page, baboom, $ n'est pas défini (.. encore ^^).
J'adore la solution fournie par Facebook
Donc, en tant que programmeur paresseux (je devrais dire un bon programmeur ^^), vous pouvez utiliser un équivalent (dans votre page):
Et ajoutez en bas de votre mise en page, après jQuery, incluez
la source
Plutôt que d '«attendre» (ce qui est généralement fait en utilisant
setTimeout
), vous pouvez également utiliser la définition de l'objet jQuery dans la fenêtre elle-même comme un hook pour exécuter votre code qui en dépend. Ceci est réalisable grâce à une définition de propriété, définie à l'aide deObject.defineProperty
.la source
window.jQuery
une valeur, en définissant lajQuery
variable dans la portée globale (iewindow
). Cela déclenchera la fonction de définition de propriété sur l'objet de fenêtre défini dans le code.</body>
au lieu d'avant</head>
Utilisation:
Consultez ceci pour plus d'informations: http://www.learningjquery.com/2006/09/introducing-document-ready
Remarque: cela devrait fonctionner tant que l'importation de script pour votre bibliothèque JQuery est au-dessus de cet appel.
Mettre à jour:
Si, pour une raison quelconque, votre code ne se charge pas de manière synchrone (ce que
je n'ai jamais rencontré, mais apparemment peut-être possible à partir du commentaire ci-dessousne devrait pas se produire), vous pouvez le coder comme suit.la source
Je n'aime pas trop les trucs d'intervalle. Quand je veux différer jquery, ou quoi que ce soit en fait, ça se passe généralement comme ça.
Commencer avec:
Ensuite:
Puis finalement:
Ou la version la moins époustouflante:
Et dans le cas de l'async, vous pouvez exécuter les fonctions poussées sur jquery onload.
Alternativement:
la source
Développons
defer()
Dario pour être plus réutilisable.Qui est alors exécuté:
la source
Je ne pense pas que ce soit votre problème. Le chargement du script est synchrone par défaut, donc à moins que vous n'utilisiez l'
defer
attribut ou que vous ne chargiez jQuery lui-même via une autre requête AJAX, votre problème ressemble probablement plus à un 404. Pouvez-vous montrer votre balisage et nous faire savoir si vous voyez quelque chose de suspect dans Firebug ou inspecteur Web?la source
Vérifie ça:
https://jsfiddle.net/neohunter/ey2pqt5z/
Cela créera un faux objet jQuery, qui vous permettra d'utiliser les méthodes onload de jquery, et elles seront exécutées dès que jquery sera chargé.
Ce n'est pas parfait.
la source
Une note tangentielle sur les approches ici qui utilisent la charge
setTimeout
ousetInterval
. Dans ces cas, il est possible que lorsque votre vérification s'exécute à nouveau, le DOM soit déjà chargé et l'DOMContentLoaded
événement du navigateur ait été déclenché, vous ne pouvez donc pas détecter cet événement de manière fiable en utilisant ces approches. Ce que j'ai trouvé, c'est que jQueryready
fonctionne toujours, vous pouvez donc intégrer votrejQuery(document).ready(function ($) { ... }
à l'intérieur de votre
setTimeout
ousetInterval
et tout devrait fonctionner normalement.la source