2010-05-13 5 views
1

J'ai une fonction jQuery ajax qui récupère les données JSON. Dans le bloc de succès, j'appelle une autre fonction pour analyser les données et mettre à jour la page. A la fin de cette fonction d'analyse/mise à jour, un appel ajax différent est effectué. Cela fonctionne parfaitement dans tous les navigateurs sauf Internet Explorer (7 et 8). Le problème est que Internet Explorer pense que le script prend trop de temps à traiter car le bloc de succès du premier appel ajax ne se termine pas avant la fin du 2ème appel ajax.jQuery ajax enchaîne les problèmes d'Internet Explorer

Je reçois le message suivant: "Arrêtez l'exécution de ce script: un script sur cette page ralentit l'exécution de votre navigateur Web, s'il continue à s'exécuter, votre ordinateur risque de ne plus répondre."

Mon code jQuery:

$("#id_select").bind("change", function(e){ 
    $.ajax({ 
    url: "/retrieve_data.js", 
    data: {id:$(e.target).children(":selected").attr("value")}, 
    type: "get", 
    dataType:"json", 
    success: function(data, status, form){    
     processData(data); 
    }, 
    error: function(response, status){ 
     alert(response.responseText); 
    } 
    }); 
}) 

Toutes les suggestions sur la façon d'obtenir IE pour arrêter le délai ou pour accomplir cette tâche sans réécrire toutes mes fonctions jQuery seraient appréciés.

+1

Ceci est un tir dans le noir, mais peut-être placer votre appel à 'processData (données)' à l'intérieur d'un 'setTimeout()' (avec une durée minimale) afin que la fonction 'succès' retournera immédiatement? Je n'ai pas essayé, mais qui sait. – user113716

+0

Cela peut être utile si vous pouvez publier le code pour processData car cela pourrait être la cause du problème. –

Répondre

0

Ma solution a fini par être refactoring le tout. Je pense que cela fonctionne mieux, au lieu de faire une requête Ajax, l'analyse de ces résultats, la mise à jour de la page, puis une autre requête Ajax dans le bloc de succès que j'ai fini par renvoyer tout le JSON nécessaire pour mettre à jour chaque page. Ainsi, chaque requête renverra plus de données et transmettra ensuite ces données à d'autres fonctions qui mettent à jour la page. Cela rend les choses plus rapides car il y a moins de demandes et IE ne vomit pas partout.

Lors de mon refactoring, j'ai rencontré un problème où l'appel à $ ("# selector"). Empty() était nécessaire avant de mettre à jour le code HTML.

Avant:
var my_new_html = ...;
$("#selector").html(my_new_html);

Après:
var my_new_html = ...;
$("#selector").empty().html(my_new_html);

Vidage le contenu avant de la mise à jour IE ne provoqué plus revenir avec l'erreur de répondre d'arrêt.

Espérons que cela aide certaines personnes.

0

En fait, j'ai écrit quelque chose qui peut prendre soin de cela pour vous si vous pouvez casser votre code un peu. Vous aurez réellement besoin de quelques petites choses. La première est cette extension de jQuery qui crée des files d'attente de travail: http://code.ghostdev.com/posts/javascript-threading-revisted-jquery. Une fois que vous l'avez mis en place et testé un peu, il peut être étendu davantage pour créer une file d'attente AJAX: http://code.ghostdev.com/posts/javascript-threading-ajax-queueing.

Pour ma situation personnelle, j'avais une requête AJAX qui récupérait un bloc JSON assez lourd et je ne pouvais pas tout traiter quand il revenait sans produire des avertissements de script qui ne répondaient pas. Cela permet à la fonction de retourner, mais continue à traiter sur des intervalles réguliers et configurables jusqu'à ce qu'elle soit traitée dans tout le bloc.

Questions connexes