2009-11-25 31 views
6

Tôi đang triển khai Comet bằng cách sử dụng kỹ thuật bỏ phiếu dài thẻ script, dựa trên this page.JavaScript có thể phát hiện khi người dùng ngừng tải tài liệu không?

Một vấn đề (mà tôi không nghĩ là có giải pháp) là "sự lộn xộn doom" - trình duyệt tiếp tục hiển thị tài liệu là "tải" mãi mãi và để nút Dừng trên thanh công cụ được bật. Điều này có ý nghĩa, bởi vì tài liệu vẫn đang tải và trong khi nó không lý tưởng, tôi nghĩ rằng tôi có thể sống với nó.

Vấn đề thứ hai, mặc dù, nếu người dùng thực sự nhấp vào Dừng thì trình duyệt ngừng tải thẻ tập lệnh của tôi và tôi phải dựa vào thời gian chờ để khởi động lại Comet. Điều này có nghĩa là nếu thời gian chờ của tôi là 20 giây, trang có thể không được cập nhật trong tối đa 20 giây sau khi người dùng nhấp vào Dừng. Câu hỏi của tôi là: có cách nào để phát hiện khi họ làm điều này không? Tôi có thể phát hiện khi họ nhấn thoát bằng cách sử dụng sự kiện onkeydown, nhưng không phải khi họ sử dụng nút thanh công cụ hoặc mục menu để dừng tải.

Giải pháp cần phải hoạt động trong Firefox 3.5 và Chrome 3.0.

+0

Tôi rất tò mò nếu bạn vẫn nhận được "sự lộn xộn của doom" nếu bạn thêm tập lệnh được đề cập đến DOM sau khi DOM được tải (hoặc trường hợp xấu nhất, tải trọng). – eyelidlessness

+0

Tôi có thể hỏi một câu hỏi đơn giản không? bạn muốn làm gì khi bạn phát hiện? – YOU

+0

S.Mark - Tôi muốn gửi lại yêu cầu, giống như thời gian chờ xảy ra. mí mắt - bạn nói đúng, nếu tôi làm điều đó trong quá trình tải, không có sự lộn xộn của doom! Kết hợp với thủ thuật onkeydown để phát hiện Escape Tôi nghĩ rằng điều này giải quyết được vấn đề. Đặt nó trong một câu trả lời để tôi có thể cung cấp cho bạn một số đại diện. :) – EMP

Trả lời

5

Như tôi đã đề xuất trong nhận xét ... hãy thêm tập lệnh vào sự kiện onload.

Chỉnh sửa: Tôi đoán tôi có thể giải thích lý do của tôi cho đề xuất, hy vọng nó sẽ giúp những người khác cố gắng lưu cùng một vấn đề.

Trình duyệt sẽ tiếp tục "tải" (và do đó chơi máy rung) cho đến khi nó kích hoạt sự kiện onload cho mỗi "cửa sổ" (mỗi cây DOM có bố cục toàn cầu window) trong cửa sổ hoặc tab đã cho. Nhiều tài nguyên bên ngoài có thể tải xuống song song, nhưng theo mặc định — và trên thực tế, không có thoát mặc định này trong bất kỳ trình duyệt nào ngoại trừ IE (sử dụng thuộc tính defer trên thẻ <script>) - <script> tài nguyên sẽ "chặn" thêm xử lý tài liệu. Nếu yêu cầu tài nguyên <script> không bao giờ hoàn thành, sự kiện onload của trang sẽ không bao giờ xảy ra (và có các hiệu ứng phụ khác, nếu có nội dung sau <script> trong DOM: DOM có thể không bao giờ được tải đầy đủ và tài nguyên sau đó <script> có thể không bao giờ tải ở tất cả), và do đó không bao giờ kết thúc "tải". Thực hiện từ đó, bạn cũng có thể cải thiện hiệu suất bằng cách thêm <script> ban đầu khi DOM được tải, với thuộc tính defer cho IE và cắt kết nối cho các trình duyệt khác khi bạn mong đợi sự kiện onload sẽ lửa (đây là khó để xác định chính xác và có thể yêu cầu thử nghiệm).

Để giữ cho câu trả lời này được cập nhật ... thuộc tính deferavailable trong hầu hết các trình duyệt hiện đại bây giờ.

+0

Kết hợp với phát hiện phím Escape bằng sự kiện onkeydown, điều này giải quyết được vấn đề của tôi. Cảm ơn! – EMP

+0

Tôi * sẽ * tránh dựa vào phím thoát, vì bạn vẫn thiếu một sự kiện 'stop' rõ ràng. – eyelidlessness

+0

Xin lỗi, ý bạn là gì bởi sự kiện 'stop' rõ ràng? Có cách nào khác mà người dùng có thể ngừng tải ngoài phím Escape, mục menu Dừng và nút Dừng thanh công cụ không? Hai cái sau bị vô hiệu hóa với đề xuất của bạn. – EMP

0

Dường như sự kiện DOMContentLoaded thực hiện thủ thuật trong Firefox 3.5 - lần đầu tiên người dùng ngừng tải trang. Sau đó nút Dừng bị tắt. Người dùng vẫn có thể nhấn Escape để ngừng tải lần nữa, nhưng tôi có thể phát hiện ra rằng sử dụng onkeydown.

Tuy nhiên, tính năng này không hoạt động trong Chrome - nó kích hoạt DOMContentLoaded ngay khi trang tải, mà không cần chờ thẻ được tạo động của tôi <script>.

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