2010-04-27 24 views
56

Tôi cần biết liệu người dùng hiện có đang xem một tab hay không trong Google Chrome. Tôi đã cố gắng sử dụng các sự kiện mờ và tập trung gắn với cửa sổ, nhưng chỉ mờ có vẻ như đang hoạt động chính xác.Cách phát hiện khi tab được tập trung hoặc không ở trong Chrome bằng Javascript?

window.addEventListener('focus', function() { 
    document.title = 'focused'; 
}); 

window.addEventListener('blur', function() { 
    document.title = 'not focused'; 
}); 

Sự kiện trọng tâm hoạt động lạ, đôi khi chỉ. Nếu tôi chuyển sang tab khác và quay lại, sự kiện lấy nét sẽ không kích hoạt. Nhưng nếu tôi bấm vào thanh địa chỉ và sau đó trở lại trên trang, nó sẽ. Hoặc nếu tôi chuyển sang một chương trình khác và sau đó quay lại Chrome, chương trình sẽ kích hoạt nếu tab hiện đang được tập trung.

+0

Bạn hãy thử để đính kèm những sự kiện cho 'docment' thay vì' window'? – Crozin

+0

Tôi không chắc liệu nó có ảnh hưởng đến phát hiện sự kiện hay không, nhưng hành động 'window.focus' bị tắt (hoặc ít nhất là lỗi) trong Chrome. Xem [tại đây] (http://code.google.com/p/chromium/issues/detail?id=1674) và [tại đây] (http://stackoverflow.com/questions/2703314/in-google-chrome- làm thế nào-do-i-mang-một-hiện-popup-cửa sổ-to-the-front-sử dụng-java) để biết thêm. – brahn

+0

Không hoạt động với tài liệu và điều này là dành cho sự kiện trọng tâm, không phải là hành động tập trung. Tôi nghĩ tôi sẽ thay đổi cách tiếp cận của mình và thay đổi sự kiện thành di chuột qua hoặc cuộn cửa sổ. Đối với kịch bản này, nó phù hợp. – fent

Trả lời

96

2015 update: HTML5 cách mới với API tầm nhìn (lấy từ bình luận Blowsie của):

document.addEventListener('visibilitychange', function(){ 
    document.title = document.hidden; // change tab text for demo 
}) 

Mã các poster ban đầu đưa ra (trong câu hỏi) hiện đang làm việc, như năm 2011 :

window.addEventListener('focus', function() { 
    document.title = 'focused'; 
}); 

window.addEventListener('blur', function() { 
    document.title = 'not focused'; 
}); 

chỉnh sửa: Kể từ một vài tháng sau đó trong Chrome 14, điều này sẽ vẫn làm việc, nhưng người dùng phải tương tác với trang bằng cách nhấp vào bất kỳ đâu trong cửa sổ ít nhất một lần. Chỉ đơn giản là di chuyển và như vậy là không đủ để thực hiện công việc này. Làm window.focus() cũng không tự động thực hiện công việc này. Nếu có ai biết về cách giải quyết khác, vui lòng đề cập đến.

+0

Bạn nói đúng. – fent

+15

Woohoo, huy hiệu Necromancer! – ninjagecko

+1

Cách để làm việc này mà không cần người dùng nhấp vào đâu đó trước tiên là thêm "window.focus()" vào sự kiện window.onload. Tác dụng phụ của điều này là nếu cửa sổ là mục tiêu của một liên kết và đã được mở phía sau cửa sổ hiện tại, nó sẽ được đưa ra phía trước. Lưu ý rằng giải pháp này chỉ phát hiện mất tập trung, không phải là do việc chuyển đổi các tab. Ví dụ: nếu mất tập trung là do người dùng nhấp vào bên trong iframe, bạn phải loại bỏ điều đó: –

2

Nó có thể làm việc sau khi tất cả, tôi đã nhận tò mò và viết mã này:

... 
setInterval (updateSize, 500); 
function updateSize(){ 
    if(window.outerHeight == window.innerHeight){ 
    document.title = 'not focused';    
    } else { 
    document.title = 'focused'; 
    } 

    document.getElementById("arthur").innerHTML = window.outerHeight + " - " + window.innerHeight; 
} 
... 
<div id="arthur"> 
    dent 
</div> 

Mã này không precisly những gì bạn muốn, nhưng trên một cách xấu xí. Vấn đề là, Chrome dường như bỏ qua sự thay đổi tiêu đề theo thời gian (khi chuyển sang tab và giữ chuột xuống trong 1 giây dường như luôn tạo hiệu ứng này).

Bạn sẽ nhận được các giá trị khác nhau trên màn hình, nhưng tiêu đề của bạn sẽ không thay đổi.

kết luận: Dù bạn đang làm gì, đừng tin tưởng vào kết quả khi thử nghiệm!

+0

Tiêu đề thay đổi ngay lập tức cho tôi. Nếu tôi thay đổi các sự kiện để di chuột qua và di chuột, tôi sẽ nhận được kết quả tức thì. – fent

+0

Dù sao, cảm ơn phần (window.outerHeight == window.innerHeight). Đối với dự án cụ thể này, tôi chỉ cần biết liệu người dùng hiện có tập trung hay không. Không cần phải liên tục kiểm tra và mã của bạn hoạt động. – fent

+1

Tính năng này không hoạt động nữa, kể từ năm 2011. – ninjagecko

0

tôi thấy rằng việc thêm onblur = và onfocus = sự kiện để Inline bỏ qua vấn đề này:

-2

Trong chrome bạn có thể chạy một kịch bản nền với một thời gian chờ ít hơn 1 giây, và khi các tab không có tiêu điểm chrome sẽ chỉ chạy nó mỗi giây. Thí dụ;

Điều này không hoạt động trong Firefox hoặc Opera. Không biết về các trình duyệt khác, nhưng tôi nghi ngờ nó cũng hoạt động ở đó.

var currentDate = new Date(); 
var a = currentDate.getTime(); 

function test() { 
    var currentDate = new Date(); 
    var b = currentDate.getTime(); 
var c = b - a; 
    if (c > 900) { 
     //Tab does not have focus. 
    } else { 
     //It does 
    } 
    a = b; 
    setTimeout("test()",800); 
} 



setTimeout("test()",1); 
+2

Tôi không thích ý tưởng sử dụng các khoảng thời gian cho một điều gì đó cần được tổ chức. Và lưu ý, bạn nên sử dụng 'setTimeout (test, 800)'. Nếu bạn cho nó một chuỗi, nó sẽ 'eval()', nó chậm hơn nhiều. – fent

0

Điều này có thể làm việc với JQuery

$(function() { 
    $(window).focus(function() { 
     console.log('Focus'); 
    }); 

    $(window).blur(function() { 
     console.log('Blur'); 
    }); 
}); 
+0

Tôi nghĩ rằng điều này sẽ không hữu ích vì khi anh ta báo cáo trình duyệt KHÔNG kích hoạt chức năng sự kiện mà bạn đã đính kèm trong 'mờ'. Vì vậy, như trong ví dụ và mã của bạn 'console.log ('Blur');' sẽ KHÔNG được gọi trong một số trường hợp. – psulek

1

Đối với bất cứ ai muốn trao đổi tiêu đề trang trên mờ và sau đó quay trở lại tiêu đề trang gốc trên tập trung:

// Swapping page titles on blur 
var originalPageTitle = document.title; 

window.addEventListener('blur', function(){ 
    document.title = 'Don\'t forget to read this...'; 
}); 

window.addEventListener('focus', function(){ 
    document.title = originalPageTitle; 
}); 
Các vấn đề liên quan