7

我有一个页面,在该页面上附加了一个事件处理程序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 中取消,如果可以,那么如何?


更新 正如 Alfred 所建议的,我曾经window.stop取消一个请求,但没有取消一个请求,而是挂断了它。这意味着当我查看萤火虫时,它看起来正在发出请求,但没有响应。

4

5 回答 5

4

解决方案很简单:对于创建 HTTP 请求,使用<img>而不是<script>element。此外,您始终必须更改同一元素的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函数来确保这一点)。然后,在 Firebug 中打开 Net 选项卡。如果您多次单击该按钮,您将看到所有未完成的请求都被中止。

于 2011-08-01T08:49:23.667 回答
2

这完全是从臀部拍摄,但如果脚本标签尚未完成加载,您可能可以简单地script.parentElement.removeChild( script ). 无论如何,这或多或少是 mootools 所做的。(从技术上讲,它们替换/\s+/' 'first,但这似乎并不是非常重要)。

于 2011-07-29T14:32:42.000 回答
1

我不确定这是否是您要查找的内容,但这似乎是一个类似的问题: http ://www.velocityreviews.com/forums/t506018-how-to-cancel-http-request-from-javascript .html

于 2011-07-28T21:02:24.033 回答
1

你可以使用JS框架吗?如果是这样,MooTools 会在其Request.JSONP对象中内置此功能

于 2011-07-28T21:05:16.523 回答
0

要解决跨域问题,您也许可以改用 CORS(假设您可以更改服务器上的内容): http ://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-科尔斯/

如果您这样做,则可以使用更标准的 XMLHttpRequest 的 abort() 函数。

CORS 与除 Opera (http://caniuse.com/cors) 之外的所有主要现代浏览器兼容。

于 2011-08-08T09:04:00.197 回答