Ich benutze Javascript, um Inhalte einzuschließen, die aus einer PHP-Datei auf einem anderen Server stammen. Dieser andere Dienst kann jedoch manchmal flockig werden und entweder lange dauern oder überhaupt nicht geladen werden.
Gibt es einen Weg in JS zu versuchen, die externen Daten für x Sekunden zu erhalten, bevor sie fehlschlagen und eine "Bitte versuchen Sie es erneut" -Nachricht anzuzeigen?
%Vor% Paarprobleme: Sie können Timeout-Schwellenwerte mit XMLHttpRequest
(aka Ajax) verwenden, aber da es sich um otherserver.com
handelt, können Sie XMLHttpRequest
nicht verwenden (und alle A-Grade-Browser unterstützen), da Gleiche Ursprungs-Richtlinienbeschränkung .
Wenn das Skript irgendeine Art von globalem Namen einführt (zB irgendein Variablenname, Funktionsname, etc.) Sie können setTimeout
versuchen, weiter nach dem Namen zu suchen:
Das Problem, wie ich es sehe, ist, dass Sie die Anfrage für das Skript nicht abbrechen können. Bitte korrigieren Sie mich, wenn ich falsch liege, aber wenn Sie <script>
aus dem DOM entfernen, bleibt die Anforderung des Browsers für die Ressource aktiv. Obwohl Sie erkennen können, dass das Laden des Skripts länger als x Sekunden dauert, können Sie die Anforderung nicht abbrechen .
Ich denke, Sie haben vielleicht kein Glück.
Das ist rein, rein theoretisch:
<script>
-Tags können dynamisch in das DOM eingefügt werden, und an diesem Punkt wird das Skript abgerufen und verarbeitet. Diese dynamische Skript-Tag-Injection ist, wie einige domainübergreifende "AJAX" erreichen.
Ich könnte mir vorstellen, dass Sie eine globale Variable var hasLoaded = false;
deklarieren könnten. Am Ende des Skripts, das Sie versuchen zu laden, könnten Sie diese Variable auf wahr hadLoaded=true;
setzen. Nachdem Sie das Skript-Tag in das DOM eingefügt haben, können Sie ein setTimeout () starten, dessen Callback-Funktion prüft, ob "hasLoaded" auf "true" gesetzt ist. Wenn dies nicht der Fall ist, können Sie davon ausgehen, dass das Skript noch nicht vollständig in den Browser geladen wurde. Wenn dies der Fall ist, können Sie davon ausgehen, dass es vollständig geladen wurde.
Noch einmal, das ist theoretisch, aber wenn Sie es testen, seien Sie sicher, sich zu melden, ich bin sehr neugierig.
Ich denke, dass der einzige Weg dazu ist, den Inhalt der Datei über Ajax zu nehmen und dann einen Timer zu setzen. Wenn die Anfrage vor dem Timer endet, können Sie die Antwort mit eval auswerten (das ist sowieso nicht die bessere Lösung), andernfalls können Sie die Ajax-Anfrage stoppen und die Fehlermeldung schreiben.
Tags und Links javascript html ajax timeout external