Ich habe eine Klasse, die es ermöglicht, Formulare mit einer Dateieingabe über AJAX zu senden. Es erstellt ein verstecktes IFRAME
-Element, ändert die Eigenschaft target
der Form, so dass es an die IFRAME
übergeben wird, übergibt das Formular und ändert dann das Ziel zurück in das, was es war. Es fügt auch ein onLoad
-Ereignis zum IFRAME
hinzu, damit ich einen Rückruf bekommen kann. Die Funktion onLoad
entfernt auch% code_% von der Seite, bevor sie meine Callback-Funktion auslöst.
Die Klasse funktioniert einwandfrei, ich bekomme den Rückruf wie erwartet. Im Firebug's Net Panel sehe ich die Anfrage, ich sehe die Antwort, alles ist gut. Sobald die Übertragung gestartet wird, ändert sich der Browser-Tab für die Seite in "Verbinden" mit dem Lade-Spinner und ändert sich nie wieder. Es scheint, dass die Registerkarte geladen wird, dies wird für Tage fortgesetzt, wenn ich den Browser offen lasse.
Die Frage ist also: Gibt es eine Möglichkeit, das manuell zu stoppen oder gibt es eine andere Möglichkeit, das Starten zu verhindern?
Hier sind die Antwort-Header wie aus dem Net-Panel:
%Vor%Und eine Aufnahme des Net-Panels unten. Der POST kommt von der Einreichung des Formulars, das GET wird durch die Callback-Funktion verursacht, es ändert die Quelle eines Bildes auf der Seite.
Dies ist nicht spezifisch für diese Seite, es passiert überall, wo ich diese Technik verwende, um eine Datei / ein Bild über ein IFRAME
zu senden. Dies betrifft meine aktuelle Version von Firefox (6.0), betrifft aber auch ältere Versionen (5.x, 4.x, 3.x). Die Tatsache, dass das IFRAME
nach dem Laden von der Seite entfernt wird, macht dies besonders verwirrend - selbst wenn die Anfrage nie beendet wird, sollte das Entfernen des Elements effektiv den Abbruch / das Anhalten und das "Verbinden" des Browsers bewirken.
UPDATE
Nach der Antwort von @Sidnicious fügte ich der Callback-Funktion ein Timeout hinzu, um eine Verzögerung beim Entfernen des IFRAME
-Elements einzuführen. Ich habe mit der Länge der Verzögerung experimentiert, sogar eine 1ms Verzögerung ist ausreichend. Dies ist sicherlich ein Workaround, aber ich würde immer noch gerne wissen, ob jemand das warum davon beleuchten kann, was vorzugsweise dazu führt, dass vermieden wird, die Zeitüberschreitung gemeinsam zu nutzen. Ich habe den modifizierten Code (mit der Zeitüberschreitung) unten eingefügt, falls es hilfreich ist. Dies ist das IFRAME
-Ereignis für onLoad
( IFRAME
us ein Verweis auf das Rahmenelement):
Update: Der Firefox-Bug ist jetzt als "fixed" markiert und wird es in ein Update für die nahe Zukunft bringen.
Ich bin auch darauf gestoßen und würde lieben sehen, dass die Ursache behoben ist.
Ich habe mit ein paar Firefox-Entwicklern (mbrueck und gavin) gesprochen und sie denken, dass es ein Bug ist! Das gleiche Problem wurde 2005 für Firefox 1.9 gemeldet und behoben. Dann wurde der Bug 489259 im Jahr 2009 geöffnet. Mbrobeck hat ihn gnädigerweise aus dem "unbestätigten" Stapel entfernt.
Safari verhält sich besser als Firefox, aber eine Fehlermeldung ("Ein Fehler beim Öffnen der Seite ...") wird in der Statusleiste angezeigt, wenn Sie den Iframe während des load
-Ereignisses entfernen. Ich habe zwei ähnliche WebKit-Bugs gefunden, die seit 2007 geöffnet sind: 15485 und 13281 .
Dies scheint zu geschehen, wenn Sie eine iframe
aus dem Dokument während des load
-Ereignisses entfernen. JavaScript-Ereignisse feuern synchron - also in Serie mit der eigenen Handhabung der Webseite durch den Browser. Daher ist es möglich, zu verhindern, dass ein Formular gesendet wird, oder zu verhindern, dass ein Tastendruck oder ein Mausklick in einem Event-Handler registriert wird.
Das letzte Mal, dass dieser Fehler in Firefox behoben wurde, war der Grund, dass das Entfernen eines iframe
von der Seite es vergessen macht, welche Seite es besaß, aber die iframe
benachrichtigt die Seite, die fertig geladen wurde nach das load
-Ereignis.
Alles, was Sie mit setTimeout
einplanen, passiert nach dem aktuellen Zyklus der Ereignisschleife - nachdem der Browser beendet hat, was er tut gerade jetzt . Wenn Sie also setTimeout verwenden, um iframe
zu entfernen, selbst wenn das Zeitlimit auf Null gesetzt ist, wird es beendet:
Sie finden diese Technik im Plugin jQuery .
Das Ereignis onload
in Ihrem IFRAME wird nicht vollständig ausgeführt, da es durch das Entfernen Ihres IFRAME unterbrochen wird.
Firefox hat einen Fehler, bei dem es nach dem Unterbrechen des onload
-Ereignisses seinen internen Code nicht aufruft.
Durch das Setzen des Timeouts führt Firefox sauber den onload
aus, nach dem Ihr Timeout-Callback ausgeführt und IFRAME entfernt wird. Laut der Dokumentation kann das Zeitlimit auch später ausgelöst werden, wenn die Seite (oder das Betriebssystem / Browser selbst)) beschäftigt sich mit anderen Aufgaben (zB Entfernen der IFRAME).
Tags und Links javascript mootools ajax iframe firefox