2016-12-03 3 views
3

Also, ich habe in letzter Zeit Sachen versucht und bekam dieses Stück Code in meinem Skript:Warum erscheint eine Warnung, bevor sich der Hintergrund ändert?

document.body.bgColor = "red"; 
alert("hello"); 

Aber in Chrome, erscheint die Warnmeldung erste und erst, nachdem ich es schließen den Hintergrund meines Körpers tut Änderungen. In Firefox bekomme ich das erwartete Verhalten, wenn sich der Körperhintergrund zu rot ändert, gefolgt von dem Popup.

Ich weiß, wir sollten uns nicht auf Warnungen und ähnliche Browser-Steuerelemente verlassen, aber kann mir jemand sagen, ob dies passiert, weil das Verhalten nicht in den Standards ist oder wenn mein Verständnis der synchronen Ausführung des obigen Codes falsch ist?

Antwort

4

Der Rendering-Prozess hat eine Lebensdauer von seinem eigenen und blockiert nicht den JavaScript-Thread. Sie arbeiten beide unabhängig voneinander.

Die Lösung ist auf „Pause“ die Ausführung von JavaScript die Rendering-Threads aufholen zu lassen. Dies kann über ein einfaches setTimeout Set 0

document.body.style.backgroundColor = "red"; 

setTimeout(function() { 
    alert("hey"); 
}, 0) 

Hinweis erfolgen, dass bgColor ist seit 2003 mit den DOM Level 2 Spec veraltet. Die aktuelle Methode zum Festlegen der Hintergrundfarbe eines Elements ist .

+0

Danke. Das hat geholfen. Eine Sache, die mich nervt, wenn dies garantiert, dass das Rendering beendet wird, bevor 'alert()' in 'setTimeout()' ausgeführt wird? Ich meine, für komplizierteres CSS gibt es ein Ereignis wie "onStylesApplied" oder etwas, das in den Renderprozess eingreifen kann? –

+1

Sie können so viele Stile Operationen nennen, wie Sie vor dem 'setTimeout' Anruf mögen. – marvinhagemeister

0

Sie höchstwahrscheinlich können die Hintergrundfarbe erzwingen, bevor Dialog so die Warnung durch Nachgeben für kurze Zeit Aufspringen ändern vor dem Öffnen so dass der Browser neu zu zeichnen.

setTimeout(function() { alert("hello"); }, 1); 
0

Die einfachste Abhilfe wird wie:

document.body.bgColor = "red"; 
setTimeout(function() { 
     window.alert('Hello There!'); 
    }, 10); 

Der Timeout-Wert "9" ist das Minimum in meinem Fall, wenn ich < 9 verwenden, Alarm zuerst erscheint.

Verwandte Themen