как отменить http-запрос с помощью JavaScript - PullRequest
7 голосов
/ 29 июля 2011

У меня есть страница, на которой есть обработчик события, присоединенный к событию onclick.когда событие инициируется, оно передает содержимое текстового поля в запрос GET.поскольку URL-адрес не находится в том же домене , поэтому я создаю тег сценария и присоединяю URL-адрес к его источнику, например:

elem.onclick=fire;

function fire()
{
var text=document.getElementById('text').value;
var script=document.createElement("script");
script.className="temp";
script.src="some url"+"?param="+text;
document.body.appendChild(script);
}

, если это событие запущено и более одногораз я хочу отменить все предыдущие GET запросы (потому что они все еще могут получать ответ) и сделать запрос GET с последним текстом.Но для этого мне нужно отменить предыдущие запросы.я попытался

document.body.removeChild(script);
script.src=null;

, но это не работает в Firefox (я использую Firefox 5), хотя это работает в Google Chrome. Кто-нибудь знает, могут ли эти запросы бытьОтменено в Firefox, и если да, то как?


ОБНОВЛЕНИЕ Как предложил Альфред, я использовал window.stop, чтобы отменить запрос, но не отменяет запрос, но вешает его.Это означает, что когда я смотрю в firebug, похоже, что запрос выполняется, но ответа нет.

Ответы [ 5 ]

4 голосов
/ 01 августа 2011

Решение простое: для создания HTTP-запросов используйте <img> вместо <script> элемента. Также вам всегда нужно изменить атрибут src того же элемента .

var img;
function fire()
{
    var text = document.getElementById('text').value;
    var im = img || (img = new Image());
    im.src = "url"+"?param="+text;
}

Вы можете убедиться, что он действительно работает, выполнив следующее: запрашиваемый URL-адрес должен иметь большое время отклика (вы можете убедиться в этом, например, с помощью функции PHP sleep). Затем откройте вкладку Net в Firebug. Если вы нажмете кнопку несколько раз, вы увидите, что все незавершенные запросы отменяются.

2 голосов
/ 29 июля 2011

Это полностью стрельба с бедра, но если тег сценария не закончил загрузку, вы, вероятно, можете просто script.parentElement.removeChild( script ).Это более или менее то, что mootools делает в любом случае.(Технически они сначала заменяют /\s+/ на ' ', но это не кажется очень важным).

1 голос
/ 29 июля 2011

Было бы хорошо для вас использовать JS Framework?Если это так, MooTools имеет эту функциональность, встроенную в Request.JSONP object

1 голос
/ 29 июля 2011

Я не уверен, что это то, что вы ищете, но похоже на похожую проблему: http://www.velocityreviews.com/forums/t506018-how-to-cancel-http-request-from-javascript.html

0 голосов
/ 08 августа 2011

Чтобы обойти междоменную проблему, вы могли бы вместо этого использовать CORS (при условии, что вы можете изменить то, что находится на сервере): http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/

Если вы сделаете это, вы можете затем использоватьболее стандартная функция XMLHttpRequest abort ().

CORS совместима со всеми основными современными браузерами, кроме Opera (http://caniuse.com/cors).

...