我有一个页面,上面有一个事件处理程序附加到一个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
请求。但为此,我需要取消之前的请求。I tried
document.body.removeChild(script);
script.src=null;
但这在Firefox
(我使用Firefox 5
)中不起作用,尽管这在Google Chrome
中有效。有人知道这些请求是否可以在Firefox中取消,如果可以,那么如何取消?
正如Alfred所建议的,我使用window.stop
来取消请求,但不是取消请求,而是挂起请求。这意味着当我查看firebug时,它看起来像是正在发出请求,但没有响应。
解决方案很简单:对于创建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
函数)。然后,在Firebug中打开Net选项卡。如果多次单击该按钮,您将看到所有未完成的请求都被中止。
这完全是即兴的,但如果脚本标记还没有加载完成,您可以简单地使用script.parentElement.removeChild( script )
。这或多或少就是mootools所做的。(从技术上讲,他们首先用' '
替换/s+/
,但这似乎不是非常重要)。
使用JS框架可以吗?如果是这样,MooTools在其请求中内置了此功能。JSONP对象
我不确定这是否是你要找的,但它似乎是一个类似的问题:http://www.velocityreviews.com/forums/t506018-how-to-cancel-http-request-from-javascript.html
要绕过跨域问题,您可以使用CORS代替(假设您可以更改服务器上的内容):http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/
如果这样做,那么可以使用更标准的XMLHttpRequest的abort()函数。
CORS兼容所有主要的现代浏览器,除了Opera (http://caniuse.com/cors)。