130 votes

Comment faire en sorte que l'exécution de script attende que jquery soit chargé ?

J'ai un problème où la page se charge tellement vite 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, d'attendre un moment puis de réessayer ?


En réponse aux réponses/commentaires ci-dessous, je mets en ligne une partie du balisage.

La situation... asp.net masterpage et childpage.

Dans la page principale, 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 chargé, il se plaint que "$ est indéfini".

J'ai placé des alertes à plusieurs endroits du balisage pour voir dans quel ordre les choses se déclenchaient, et j'ai confirmé qu'elles se déclenchaient dans cet ordre :

  1. En-tête de la page principale.
  2. Le bloc de contenu 1 de la page enfant (situé à l'intérieur du de la page maîtresse, mais après que les scripts de la page maîtresse sont appelés).
  3. 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 principale, il y a un ContentPlaceHolder supplémentaire :

 <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
                </asp:ContentPlaceHolder>

Dans la page de l'enfant, cela se présente comme suit :

<%@ 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();
    });

});

35voto

moisrex Points 397

Le moyen le plus simple et le plus sûr est d'utiliser quelque chose comme ceci :

var waitForJQuery = setInterval(function () {
    if (typeof $ != 'undefined') {

        // place your code here.

        clearInterval(waitForJQuery);
    }
}, 10);

26voto

malko Points 1407

Vous pouvez utiliser l'attribut defer pour charger le script à la fin.

<script type='text/javascript' src='myscript.js' defer='defer'></script>

mais normalement le chargement de vos script dans le bon ordre devrait faire l'affaire, donc assurez-vous de placer l'inclusion de jquery avant vos propres script.

Si votre code se trouve dans la page et non dans un fichier js séparé, vous devez exécuter votre script uniquement lorsque le document est prêt et encapsuler votre code de cette manière devrait également fonctionner :

$(function(){
//here goes your code
});

22voto

10basetom Points 400

C'est une autre façon de procéder, bien que la méthode de report de Darbio soit plus flexible.

(function() {
  var nTimer = setInterval(function() {
    if (window.jQuery) {
      // Do something with jQuery
      clearInterval(nTimer);
    }
  }, 100);
})();

18voto

Nigrimmist Points 41

Vous pouvez essayer l'événement onload. Il est déclenché lorsque tous les scripts ont été chargés :

window.onload = function () {
   //jquery ready for use here
}

Mais gardez à l'esprit que vous pouvez remplacer d'autres scripts par window.onload.

16voto

Annarfych Points 316

J'ai constaté que la solution proposée ne fonctionne que si l'on tient compte du code asynchrone. Voici la version qui fonctionnerait dans les deux cas :

document.addEventListener('DOMContentLoaded', function load() {
    if (!window.jQuery) return setTimeout(load, 50);
    //your synchronous or asynchronous jQuery-related code
}, false);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X