2013-05-08 30 views
11

Tôi có một trang chạy nhiều mã javascript khác nhau, bao gồm gọi setTimeout(). Nếu người dùng nhấp vào một liên kết để điều hướng đến một trang khác, tại thời điểm nào thì javascript trên trang này ngừng chạy và do đó mã của tôi được gọi bởi setTimeout sẽ không còn được gọi? ví dụ.Khi nào javascript ngừng chạy trên một trang sau khi một liên kết được nhấp?

  • ngay sau khi liên kết được nhấp (Tôi biết điều này là sai)
  • khi trình duyệt bắt đầu nhận trang mới
  • một thời điểm nào khác?

Và điều này có khác với các trình duyệt chính khác nhau không?

nền

Tôi muốn biết điều này phần lớn vì sự quan tâm của hơn để giải quyết bất kỳ vấn đề cụ thể. Vấn đề khiến tôi suy nghĩ về điều này là tôi muốn làm điều gì đó khi người dùng nhấp vào một liên kết cụ thể trên một trang. Tôi muốn thực hiện một cuộc gọi ajax và xử lý kết quả, nhưng tôi không quá quan tâm nếu nó kết thúc trước khi trang được tải xuống. Vì vậy, tôi sẽ bắn một setTimeout() vào liên kết nhấp chuột và sau đó nếu tôi may mắn nó sẽ kết thúc nhưng nếu tôi không phải là nó sẽ không. Tôi tự hỏi trong hoàn cảnh nào nó sẽ hoạt động. Trong khi có thể có các giải pháp khác cho vấn đề đó, tôi không muốn giải pháp cho vấn đề tôi chỉ muốn biết câu trả lời cho câu hỏi đó.

+5

Có lẽ chỉ sau sự kiện [onunload] (https://developer.mozilla.org/en-US/docs/DOM/window.onunload), nhưng tại sao lại quan trọng với bạn? –

+0

_Which_ browser? –

+1

* Các bộ hẹn giờ hoạt động * (mà 'setTimeout' thêm vào) sẽ bị xóa trong [các bước dọn dẹp tài liệu dỡ bỏ'] (http://www.w3.org/TR/html5/browsers.html#unloading-document-cleanup -steps), được gọi từ (trong số những thứ khác) ['unload document procedure'] (http://www.w3.org/TR/html5/browsers.html#unload-a-document).Tuy nhiên, tôi không chắc chắn khi nào chính xác những điều này được gọi trong quá trình [điều hướng] (http://www.w3.org/TR/html5/browsers.html#navigating-across-documents) – Bergi

Trả lời

0

Một giải pháp có thể là dừng sự kiện nhấp, kích hoạt cuộc gọi không đồng bộ và tiếp tục sự kiện mặc định khi kết quả từ cuộc gọi ajax đã được xử lý. Hoặc, nếu có thể, bạn có thể xử lý việc xử lý trên máy chủ trong trường hợp đó bạn thậm chí sẽ không cần phải dừng sự kiện mặc định - chỉ cần kích hoạt cuộc gọi không đồng bộ của bạn.

Trong câu trả lời cho câu hỏi của bạn, tôi đồng ý với Jack rằng tập lệnh sẽ ngừng chạy sau sự kiện onunload.

Hy vọng con thỏ này.

3

Đây là chuỗi những gì sẽ xảy ra:

Bước 1: Bạn nhấp vào liên kết. Ở đây trình duyệt gửi yêu cầu tới máy chủ và chờ phản hồi. Đối tượng tài liệu của trang hiện tại vẫn tồn tại.

Bước 2: Trình duyệt nhận được phản hồi. Các đối tượng tài liệu của trang hiện tại vẫn tồn tại.

Bước 3: Trình duyệt phân tích cú pháp, tạo và hiển thị phản hồi cho đối tượng tài liệu mới.

Bước 3 là khi JS của trang hiện tại sẽ dừng, KHÔNG, bạn đã nhắm mục tiêu phản hồi tới iframe, chẳng hạn. Nếu bạn làm điều đó, thì đối tượng tài liệu mới sẽ được hiển thị bên trong khung nội tuyến và đối tượng tài liệu của trang hiện tại vẫn còn nguyên vẹn và JS sẽ vẫn hoạt động.

Hy vọng rằng sẽ trả lời câu hỏi của bạn!

+0

Cảm ơn! Bạn có bất kỳ tài liệu tham khảo để mô tả chi tiết hơn? – Rory

+0

Tôi nghĩ rằng DOM cũ đã được tải xuống ngay cả trước khi trình duyệt nhận được phản hồi? Điều gì làm cho bạn nghĩ rằng đây là trình tự, bạn có bất kỳ tài liệu tham khảo? – Bergi

+0

Có cách nào để phát hiện xem người dùng có đang đợi liên kết phản hồi không? Ví dụ: "Nếu người dùng không cố gắng rời đi, hãy làm công việc bận rộn hơn". –

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