Heim Web-Frontend js-Tutorial Browser-angehaltene Animation während des Ajax-Synchronisierungsvorgangs (ausführliches Tutorial)

Browser-angehaltene Animation während des Ajax-Synchronisierungsvorgangs (ausführliches Tutorial)

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

Im Folgenden werde ich einen Artikel mit Ihnen teilen, um das Problem der Browser-Animation zu lösen, die durch eine js-Ajax-Synchronisierungsanforderung verursacht wird. Er hat einen guten Referenzwert und ich hoffe, dass er für alle hilfreich sein wird.

1. Die Ursache des Problems

Als ich heute eine Anfrage gestellt habe, bin ich auf eine solche Situation gestoßen, das heißt, es gibt eine Klicken Sie auf die Schaltfläche, um die aktuellen Punkte des Benutzers zu aktualisieren. Dies erfordert auf jeden Fall die Verwendung von drei, fünf und zwei folgt:

/**
  * 异步当前用户积分 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;
   }
  });
 }
Nach dem Login kopieren

Ich dachte, es wäre eine so einfache Funktion. Schreiben Sie sie einfach und es wird funktionieren. Als der Benutzer jedoch auf die Schaltfläche „Aktualisierungspunkte“ klickte, wurde die Kopie nicht geändert auf „Aktualisieren“, aber die Ajax-Anfrage wurde gesendet, also habe ich den Webseitencode überprüft und festgestellt, dass js tatsächlich die Kopie des an das HTML-Element gebundenen Onclick-Ereignisses entfernt und wieder auf das Original geändert hat, nachdem die Anfrage erfolgreich war. aber die Kopie auf der Seite hat sich damals nicht geändert. Ich weiß nicht, warum sich der HTML-Code geändert hat, aber die Seite hat sich nicht geändert.

2 Ursache des Problems

Die Wurzel des Problems: Ich habe damals nachgeforscht und schließlich festgestellt, dass es sich um ein „async:false“-Problem handelte, also habe ich es in „Es liegt kein Problem“ geändert Wenn es asynchron ist, warum führt eine synchrone Anforderung dann zu Codefehlern?

Ursache: Der Rendering-Thread (UI) des Browsers und der JS-Thread schließen sich gegenseitig aus. Wenn zeitaufwändige JS-Vorgänge ausgeführt werden, wird das Rendern der Seite blockiert. Es gibt kein Problem, wenn wir asynchrones Ajax ausführen, aber wenn es auf eine synchrone Anforderung eingestellt ist, werden andere Aktionen (der Code hinter der Ajax-Funktion und der Rendering-Thread) gestoppt. Selbst wenn meine DOM-Operationsanweisung im Satz steht, bevor die Anforderung initiiert wird, blockiert diese Synchronisierungsanforderung den UI-Thread „schnell“, ohne ihm Zeit zur Ausführung zu geben. Aus diesem Grund schlägt der Code fehl.

3. Lösen Sie das Problem

1. Ich habe setTimeout verwendet, um das Problem zu lösen, den Ajax-Code in sestTimeout eingefügt und den Browser neu starten lassen Ein zu bedienender Thread löst das Problem. Der Code lautet wie folgt:

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) 
 }
Nach dem Login kopieren

Der zweite Parameter von setTimeout ist auf 0 gesetzt und der Browser führt ihn nach einer festgelegten Mindestzeit aus

Das Problem ist hier gelöst, aber Sie können es versuchen. Wenn Sie beim Klicken auf die Schaltfläche ein GIF-Bild anzeigen müssen und das Bild sich weiter dreht, werden Sie dazu aufgefordert Sie werden feststellen, dass das Bild aktualisiert wird, das Bild jedoch nicht verschoben wird. Dies liegt daran, dass die Synchronisierungsanforderung während der Ausführung dennoch blockiert wird. Diese Blockierung ist so großartig, dass sich selbst das GIF-Bild nicht bewegt und wie ein statisches Bild aussieht. Die Schlussfolgerung liegt auf der Hand. setTimeout behandelt die Symptome, aber nicht die Grundursache. Dies entspricht einer „leichten“ Asynchronisierung. Dann wird der Thread immer noch blockiert Operationen vor dem Senden der Anfrage

2. Verwenden Sie Deferred zum Lösen

Das Obige habe ich für alle zusammengestellt, ich hoffe, es wird hilfreich sein an alle in der Zukunft.

Verwandte Artikel:

Wie implementiert man benutzerdefinierte Anweisungen in Vue?

So ändern Sie den Unterkomponentenstil über die übergeordnete Komponente in Vue

Bezieht sich auf domänenübergreifende JSONP-Probleme in Vue-Ressource

Wie implementiert man das asynchrone Laden von Komponenten in vue+webpack?

Verwenden Sie Nginx in vue.js, um domänenübergreifende Probleme zu lösen

So finden Sie die maximale gemeinsame Teilzeichenfolge in JavaScript

So implementieren Sie die automatische Recyclingverbindung für MySQL-Transaktionen in Node.js

Das obige ist der detaillierte Inhalt vonBrowser-angehaltene Animation während des Ajax-Synchronisierungsvorgangs (ausführliches Tutorial). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Wie kann man das Größensymbol durch CSS anpassen und es mit der Hintergrundfarbe einheitlich machen? Wie kann man das Größensymbol durch CSS anpassen und es mit der Hintergrundfarbe einheitlich machen? Apr 05, 2025 pm 02:30 PM

Die Methode zur Anpassung der Größe der Größe der Größe der Größe in CSS ist mit Hintergrundfarben einheitlich. In der täglichen Entwicklung begegnen wir häufig Situationen, in denen wir die Details der Benutzeroberfläche wie Anpassung anpassen müssen ...

Wie kann man Lückeneffekt auf das Karten- und Gutscheinlayout mit Gradientenhintergrund erzielen? Wie kann man Lückeneffekt auf das Karten- und Gutscheinlayout mit Gradientenhintergrund erzielen? Apr 05, 2025 am 07:48 AM

Erkennen Sie den Lückeneffekt des Karten -Gutschein -Layouts. Beim Entwerfen von Karten -Gutschein -Layout begegnen Sie häufig die Notwendigkeit, Lücken zu Karten -Gutscheinen hinzuzufügen, insbesondere wenn der Hintergrund Gradient ist ...

Wie zeige ich die lokal installierte 'Jingnan Mai Round Body' auf der Webseite richtig? Wie zeige ich die lokal installierte 'Jingnan Mai Round Body' auf der Webseite richtig? Apr 05, 2025 pm 10:33 PM

Mit lokal installierten Schriftdateien auf Webseiten kürzlich habe ich eine kostenlose Schriftart aus dem Internet heruntergeladen und sie erfolgreich in mein System installiert. Jetzt...

Warum wirkt sich negative Margen in einigen Fällen nicht wirksam? Wie löst ich dieses Problem? Warum wirkt sich negative Margen in einigen Fällen nicht wirksam? Wie löst ich dieses Problem? Apr 05, 2025 pm 10:18 PM

Warum werden negative Margen in einigen Fällen nicht wirksam? Während der Programmierung negative Margen in CSS (negativ ...

Der Text unter Flex -Layout wird weggelassen, aber der Behälter wird geöffnet? Wie löst ich es? Der Text unter Flex -Layout wird weggelassen, aber der Behälter wird geöffnet? Wie löst ich es? Apr 05, 2025 pm 11:00 PM

Das Problem der Containeröffnung aufgrund einer übermäßigen Auslassung von Text unter Flex -Layout und Lösungen werden verwendet ...

Wie erhalten Sie Echtzeit-Anwendungs- und Zuschauerdaten auf der Arbeit von 58.com? Wie erhalten Sie Echtzeit-Anwendungs- und Zuschauerdaten auf der Arbeit von 58.com? Apr 05, 2025 am 08:06 AM

Wie erhalte ich dynamische Daten von 58.com Arbeitsseite beim Kriechen? Wenn Sie eine Arbeitsseite von 58.com mit Crawler -Tools kriechen, können Sie auf diese begegnen ...

Warum wird ein bestimmtes Div -Element im Edge -Browser nicht angezeigt? Wie löst ich dieses Problem? Warum wird ein bestimmtes Div -Element im Edge -Browser nicht angezeigt? Wie löst ich dieses Problem? Apr 05, 2025 pm 08:21 PM

Wie löst ich das durch User Agent Style Sheets verursachte Anzeigeproblem? Bei Verwendung des Edge -Browsers kann ein Div -Element im Projekt nicht angezeigt werden. Nachdem ich nachgesehen hatte, habe ich gepostet ...

Wie verwendet ich CSS und Flexbox, um das reaktionsschnelle Layout von Bildern und Text in verschiedenen Bildschirmgrößen zu implementieren? Wie verwendet ich CSS und Flexbox, um das reaktionsschnelle Layout von Bildern und Text in verschiedenen Bildschirmgrößen zu implementieren? Apr 05, 2025 pm 06:06 PM

Implementieren von Responsive Layouts mit CSS, wenn wir Layoutänderungen unter verschiedenen Bildschirmgrößen im Webdesign, CSS ...

See all articles