Ich bin kürzlich auf einen ziemlich fiesen Fehler gestoßen, bei dem der Code eine <select>
dynamisch über JavaScript. Dieses dynamisch geladene <select>
einen vorgewählten Wert hatte. Im IE6 hatten wir bereits Code, um den ausgewählten Wert zu fixieren <option>
denn manchmal ist die <select>
's selectedIndex
Wert nicht mit dem gewählten Wert übereinstimmen würde <option>
's index
Attribut, wie unten dargestellt:
field.selectedIndex = element.index;
Dieser Code funktionierte jedoch nicht. Auch wenn das Feld selectedIndex
richtig eingestellt war, wurde der falsche Index ausgewählt. Wenn ich jedoch einen alert()
Anweisung zum richtigen Zeitpunkt die richtige Option ausgewählt werden würde. Da ich dachte, dass es sich um ein Zeitproblem handeln könnte, habe ich etwas Zufälliges ausprobiert, das ich bereits im Code gesehen hatte:
var wrapFn = (function() {
var myField = field;
var myElement = element;
return function() {
myField.selectedIndex = myElement.index;
}
})();
setTimeout(wrapFn, 0);
Und es hat funktioniert!
Ich habe eine Lösung für mein Problem gefunden, aber ich weiß nicht genau, warum sie mein Problem behebt. Hat jemand eine offizielle Erklärung? Welches Browserproblem vermeide ich, indem ich meine Funktion "später" aufrufe, indem ich setTimeout()
?
2 Stimmen
Die meisten Fragen beschreiben, warum es nützlich ist. Wenn Sie wissen wollen, warum das so ist, lesen Sie meine Antwort: stackoverflow.com/a/23747597/1090562
35 Stimmen
Philip Roberts erklärt dies in seinem Vortrag "What the heck is the event loop?" auf die bestmögliche Weise. youtube.com/watch?v=8aGhZQkoFbQ
4 Stimmen
Wenn Sie es eilig haben, hier beginnt der Teil des Videos, in dem er genau auf die Frage eingeht: youtu.be/8aGhZQkoFbQ?t=14m54s . Trotzdem ist das ganze Video auf jeden Fall sehenswert.
8 Stimmen
setTimeout(fn)
ist identisch mitsetTimeout(fn, 0)
Übrigens.0 Stimmen
Relevant für diese Frage ist die Methode queueMicrotask() , die später eingeführt wurde.