Gibt es eine Möglichkeit, eine Zeitlimitgrenze beim Laden einer langsamen externen Datei über JavaScript elegant zu erzwingen?

8

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%     
Brian Adkins 07.01.2010, 15:04
quelle

4 Antworten

2

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:

%Vor%

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.

    
JPot 07.01.2010, 15:22
quelle
2

Die einzige Möglichkeit, dies zu tun, ist, einen Proxy auf einem anderen (PHP-fähigen) Server zu erstellen, der die Daten für Sie holt, aber stoppt, wenn ein bestimmtes Zeitlimit erreicht wurde erreicht (und es kann nur ein leeres Ergebnis zurückgeben).

    
James 07.01.2010 15:36
quelle
0

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.

    
Matt Baker 07.01.2010 21:01
quelle
-1

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.

    
mck89 07.01.2010 15:19
quelle