2017-10-10 3 views
1

J'ai une forme comme:Arrêt discret précédent appel ajax

@using (Ajax.BeginForm("List", null, new AjaxOptions() { UpdateTargetId = "results" }, new { id = "myform" })) 
{ 
    <input id="search" type="text" value="" /> 
} 

Je déclare javascript envoyer soumettre lorsque l'utilisateur appuie sur une touche dans ma boîte de recherche:

<script type="text/javascript"> 
    $("#search").on("keyup", function() 
    { 
     $("#myform").submit(); 
    }); 
</script> 

Mais lorsque les utilisateurs recherchent rapidement, le navigateur lance une requête ajax multiple et attend la fin de chaque appel un par un. Comment arrêter l'appel ajax précédent avant d'en envoyer un autre sans supprimer ajax discret?

+0

si vous définissez vos critères d'évaluation .NET comme tâches async, vous peut-être n'aura pas ce problème. Également peut-être ne pas déclencher le soumettre jusqu'à ce que l'utilisateur a tapé au moins 3 caractères. Envisagez enfin d'utiliser un plugin autocomplete plutôt qu'un formulaire de soumission, ce qui pourrait fonctionner un peu plus bien. – ADyson

+0

Merci pour la recommandation, mais il est encore des tâches asynchrones, et je ne peux pas changer le champ en saisie semi-automatique. C'est une interface existante. – GGO

Répondre

0

Je suggère au lieu d'appeler directement $("#myform").submit(); Détaillez-le à une demande .ajax de $() & abort si avant de faire un autre

$("#search").on("keyup", function(){ 
    var xhr; 

    if (xhr){ 
      xhr.abort(); //stop previous ajax   
    } 

    xhr = $.ajax({ 
       type: "GET", 
       url: "@Url.Action(list)", 
       data : {formdata : $("#myform").serialize() }, 
      success: function(response){ 
        // do some stuffs with $("#results") 
      } 
     });     

}); 
+1

Je préférerais sans enlever l'appel ajax discret, mais si je n'ai aucune autre possibilité je l'utiliserai. – GGO