2011-07-28 118 views
7

我有一个页面,其中有一个事件处理程序附加到onclick事件。当事件触发时,它将文本框的内容传递给GET请求。因为的网址不在同一个域中,所以我创建一个脚本标记,以及URL连接到它的来源是这样如何使用javascript取消http请求

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 .Does任何人知道,如果这些要求可以在Firefox中被取消,如果是的话怎么办?


UPDATE 如所建议的由Alfred,我用​​取消请求,但不取消请求,但挂起来。这意味着当我查看萤火虫时,它看起来像正在提出请求,但没有任何回应。

+0

你会考虑使用像[jQuery](http://jquery.com)这样的库吗? –

+1

@Matt球我当然会。但你也可以建议纯javascript的bcoz我想了解它是如何完成的? – lovesh

+1

我做了stackoveflow.com搜索,发现[以下答案] [1] [1]:http://stackoverflow.com/questions/117551/javascript-cancel-all-kinds-of - 请求/ 117628#117628 – Alfred

回答

1

难道是确定你使用JS框架?如果是这样的话,MooTools在它的Request.JSONP对象中内置了这个功能

+0

我不介意使用框架,但我想知道它是如何完成的。你可以解释或给出解释 – lovesh

+0

的链接,你能解释它是如何完成的吗?我看到了链接,并且我知道这可以通过javascript +1 – lovesh

+0

查看它的源代码,它似乎只是从DOM中删除脚本标记并将脚本变量设置为null。也许最后一步就是你想要的,因为只要有引用它,请求就不会被取消。但是不确定。 –

2

这完全是从臀部拍摄的,但是如果脚本标记没有完成加载,您可能简单地使用script.parentElement.removeChild(script)。无论如何,这或多或少是mootools所做的。 (从技术上讲,他们首先用' '代替/\s+/,但这似乎并不重要)。

+0

这意味着HTTP请求未被取消? – lovesh

+1

它应该等同于XMLHttpRequest.abort();但不能保证,我从来没有真正做过。 – cwallenpoole

4

解决方案很简单:用于创建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标签。如果多次点击该按钮,您会看到所有不完整的请求都会中止。

+0

以及我如何取消请求? – lovesh

+0

@lovesh如果您创建另一个请求,则不完整请求会自动取消。如果你想取消请求而不创建另一个请求,你可以通过设置'img.src ='';'来完成。 – duri