У меня есть класс, который позволяет отправлять формы с вводом файлового типа через AJAX.Он создает скрытый элемент IFRAME
, изменяет свойство формы target
так, чтобы он отправлялся в IFRAME
, отправлял форму, а затем изменял цель на прежнюю.Он также добавляет событие onLoad
к IFRAME
, чтобы я мог получить обратный вызов.Функция onLoad
также удаляет IFRAME
со страницы перед запуском моей функции обратного вызова.
Класс работает отлично, я получаю обратный вызов, как и ожидалось.В сетевой панели Firebug я вижу запрос, вижу ответ, все хорошо.Но, как только начинается отправка, вкладка браузера для страницы меняется на «Соединение» с загрузчиком и никогда не изменяется обратно.Похоже, что вкладка загружается, это будет продолжаться в течение дней , если я оставлю браузер открытым.
Тогда возникает вопрос: Можно ли как-нибудь остановить это вручную или есть какой-то другой способ, которым я могу предотвратить его запуск?
Вот заголовки ответа, взятые из панели Net:
Date Fri, 02 Sep 2011 15:23:15 GMT
Server Apache/2.2.10 (Win32) PHP/5.3.1
X-Powered-By PHP/5.3.1
Expires Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma no-cache
Set-Cookie PHPSESSID=agncdnha86mtci7dmuvriobak2; path=/
Content-Length 165
Keep-Alive timeout=5, max=100
Connection Keep-Alive
Content-Type text/html
И снимок панели Net ниже.POST от представления формы, GET вызван функцией обратного вызова, он изменяет источник изображения на странице.
Это не является определеннымна этой странице это происходит везде, где я использую эту технику для отправки файла / изображения через IFRAME
.Это влияет на мою текущую версию Firefox (6.0), но также влияет на предыдущие версии (5.x, 4.x, 3.x).Тот факт, что IFRAME
удаляется со страницы после его загрузки, делает это особенно затруднительным - даже если запрос никогда не завершается, удаление элемента должно эффективно уничтожить / остановить и «соединиться», что, по мнению обозревателя, происходит.
ОБНОВЛЕНИЕ В ответе @Sidnicious я добавил тайм-аут в функцию обратного вызова, чтобы ввести задержку при удалении элемента IFRAME
.Я экспериментировал с длительностью задержки, даже 1 мс задержка является адекватной.Это, безусловно, можно рассматривать как обходной путь, но я все же хотел бы знать, может ли кто-нибудь пролить свет на , почему он , предпочтительно, чтобы избежать одновременного использования тайм-аута.Я включил модифицированный код (с тайм-аутом) ниже, на случай, если это будет полезно.Это событие onLoad
для IFRAME
(io
us ссылка на элемент frame):
var obj={};
var success = true;
try{
obj.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
obj.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
}
catch(e){ success = false; }
if( success ){
this.fireEvent('onSuccess', obj.responseText );
}else{
this.fireEvent('onFailure', obj );
}
this.fireEvent('onComplete', obj );
io.removeEvent('load', uploadCallback );
setTimeout(function () { // <--- this timeout prevents the issue
io.dispose();
}, 1);