Maison interface Web js tutoriel Animation suspendue du navigateur lors de l'opération de synchronisation ajax (tutoriel détaillé)

Animation suspendue du navigateur lors de l'opération de synchronisation ajax (tutoriel détaillé)

Jun 11, 2018 pm 02:56 PM
ajax js 假死 浏览器

Ci-dessous, je partagerai avec vous un article pour résoudre le problème de l'animation suspendue du navigateur causée par la demande de synchronisation js ajax. Il a une bonne valeur de référence et j'espère qu'il sera utile à tout le monde.

1. La cause du problème

Quand j'ai fait une demande aujourd'hui, j'ai rencontré une telle situation, c'est-à-dire qu'il y a un fonction dans le centre personnel de l'utilisateur. Cliquez sur le bouton. Vous pouvez actualiser les points actuels de l'utilisateur. Cela nécessite certainement l'utilisation de requêtes de synchronisation ajax. À cette époque, j'ai écrit et joué avec trois, cinq et deux. suit :

/**
  * 异步当前用户积分 by zgw 20161216
  * @return {[type]} [description]
 */
 function flushIntegralSum() {
     //点击按钮刷新前修改按钮的文案,已经去掉点击事情,防止多次点击
  $("#flushbutton").replaceWith(&#39;<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="flushbutton">正在刷新</a>&#39;);
  $.ajax({
   url:&#39;URL&#39;,
   type:&#39;post&#39;,
   async:false,
   // data:{},
   success:function(json){
    json = eval(&#39;(&#39;+json+&#39;)&#39;);
    if(json.url){window.location.href=json.url;return;}
    $("#flushbutton").replaceWith(&#39;<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="flushFreeSum();" id="flushbutton">刷新积分</a>&#39;);
    if(json.code!=1){
     alert(json.msg);
    }else{
     $("#free_sum").html(json.free_sum);
    }
    return;
   }
  });
 }
Copier après la connexion

Je pensais que c'était une fonction si simple. Écrivez-la simplement et tout ira bien. Cependant, un problème est survenu lors du fonctionnement lorsque l'utilisateur a cliqué sur le bouton des points d'actualisation, la copie n'a pas été effectuée. a été remplacé par "Rafraîchir", mais la requête ajax a été envoyée, j'ai donc vérifié le code de la page Web et constaté que le js avait en fait supprimé l'événement onclick qui liait la copie à l'élément HTML. Une fois la requête réussie, il est redevenu. l'original, mais la copie sur la page n'a pas changé. C'était étrange à l'époque je ne sais pas pourquoi la page a changé même si le code HTML a changé

2. . Comprenez la cause du problème

La racine du problème : j'ai enquêté à ce moment-là et j'ai finalement découvert qu'il s'agissait d'un problème "async:false". Il n'y a pas de problème si vous. passez à une requête asynchrone, alors pourquoi la requête synchrone provoque-t-elle une défaillance du code ?

Cause : Le fil de rendu (UI) du navigateur et le fil js s'excluent mutuellement lors de l'exécution d'opérations fastidieuses js, le rendu des pages sera bloqué. Il n'y a aucun problème lorsque nous exécutons un ajax asynchrone, mais lorsqu'il est défini sur une requête synchrone, les autres actions (le code derrière la fonction ajax et le thread de rendu) s'arrêteront. Même si mon instruction d'opération DOM est dans la phrase avant le lancement de la requête, cette demande de synchronisation bloquera "rapidement" le thread de l'interface utilisateur sans lui laisser le temps de s'exécuter. C'est pourquoi le code échoue.

3. Résoudre le problème

1 J'ai utilisé setTimeout pour résoudre le problème, mis le code ajax dans sestTimeout et laissé le navigateur redémarrer. Un thread à opérer, cela résout le problème. Le code est le suivant :

function flushIntegralSum() {
     //点击按钮刷新前修改按钮的文案,已经去掉点击事情,防止多次点击
  $("#flushbutton").replaceWith(&#39;<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" id="flushbutton">正在刷新</a>&#39;);
  setTimeout(function(){
   $.ajax({
    url:&#39;URL&#39;,
    type:&#39;post&#39;,
    async:false,
    // data:{},
    success:function(json){
     json = eval(&#39;(&#39;+json+&#39;)&#39;);
     if(json.url){window.location.href=json.url;return;}
     $("#flushbutton").replaceWith(&#39;<a style="color:#3fb0ff;font-size:14px;" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" onclick="flushFreeSum();" id="flushbutton">刷新积分</a>&#39;);
     if(json.code!=1){
      alert(json.msg);
     }else{
      $("#free_sum").html(json.free_sum);
     }
     return;
    }
   });
  },0) 
 }
Copier après la connexion

Le deuxième paramètre de setTimeout est mis à 0, et le navigateur attendra un minimum défini. time.Execute

Le problème est résolu ici, mais vous pouvez l'essayer. Si vous devez afficher une image gif lorsque vous cliquez sur le bouton et que l'image continue de tourner, elle le fera. vous demandera qu'il est en cours de mise à jour. Vous constaterez que même si l'image sera affichée, l'image ne bouge pas, car même si la demande de synchronisation est retardée, elle bloquera toujours le thread de l'interface utilisateur pendant son exécution. Ce blocage est tellement génial que même l’image GIF ne bouge pas et ressemble à une image statique. La conclusion est évidente. SetTimeout traite les symptômes mais pas la cause première. Cela équivaut à rendre la demande de synchronisation "légèrement" asynchrone. Elle entrera alors toujours dans un cauchemar de synchronisation et bloquera le thread. opérations avant d'envoyer la demande

2. Utilisez Différé pour résoudre

Ce qui précède est ce que j'ai compilé pour tout le monde, j'espère que cela sera utile à tout le monde à l'avenir.

Articles associés :

Comment implémenter des instructions personnalisées dans Vue ?

Comment modifier le style du sous-composant via le composant parent dans vue

Lié aux problèmes inter-domaines jsonp dans vue-resource

Comment implémenter le chargement asynchrone de composants dans vue+webpack ?

Utilisez Nginx dans vue.js pour résoudre les problèmes inter-domaines

Comment trouver la sous-chaîne commune maximale en JavaScript

Comment implémenter la connexion de recyclage automatique des transactions MySQL dans Node.js

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment personnaliser le symbole de redimensionnement via CSS et le rendre uniforme avec la couleur d'arrière-plan? Comment personnaliser le symbole de redimensionnement via CSS et le rendre uniforme avec la couleur d'arrière-plan? Apr 05, 2025 pm 02:30 PM

La méthode de personnalisation des symboles de redimension dans CSS est unifiée avec des couleurs d'arrière-plan. Dans le développement quotidien, nous rencontrons souvent des situations où nous devons personnaliser les détails de l'interface utilisateur, tels que l'ajustement ...

Comment afficher correctement le 'Jingnan Mai Round Body' installé localement sur la page Web? Comment afficher correctement le 'Jingnan Mai Round Body' installé localement sur la page Web? Apr 05, 2025 pm 10:33 PM

En utilisant récemment des fichiers de police installés localement dans les pages Web, j'ai téléchargé une police gratuite à partir d'Internet et je l'ai installée avec succès dans mon système. Maintenant...

Le texte sous la disposition Flex est omis mais le conteneur est ouvert? Comment le résoudre? Le texte sous la disposition Flex est omis mais le conteneur est ouvert? Comment le résoudre? Apr 05, 2025 pm 11:00 PM

Le problème de l'ouverture des conteneurs en raison d'une omission excessive du texte sous disposition flexible et de solutions est utilisé ...

Pourquoi un élément div spécifique dans le navigateur Edge ne s'affiche-t-il pas? Comment résoudre ce problème? Pourquoi un élément div spécifique dans le navigateur Edge ne s'affiche-t-il pas? Comment résoudre ce problème? Apr 05, 2025 pm 08:21 PM

Comment résoudre le problème d'affichage causé par les feuilles de style d'agent utilisateur? Lorsque vous utilisez le navigateur Edge, un élément DIV du projet ne peut pas être affiché. Après avoir vérifié, j'ai posté ...

Pourquoi les feuilles de style personnalisées peuvent-elles prendre effet sur les pages Web locales de Safari mais pas sur les pages Baidu? Pourquoi les feuilles de style personnalisées peuvent-elles prendre effet sur les pages Web locales de Safari mais pas sur les pages Baidu? Apr 05, 2025 pm 05:15 PM

Discussion sur l'utilisation de styles de style personnalisés dans Safari aujourd'hui, nous allons discuter d'une question sur l'application de feuilles de style personnalisées pour le navigateur Safari. Novice frontal ...

Pourquoi les marges négatives ne prennent-elles pas effet dans certains cas? Comment résoudre ce problème? Pourquoi les marges négatives ne prennent-elles pas effet dans certains cas? Comment résoudre ce problème? Apr 05, 2025 pm 10:18 PM

Pourquoi les marges négatives ne prennent-elles pas effet dans certains cas? Pendant la programmation, les marges négatives dans CSS (négatif ...

Comment utiliser CSS et Flexbox pour implémenter la disposition réactive des images et du texte à différentes tailles d'écran? Comment utiliser CSS et Flexbox pour implémenter la disposition réactive des images et du texte à différentes tailles d'écran? Apr 05, 2025 pm 06:06 PM

Implémentation de dispositions réactives à l'aide de CSS lorsque nous voulons implémenter des modifications de mise en page sous différentes tailles d'écran dans la conception Web, CSS ...

Comment utiliser des fichiers de police installés localement sur les pages Web? Comment utiliser des fichiers de police installés localement sur les pages Web? Apr 05, 2025 pm 10:57 PM

Comment utiliser des fichiers de police installés localement sur les pages Web avez-vous rencontré cette situation dans le développement de pages Web: vous avez installé une police sur votre ordinateur ...

See all articles