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

AJAX Discussion :

Conflit entre ajax et chargement d'une nouvelle page


Sujet :

AJAX

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 59
    Points : 47
    Points
    47
    Par défaut Conflit entre ajax et chargement d'une nouvelle page
    Bonjour,

    Schématiquement, je tente de sauvegarder les données d’un formulaire avant de changer de page, avec un lien ou autre.

    J’ai donc écrit une fonction :
    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
    function save_page(){
    	var fd = new FormData();
    	fd.append('num',$("#num").val());
    ...
    	$.ajax({
    		url:'ajax_page_update.php',
    		type:'post',
    		data:fd,	
    		dataType:'json',
    		contentType: false,
    		processData: false,
    		success:function(response){
    			if(response != ""){
    				if(response.res==1){	...
    				}
    		}		// fin de success
    	});		// fin de $.ajax 
    }
    Fonction que j'appelle par
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <a href='autre_page.php?num=...' onClick='return save_page()' >autre page</a>

    Le problème est que, si je termine la fonction par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function save_page(){
    ...
    	$.ajax({
    ...
    	});		// fin de $.ajax 
            return true;
    }
    la sauvegarde ne s'exécute pas...

    Alors que si je mets return false; } la sauvegarde s'exécute correctement ; mais, évidemment, le lien ne s'exécute pas...

    Si je place une alerte avant $.ajax :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function save_act(){
    	..
    	alert("ll");
    	$.ajax({
            ...
    	});		// fin de $.ajax         
            return true;
    }
    l'alerte s'affiche, même avec return true;.

    Je pense donc qu'il y a conflit entre les deux opérations. La fonction ajax n'a pas le temps de s'exécuter avant le chargement de la nouvelle page.

    J'ajoute que j'ai aussi essayé de remplacer le lien par un bouton submit dans un form, et d'utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    event.preventDefault();
    ...
    $(this).unbind('submit').submit();
    mais le comportement est exactement le même.

    Désolé si cette question a déjà été traitée.
    Merci pour toutes vos réponses.

  2. #2
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 896
    Points : 2 835
    Points
    2 835
    Par défaut
    Bonjour,

    Il faut bien comprendre que par défaut, JS tentera d'exécuter tout ce qui lui est possible de faire.

    Donc au lancement de la requête AJAX, c'est une requête non bloquante donc JS va continuer son petit bonhomme de chemin et va donc aller lire ce qu'il se passe après. C'est la qu'il trouve true et donc va suivre le lien cliqué
    Lorsque alert() est appelé, il s'agit d'une méthode bloquante et donc là tout fonctionne ! Car il a probablement de faire tout le call AJAX le temps qu'on click sur "OK"

    Le mieux est alors de tout bloquer par défaut, et de n'envoyer la réponse qu'au moment où on le souhaite, à savoir à la réponse AJAX.
    En réalité, on ne pourra pas utiliser true/false à ce moment, il s'agira donc de sauvegarder le lien et de simuler le changement d'URL au moment voulu (si et seulement si, tout s'est bien passé évidemment )

    Code javascript : 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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    // Si c'est un lien ou n'importe quoi, on utilise preventDefault()
    // S'il s'agit d'un formulaire, il faut écrire return false;
     
     
    // J'ai fait 2 versions :
     
    // 1 s'il s'agit d'un lien ou d'un bouton
    $('body').on('click', '.mon-bouton', function(e) {
    	e.preventDefault();
    	var success_url = $(this).attr('href'); // On va sauvegarder l'URL qu'on souhaite suivre
    	save_page(success_url);
    });
     
    // 2 s'il s'agit d'un formulaire
    $('body').on('submit', '#my-form', function() {
    	var success_url = $(this).attr('action'); // On va sauvegarder l'URL qu'on souhaite suivre
    	save_page(success_url);
    	return false;
    });
     
     
    function save_page(success_url){
    ...
    	$.ajax({
    		method: 'POST',
    		url: 'blbala.php',
    		data: {}
    		success: function(response) {
    			// C'est dans la réponse qu'on va décider ce qu'on fait !
    			if(response.success) {
    				// Si tout est OK, on redirige le navigateur vers l'URL finale
    				window.location.href = success_url;
    			}
    		}
    	});		// fin de $.ajax 
    }

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 59
    Points : 47
    Points
    47
    Par défaut
    Ton explication est claire et nette. Une action asynchrone ne peut être bloquante !

    Partant de là, je teste plusieurs solutions.
    Celle-ci par exemple paraît fonctionner :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    <button onClick='save_page($num)' >précédent</button>

    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
    function save_page(numpage){
    	var fd = new FormData();
    	fd.append('num',$("#num").val());
    ...
    	$.ajax({
    		url:'ajax_page_update.php',
    		type:'post',
    		data:fd,	
    		dataType:'json',
    		contentType: false,
    		processData: false,
    		success:function(response){
    			if(response != ""){
    				if(response.res==1){	...
    				}
                           window.location.href="autrepage.php?num="+numpage;
    		}		// fin de success
    	});		// fin de $.ajax 
    }
    Et c'est plus simple que tout ce que j'avais fait jusqu'ici.

    Merci bien, et bonne journée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/01/2013, 08h40
  2. Réponses: 2
    Dernier message: 10/04/2009, 12h27
  3. popup et chargement d'une nouvelle page autre parent
    Par belugha dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 30/11/2008, 14h59
  4. Detection du chargement d'une nouvelle page dans Firefox
    Par meric dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/09/2008, 16h02
  5. [AJAX] Conflit entre Ajax et Javascript
    Par cocaetjusdorange dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/05/2006, 18h16

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