2016-04-30 2 views
1

Eine lustige Sache ist mir passiert, während ich diese Woche einen alten JavaScript-Code aufgeräumt habe. Wenn ich langsamen Code herausholte, begann die Seite, Referenzfehler auf Code in einer Datei zu werfen, die über einen Ajax-Aufruf enthalten war.Referenz Fehler in der enthaltenen Datei ... wenn die Aufrufdatei keinen langsamen Code enthält

Unten ist (stark vereinfacht) Beispiel für das Problem. Die erste Datei funktioniert ohne Fehler, wenn sie direkt angefordert wird. Beim Aufruf über Ajax ist das document-ready-Ereignis bereits aufgetreten, der Code wird also sofort ausgeführt. Chrome wirft einen Fehler wie: „VM1414: 2 Uncaught Reference: they_log ist nicht definiert“

<html> 
<body> 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.js"></script> 
<script> 
    $(document).ready(function() { 
     they_log("Be alerted"); 
    }); 
</script> 
<!-- Two separate script tags prevent hoisting --> 
<script> 
function they_log($string) { 

    console.log($string); 
} 
</script> 
</body> 
</html> 

Wenn jedoch der Kommentar „alert“ Zeile unterhalb unkommentiert ist, werden die Referenz Fehler in Chrome oder Firefox nicht geworfen (obwohl sie immer noch in Safari auftreten - es sei denn, Sie lassen den modalen Dialog für einige Sekunden offen stehen.

<!doctype html> 
<html lang="en"> 
<head> 
    <title>Prototype of reference error issue</title> 
</head> 

<body> 
    <div id="place" /> 

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.2/jquery.js"></script> 

    <script> 
     $.get("http://localhost/path/to/first/file.html", function(data) { 
      $("#place").html(data); 
     }); 
     //alert("I get rid of the reference error"); 
    </script> 
</body> 
</html> 

Meine Frage ist, wie funktioniert die Alarmmeldung (oder ein ähnlicher langsam Code in der Datei einschließlich) die Referenzfehler verhindern auftreten?

Ich bin besonders interessiert, wenn alles, was geschieht, um den Code ohne Fehler ausführen zu lassen, konsistent (zumindest in Chrome und Firefox) ausgeführt werden kann oder wenn es so etwas wie eine Race Condition gibt intermittierend ausfallen.

Antwort

1

Was ich beobachten, ist Ihre alert vor Dokument ausgeführt, und es verhindert Dokument bereit, bis der Alarmdialog geschlossen wird. Fiddle: https://jsfiddle.net/24pg3yzk/

Während die Warnmeldung angezeigt wird, die Ajax-Request und ihre getan Handler $("#place").html(data);kann beendet haben. Also, ja, es ist der Rennzustand.

Ist es Standard oder konsistentes Verhalten? Ich weiß es nicht. Ich denke, es macht Sinn, da "Dialogfelder modale Fenster sind - sie verhindern, dass der Benutzer auf den Rest der Programmoberfläche zugreifen kann, bis das Dialogfeld geschlossen wird" (source), aber nichts, um es aus dem jQuery doc zu bestätigen.

+0

Danke für diese Geige. Basierend auf deiner Antwort habe ich ein paar Tests gemacht, und ja, es ist definitiv ein Rennen. Wenn Sie schnell genug auf "OK" klicken, wird der Fehler weiterhin in Chrome angezeigt (obwohl ich es in FF erhalten könnte). Und wenn Sie Safari genug Zeit geben (5-10 Sekunden), bevor Sie durch die Alarmbox klicken, können Sie den Fehler erhalten, nicht zu erscheinen. –

Verwandte Themen