2011-07-28 44 views
7

tôi có trang có trình xử lý sự kiện được đính kèm với sự kiện onclick. khi sự kiện kích hoạt nó chuyển nội dung của một hộp văn bản đến yêu cầu GET. kể từ url không nằm trong cùng một miền vì vậy tôi tạo ra một thẻ script và và đính kèm các url để nguồn của nó như thế nàycách hủy yêu cầu http bằng cách sử dụng javascript

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); 
} 

bây giờ nếu trường hợp bị sa thải và hơn một lần tôi muốn hủy bỏ tất cả yêu cầu GET trước đó (vì họ vẫn có thể nhận được phản hồi) và yêu cầu GET với văn bản mới nhất. Nhưng đối với điều này tôi cần phải hủy bỏ các yêu cầu trước đó. tôi đã cố gắng

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

nhưng điều này không làm việc trong Firefox (tôi đang sử dụng Firefox 5) mặc dù điều này làm việc trong Google Chrome .Does ai biết nếu những yêu cầu này có thể được hủy bỏ trong Firefox và nếu có thì như thế nào?


CẬP NHẬT Theo đề nghị của Alfred, tôi sử dụng window.stop để hủy bỏ một yêu cầu nhưng không hủy bỏ một yêu cầu nhưng treo nó lên. Nó có nghĩa là khi tôi nhìn vào con đom đóm thì có vẻ như yêu cầu đang được thực hiện nhưng không có phản hồi.

+0

Bạn có cân nhắc sử dụng thư viện như [jQuery] (http://jquery.com) không? –

+1

@Matt Ball tôi chắc chắn sẽ.nhưng u có thể cũng đề nghị đồng bằng javascript bcoz tôi muốn hiểu làm thế nào nó được thực hiện? – lovesh

+1

tôi đã làm một tìm kiếm trên stackoveflow.com và tìm thấy [câu trả lời sau đây] [1] [1]: http://stackoverflow.com/questions/117551/javascript-cancel-all-kinds-of -yquests/117628 # 117628 – Alfred

Trả lời

1

Tôi không chắc chắn nếu điều này là những gì bạn đang tìm kiếm, nhưng nó có vẻ như một vấn đề tương tự: http://www.velocityreviews.com/forums/t506018-how-to-cancel-http-request-from-javascript.html

+0

i m làm điều này tất cả các phía máy khách. không thể tìm thấy bất cứ điều gì hữu ích trong đó – lovesh

+0

Mặc dù tiêu đề của bài viết liên kết, nó thực sự là về việc postback đến một máy chủ ASP.NET để làm việc, và có liên quan mật thiết với các chi tiết cụ thể cho ASP.NET. – ToolmakerSteve

1

Nó sẽ là ok để bạn có thể sử dụng một khuôn khổ JS? Nếu vậy, MooTools có chức năng này được tích hợp vào đối tượng Request.JSONP

+0

tôi không nhớ bằng cách sử dụng một khuôn khổ nhưng tôi wud muốn biết làm thế nào nó được thực hiện. u có thể giải thích hoặc cung cấp cho một liên kết giải thích – lovesh

+0

u có thể giải thích làm thế nào nó được thực hiện? tôi thấy liên kết và tôi biết rằng điều này có thể được thực hiện trong javascript +1 – lovesh

+0

Nhìn qua mã nguồn cho nó, nó dường như chỉ xóa thẻ tập lệnh khỏi DOM và đặt biến tập lệnh thành rỗng. Có lẽ bước cuối cùng này là những gì bạn đang bỏ lỡ vì có lẽ yêu cầu không bị hủy bỏ miễn là có một tham chiếu đến nó. Tuy nhiên, không chắc chắn về điều này. –

2

Điều này hoàn toàn quay từ hông, nhưng nếu thẻ tập lệnh chưa tải xong, bạn có thể chỉ đơn giản là script.parentElement.removeChild(script). Đó là nhiều hơn hoặc ít hơn những gì mootools nào anyway. (Về mặt kỹ thuật, họ thay thế /\s+/ bằng ' ' trước tiên, nhưng điều đó dường như không quan trọng lắm).

+0

điều này có nghĩa là yêu cầu HTTP không bị hủy? – lovesh

+1

Nó phải tương đương với 'XMLHttpRequest.abort();' nhưng không bảo đảm, tôi chưa bao giờ thực sự làm điều đó trước đây. – cwallenpoole

4

Giải pháp rất đơn giản: để tạo yêu cầu HTTP, sử dụng <img> thay vì <script> phần tử. Ngoài ra, bạn luôn phải thay đổi thuộc tính src của cùng một thành phần.

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

Bạn có thể chắc chắn rằng nó thực sự hoạt động bằng cách làm như sau: URL mà bạn yêu cầu nên có một thời gian phản hồi rất lớn (bạn có thể đảm bảo điều này sử dụng ví dụ sleep chức năng của PHP). Sau đó, mở tab Net trong Firebug. Nếu bạn nhấp vào nút nhiều lần, bạn sẽ thấy rằng tất cả các yêu cầu chưa hoàn tất đều bị hủy.

+0

và làm cách nào để hủy yêu cầu? – lovesh

+0

@lovesh Các yêu cầu không đầy đủ sẽ tự động bị hủy nếu bạn tạo một yêu cầu khác. Nếu bạn muốn hủy yêu cầu và không tạo yêu cầu khác, bạn có thể thực hiện việc này bằng cách đặt 'img.src = '';'. – duri

0

Để khắc phục vấn đề cross-domain, bạn có thể sử dụng CORS thay vì (giả sử bạn có thể thay đổi những gì trên máy chủ): http://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors/

Nếu bạn làm điều này, sau đó bạn có thể sử dụng các tiêu chuẩn hơn Hàm hủy bỏ() của XMLHttpRequest.

CORS tương thích với tất cả các trình duyệt hiện đại chính trừ Opera (http://caniuse.com/cors).

Các vấn đề liên quan