2010-03-29 29 views
31

Khi viết mã phía máy chủ, bạn cần phải dừng thực hiện rõ ràng sau khi gửi tiêu đề "Vị trí: ..." cho khách hàng hoặc mã của bạn sẽ tiếp tục chạy ở chế độ nền.Có thay đổi việc thực thi dừng window.location của javascript không?

Nhưng còn khi bạn thay đổi window.location trong tập lệnh phía máy khách thì sao? Điều này có ngay lập tức ngừng thực hiện kịch bản hiện tại hay là lập trình viên để đảm bảo rằng bất kỳ mã nào được đặt sau khi cuộc gọi này không đạt được?

+0

+1 cho câu hỏi thú vị –

+0

@DavidAndersson +1 khác của bạn ngụ ý là gì? – stolsvik

+0

@stolsvik hầu hết mọi thứ, kể cả nó hữu ích, cho thấy nỗ lực nghiên cứu và rõ ràng. Có lẽ nó cũng đáng đọc, vui, hấp dẫn, v.v ...? – Andrew

Trả lời

11

Đặt window.location không ngầm ngừng thực thi JS. Lấy ví dụ sau làm ví dụ:

function locationTest() { 
    window.location = 'http://www.google.com/'; 
    window.open('http://www.yahoo.com/'); 
} 

locationTest(); 

Hãy thử chạy từ Firebug/Web Inspector/v.v. và bạn sẽ nhận thấy rằng cửa sổ hiện tại sẽ tải Google, nhưng một cửa sổ mới cũng sẽ mở với Yahoo.

+0

Đây có thể là điều kiện chạy đua. Tôi có thể tưởng tượng rằng các tập lệnh cũ ngừng thực thi khi vị trí mới đã hoàn tất việc tải – codymanix

+0

Trên Safari có vẻ như nó ngừng thực thi sau khi window.location –

15

Điều này ngay lập tức dừng thực hiện các kịch bản hiện tại

Không, xử lý kịch bản còn lại sẽ thực hiện đến cùng trước khi kiểm soát lợi nhuận cho trình duyệt và các sự kiện bắt đầu xảy ra. Khi tải trang mới đủ xa để ‘điều hướng’ xuất hiện, các sự kiện beforeunloadunload sẽ kích hoạt, rồi trang và bất kỳ tập lệnh nào trong đó sẽ trở thành không hoạt động.

Tuy nhiên, mọi sự kiện và thời gian chờ được xếp hàng tiếp theo có thể không kích hoạt. Ví dụ: nếu bạn điều hướng trang trong trình xử lý biểu mẫu của một nút gửi biểu mẫu click và không hủy hành động mặc định, điều kiện đua có thể xảy ra trước sự kiện submit được xếp hàng đợi theo hành động mặc định của click.

+4

Cảm ơn. Như một hệ quả cho câu hỏi này, có cách nào để phát hiện khi bạn đang ở trong trạng thái này (tức là, 'window.location' đã thay đổi nhưng điều hướng chưa xảy ra)? – speedplane

+0

Cảm ơn, chỉ là câu trả lời tôi cần. Câu trả lời của bạn có dựa trên việc quan sát cách trình duyệt hoạt động hay hành vi này được xác định ở đâu đó không? –

+0

Câu trả lời dựa trên quan sát, nhưng một số công việc đã được thực hiện trong HTML5 về chuẩn hóa luồng kiểm soát trình duyệt — asee ví dụ: https://www.w3.org/TR/html5/webappapis.html#event-loops, https: // www.w3.org/TR/html5/browsers.html#navigate. Các tiêu chuẩn chúng tôi đã kết thúc với phần lớn là không thể đọc được, và vẫn để lại một loạt các công cụ không xác định, nhưng chúng tôi vẫn còn trong một tình huống tốt hơn so với một không phù hợp và bí ẩn mà chúng tôi đã có trước đây. – bobince

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