IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

Comment débugger un javascript qui est chargé via Ajax ?


Sujet :

jQuery

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 69
    Points : 59
    Points
    59
    Par défaut Comment débugger un javascript qui est chargé via Ajax ?
    Bonjour à tous,

    Je viens poster une nouvelle discussion car je suis confronté à un problème.

    J'aimerai savoir comment faire pour débugger un fichier JavaScript est chargé via Ajax ?

    Je m'explique :

    J'ai une page web, dans laquelle se trouve un bouton qui m'affiche une popin via lightbox et jquery. Cette popin correspond à une JSP qui contient un fichier JavaScript qui lui est propre.

    Ce que j'aimerai, c'est pouvoir débugger ce JavaScript au travers de Firebug pour pouvoir mettre des points d’arrêt et m'assurer que tout se déroule bien.

    Hors je ne peux pas mettre de point d'arrêt dans ce JavaScript pour la simple et bonne raison que celui-ci n'apparait pas dans l'onglet script de Firebug

    Ce que j'ai constaté, c'est que le fichier en question est chargé via Ajax. J'ai constaté cela dans l'onglet réseau de Firebug. Mais impossibilité de le débugger

    Est-ce quelqu'un à déjà eu ce problème ? Ou est-ce que quelqu'un pourrait essayer de m'aider à résoudre ce problème ?

    Je vous remercie par avance pour votre aide.

  2. #2
    Membre régulier Avatar de marcbuils
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2012
    Messages : 99
    Points : 124
    Points
    124
    Par défaut
    Bonjour Walkn,

    Je ne vais pas avoir la réponse à ton problème, mais personnellement, j'utilise le moyen suivant afin de le contourner:
    - ajoute une balise script qui charge ton fichier sur ta page principale, comme ça tu devrais pouvoir déboguer ton JS.

    Je sais que ce n'est pas l'idéale, mais je n'ai pas encore trouvé de débogueur qui prenne en compte les chargements dynamiques en Ajax.

    @++,
    Marc

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 69
    Points : 59
    Points
    59
    Par défaut
    Bonjour marcbuils,

    Merci pour ton retour. En somme, ce que tu me conseils, c'est de ne plus charger mon JavaScript correspondant à ma popin au moment où celle-ci apparait mais plutôt au sein de la page principale ?

    D'autre part, j'ai essayé en rajoutant à l'endroit où je souhaite débugger mon JavaScript mais cela ne fonctionne pas non plus ...

    Est-ce quelqu'un aurait réussi à débugger des JavaScripts chargés dynamiquement en Ajax ??

    Encore merci d'avance pour votre aide.

  4. #4
    Membre régulier Avatar de marcbuils
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2012
    Messages : 99
    Points : 124
    Points
    124
    Par défaut
    Pas exactement,

    Je te conseil, juste le temps de ton debug, de rajouter un chargement classique en avec la balise script. Je pense que tu peux même garder le chargement dynamique en plus, il me semble que Firebug arrive à s'en sortir (à tester...).

  5. #5
    Membre régulier Avatar de marcbuils
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2012
    Messages : 99
    Points : 124
    Points
    124
    Par défaut
    Bonjour Walkn,

    Je reviens vers toi car depuis ton message, on m'a fait découvrir une nouvelle méthode pour charger les fichiers de manière asynchrone: le LazyLoad.
    Un des avantages de cette méthode, c'est que le fichiers chargés sont débogable avec Firebug.

    Le principe est d'ajouter des balise scripts dans le header de la page Web et non de les charger en Ajax, mais sur le fond le résultat est le même.

    Voici une fonction qui fait ça très bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    // lazyload script
    // ref: http://www.nczonline.net/blog/2009/07/28/the-best-way-to-load-external-javascript/
    var _loadScript = function(url, callback){
    	var script = document.createElement("script")
    	script.type = "text/javascript";
     
    	if (script.readyState){ //IE
    		script.onreadystatechange = function(){
    		if ( script.readyState == "loaded" || script.readyState == "complete"){
    			script.onreadystatechange = null;
    			callback();
    		}
    	};
    	} else { //Others
    		script.onload = function(){
    			callback();
    		};
    	}
     
    	script.src = url;
    	document.getElementsByTagName("head")[0].appendChild(script);
    };
    @++,

    Marc

  6. #6
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Et avec $.getScript() ?

  7. #7
    Membre régulier Avatar de marcbuils
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2012
    Messages : 99
    Points : 124
    Points
    124
    Par défaut
    Avec jQuery.getScript(), j'utilise la méthode suivante:

    Imaginons qu'on souhaite débugger le fichier test.js suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ;(function($){
    	$(function(){
    		$('#test').click(function(){
    			alert('div selectionne');
    		});
    	} );
    })(jQuery);
    La page HTML pourrait ressembler à ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <!doctype>
    <html>
    	<head>
    		<meta charset="utf8"></meta>
    		<title>test de jQuery.getScript( url [, success(script, textStatus, jqXHR)] )</title>
    		<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    		<script>
    			;(function($){
    				$.getScript( 'test.js', function( script, textStatus, jqXHR ){
    					alert("script charge");
    				});
    			})(jQuery);
    		</script>
    	</head>
    	<body>
    		<div id="test">clique ici</div>
    	</body>
    </html>
    Mais avec cette méthode on a en effet un problème, tout le code apparait sur une seule ligne sous Firebug ce qui ne nous permet pas de pouvoir le debugger.
    Dans ce cas, le temps du debug, je rajoute le chargement du script directement dans le header.

    Ce qui donnerais la page HTML suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <!doctype>
    <html>
    	<head>
    		<meta charset="utf8"></meta>
    		<title>test de jQuery.getScript( url [, success(script, textStatus, jqXHR)] )</title>
    		<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
     
    		<!-- Chargement classique du script le temps du debug -->
    		<script src="test.js"></script>
     
    		<script>
    			;(function($){
    				$.getScript( 'test.js', function( script, textStatus, jqXHR ){
    					alert("script charge");
    				});
    			})(jQuery);
    		</script>
    	</head>
    	<body>
    		<div id="test">clique ici</div>
    	</body>
    </html>
    Avec cette méthode, le fichier "test.js" apparait sous firebug ce qui nous permet de pouvoir ajouter des points d'arrêts.


    Cependant, si on peut utiliser la fonction loadScript à la place de $.getScript, je pense qu'il ne faut surtout pas s'en priver car elle offre les même avantages mais en plus elle permet de debugger son code sans manipulation supplémentaire.


    Bon code,

    Marc

  8. #8
    Membre régulier Avatar de marcbuils
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2012
    Messages : 99
    Points : 124
    Points
    124
    Par défaut
    Salut,

    Pour information, suite à ce post, je viens de créer un plugin jQuery qui utilise le système de lazyload mais cette fois ci complètement intégré à jQuery:
    jQuery.loadScript - http://marcbuils.github.com/jquery.loadscript/

    Ce plugin permet aussi de charger plusieurs script et d'exécuter une callback qu'une fois tous les scripts chargés (grace à l'utilisation des Diferred).

    Voici quelques exemples d'utilisation:
    Exemple 1: Exemple utilisant les Diferred (recommandé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <!doctype>
    <html>
    	<head>
    		<meta charset="utf8"></meta>
    		<title>Exemple of jQuery.loadScript with differed</title>
    		<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    		<script src="../jquery.loadscript.js"></script>
    		<script>
    			;(function($){
    				$.loadScript('test.js').done(function(){
    					$('#test').test();
    				});
    			})(jQuery);
    		</script>
    	</head>
    	<body>
    		<div id="test"></div>
    	</body>
    </html>
    Exemple 2: Exemple utilisant le système de callback
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    <!doctype>
    <html>
    	<head>
    		<meta charset="utf8"></meta>
    		<title>Exemple of loadScript with callback</title>
    		<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    		<script src="../jquery.loadscript.js"></script>
    		<script>
    			;(function($){
    				$.loadScript('test.js', function(){
    					$('#test').test();
    				});
    			})(jQuery);
    		</script>
    	</head>
    	<body>
    		<div id="test">clique ici</div>
    	</body>
    </html>
    Exemple 3: Exemple de chargement de plusieurs scripts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    <!doctype>
    <html>
    	<head>
    		<meta charset="utf8"></meta>
    		<title>Exemple of multiple script loading</title>
    		<script src="http://code.jquery.com/jquery-1.8.2.min.js"></script>
    		<script src="../jquery.loadscript.js"></script>
    		<script>
    			;(function($){
    				$.when( $.loadScript('test.js'), $.loadScript('test2.js') ).done(function(){
    					$('#test').test();
    					$('#test2').test2();
    				});
    			})(jQuery);
    		</script>
    	</head>
    	<body>
    		<div id="test">clique ici</div>
    		<div id="test2">clique ici</div>
    	</body>
    </html>

    Qu'en pensez-vous ? Ça peut servir non ?

    @++,

    Marc

  9. #9
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Points : 22 933
    Points
    22 933
    Billets dans le blog
    125
    Par défaut
    Bonsoir

    Réponse au message n° 7.

    Je n'ai pas les mêmes résultats.

    Pour : $.getScript( "http://danielhagnoul.developpez.com/lib/plugin-dvjh/jquery.dvjhTooltip-2.8.3.js" );.

    Avec Firefox ou Chrome : j'ai accès normalement au code dans l'onglet "script" (Firebug) ou dans l'onglet "Sources" (Chrome).

    C'est uniquement les codes compressés (minified) qui se présentent sur une seule ligne. Par exemple : $.getScript( "http://danielhagnoul.developpez.com/lib/dvjh/mandelbrot.min.js" );.

  10. #10
    Membre régulier Avatar de marcbuils
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2012
    Messages : 99
    Points : 124
    Points
    124
    Par défaut
    En effet, lorsque j'essaye ta ligne je retrouve bien le script normalement dans Firebug.
    Le problème n'est donc présent que lorsqu'on charge un script local à son site, du coup jQuery privilégie un chargement Ajax alors que si le domaine du fichier est différent de celui de la page comme pour ton exemple, il n'a pas les droits nécessaires pour un chargement Ajax du coup il doit probablement faire un chargement classique par le biais de la balise script.

    Par contre, je ne sais pas si il est possible de forcer le comportement distant pour les scripts locaux ce qui, dans le cas du debug, serait intéressant...

  11. #11
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 643
    Points : 66 669
    Points
    66 669
    Billets dans le blog
    1
    Par défaut
    quel interet de le bebugguer lorsqu'il est chargé en ajax ... ???

    Autant le mettre en script externe le temps du developpement, ce qui permettra de le debugguer normalement et ne l'appeler en ajax qu'une fois debuggué ..

  12. #12
    Membre régulier Avatar de marcbuils
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2012
    Messages : 99
    Points : 124
    Points
    124
    Par défaut
    Pour ma part, je trouve que tant qu'à charger un script de façon asynchrone, autant qu'il soit debogable directement, ça permet de moins perdre de temps sur la mise en place du debug. Mais il faut savoir que je développe principalement des applications intranet RIA avec beaucoup de Javascipt (en general entre 20 et 30 fichiers js différents par projet, sans compter les librairies externes).
    Car je développe directement en html/javascript pour la partie client, sachant que la partie serveur n'est là que pour fournir des WebServices REST ou WebSocket).

Discussions similaires

  1. [VB.NET] Comment supprimer un fichier qui est utilisé ?
    Par Toon94 dans le forum Windows Forms
    Réponses: 12
    Dernier message: 13/06/2010, 12h59
  2. detecter si un javascript externe est chargé
    Par pyrou dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 25/05/2007, 08h36
  3. SDL: comment rendre l'image qui est déjà en mémoire?
    Par morning_wind dans le forum SDL
    Réponses: 4
    Dernier message: 16/01/2007, 08h32
  4. Réponses: 1
    Dernier message: 28/08/2006, 15h42
  5. Réponses: 4
    Dernier message: 03/08/2006, 16h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo