У меня есть класс, который позволяет отправлять формы с вводом типа файла через AJAX. Он создает скрытый элемент IFRAME
, изменяет свойство form 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
ссылка на элемент кадра):
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);
-121--1360397- Существует ли API для определения того, выполняется ли данное задание в настоящее время или нет?
В идеале, я также хотел бы иметь возможность определить его предполагаемый% завершения и получить подробную информацию о номере редакции SVN и подтвердить комментарий!
EDIT:
Я нашел ответ. http ://host/job/project/lastBuild/api/
имеет почти все то, что мне нужно в нем где-то! Если вы запускаете ручную сборку, она не будет указывать вам наборы изменений SCM, но это имеет смысл. Тем не менее, это все еще говорит вам последнюю версию SCM, так что это хорошо. В общем, достаточно хорошо для моих целей прямо сейчас.