2009-07-31 21 views
8

Tôi có bộ định thời javascript đang tạo yêu cầu XMLHTTP trên cơ sở không đổi (cứ 10 giây một lần). Tôi rất muốn có thể tạm dừng bộ hẹn giờ khi cửa sổ hoặc tab mất tiêu điểm.Có cách nào đáng tin cậy để xác định xem tab hoặc cửa sổ trình duyệt không hoạt động hay không tập trung?

Tôi hoàn toàn nhận thức được sự kiện onFocusonBlur trên đối tượng window, nhưng chúng không đáng tin cậy trên tất cả các trình duyệt. Ví dụ: in Safari, tabs don't trigger the events.

mã đơn giản dưới đây distills các chức năng Tôi đang tìm:

<html> 
    <head> 
    <title>Testing</title> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js"></script> 
    </head> 
    <body> 
    <div id="console"></div> 
    <script type="text/javascript"> 
     window.onfocus = function(event) { 
     $('console').insert('Window gained focus<br />'); 
     } 

     window.onblur = function(event) { 
     $('console').insert('Window lost focus<br />'); 
     } 
    </script> 
    </body> 
</html> 

Có ai ra khỏi đó có một kỹ thuật để xác định khi một cửa sổ trình duyệt hoặc tab mất/lợi nhuận tập trung mà làm việc trên trên tất cả các trình duyệt phổ biến?

+0

theo kinh nghiệm của tôi, điều này không thể giải quyết được bằng flash. http://stackoverflow.com/questions/1099063/detecting-embedded-object-focus-in-safari – jedierikb

+0

bản sao có thể có của [Có cách nào để phát hiện xem cửa sổ trình duyệt hiện không hoạt động không?] (http: // stackoverflow .com/questions/1060008/is-there-a-way-to-detect-if-a-browser-window-hiện không hoạt động) – rvighne

Trả lời

3

Mã trên đang hoạt động tốt trong Safari v3.0.4 (WebKit 530+), lỗi đã được giải quyết. Tôi đã kiểm tra nó trong Google Chrome v3.0.195.27 và nó có lỗi Safari giống nhau, mặc dù nó có một phiên bản mới hơn của WebKit.

+0

Bạn đúng rằng các phiên bản Safari gần đây thực hiện việc này và Chrome thì không. Tôi sẽ chỉ nói rằng với mục đích của tôi, sự hỗ trợ của 3 trong top 4 không phải là xấu. –

+0

Chrome v3.0.195.38 hoạt động không bình thường. Nó kích hoạt các sự kiện trên chuyển đổi tab nhưng chỉ khi có ít nhất một công tắc cửa sổ xảy ra. – detj

0

Những nỗ lực tuyệt vọng trước đây của tôi để tìm một thứ như vậy đã khiến tôi kết luận rằng không có con vật nào như vậy.

Ồ, tôi rất muốn sai.

2

Có một câu hỏi về Stack Overflow khác liên quan đến chủ đề này. Họ đã không giải quyết vấn đề duyệt tab ở đó. Họ cung cấp cho một liên kết mà đi vào một số chi tiết, mặc dù không sử dụng jquery.

Is there a way to detect if a browser window is not currently active?

Tôi không nghĩ rằng các sự kiện tập trung/mờ làm việc với các duyệt theo tab trong Safari ở tất cả. Một số người đã đề xuất các sự kiện chuột, như mouseleave/mouseenter cho việc này.

Tôi có một số vấn đề về giao diện người dùng như thế này, vì vậy nếu tôi khám phá bất kỳ điều gì tôi sẽ theo dõi tại đây.

-1

Một điều cần xem xét là các tab focus/blur các sự kiện bị chặn bởi nhà cung cấp trình duyệt có thể là cách để bảo vệ người dùng. Một số trình duyệt cho phép các cửa sổ bật lên kiểu alert() kiểu (và thậm chí, tôi tin rằng, phương pháp focus()) để khiến tab lấy lại tiêu điểm. Chặn các sự kiện focus/blur để chuyển đổi tab có thể giống như bảo vệ chống lại, ví dụ: cửa sổ bật lên không được yêu cầu và kích thước cửa sổ/định vị/đóng.

+0

Anh ấy có nghĩa là lắng nghe những sự kiện đó, chứ không phải tự bắn chúng. – aehlke

0
<script> 

    // Adapted slightly from Sam Dutton 
    // Set name of hidden property and visibility change event 
    // since some browsers only offer vendor-prefixed support 
    var hidden, state, visibilityChange; 
    if (typeof document.hidden !== "undefined") { 
     hidden = "hidden"; 
     visibilityChange = "visibilitychange"; 
     state = "visibilityState"; 
    } else if (typeof document.mozHidden !== "undefined") { 
     hidden = "mozHidden"; 
     visibilityChange = "mozvisibilitychange"; 
     state = "mozVisibilityState"; 
    } else if (typeof document.msHidden !== "undefined") { 
     hidden = "msHidden"; 
     visibilityChange = "msvisibilitychange"; 
     state = "msVisibilityState"; 
    } else if (typeof document.webkitHidden !== "undefined") { 
     hidden = "webkitHidden"; 
     visibilityChange = "webkitvisibilitychange"; 
     state = "webkitVisibilityState"; 
    } 

    // Add a listener that constantly changes the title 
    document.addEventListener(visibilityChange, function() { 
     document.title = document[state]; 
    }, false); 

    // Set the initial value 
    document.title = document[state]; 

</script> 
+2

Thật tuyệt khi cung cấp mã có thể giúp giải quyết vấn đề. Nhưng trong trang web này, chúng tôi mong đợi câu trả lời để giải thích lý do và cách thức. Vui lòng thêm một số precisions vào bài viết của bạn. –

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