JavaScript / jQuery: Kiểm tra xem cửa sổ có tiêu điểm không


80

Làm thế nào để bạn kiểm tra xem trình duyệt có tiêu điểm hay không?


Xem thêm stackoverflow.com/questions/483741/… cũng có thể trả lời câu hỏi này.
Alexander Bird

15
Hãy thử document.hasFocus(), trả về một boolean. Nó được xây dựng trong thông số kỹ thuật, vì vậy nó có thể được thực hiện mà không cần jQuery.
Braden Best

Đối với những người muốn kiểm tra khả năng hiển thị của các trang ( không giống như tiêu điểm), vui lòng kiểm tra API Khả năng hiển thị của Trang để biết thêm chi tiết.
tsh

Câu trả lời:


79

Tôi chưa thử nghiệm điều này trong các trình duyệt khác, nhưng nó có vẻ hoạt động trong Webkit. Tôi sẽ để bạn thử IE. : o)

Hãy dùng thử: http://jsfiddle.net/ScKbk/

Sau khi bạn nhấp để bắt đầu khoảng thời gian, hãy thay đổi tiêu điểm của cửa sổ trình duyệt để xem kết quả thay đổi. Một lần nữa, chỉ được thử nghiệm trong Webkit.

var window_focus;

$(window).focus(function() {
    window_focus = true;
}).blur(function() {
    window_focus = false;
});

$(document).one('click', function() {
    setInterval(function() {
        $('body').append('has focus? ' + window_focus + '<br>');
    }, 1000);
});​

@jball - Phải là IE? Trong Webkit và Firefox, bất kỳ kích hoạt nào của cửa sổ đều kích hoạt tiêu điểm. Tôi tự hỏi liệu có cách giải quyết nào cho IE không. Ngoài ra, bạn đã thử nghiệm trên trang của mình? Có thể có sự cố vì jsFiddle sử dụng khung?
dùng113716

Chrome thực sự. Sau khi thử nghiệm thêm, nhận xét đầu tiên của tôi có thể sai - phím tab phá vỡ nó có vẻ phù hợp hơn.
jball

@jball - Tôi đoán rằng phím tab làm hỏng nó vì jsFiddle có rất nhiều yếu tố đầu vào trong các khung khác. Hãy loại bỏ các khung và tôi cá rằng nó sẽ hoạt động tốt hơn một chút cho bạn.
dùng113716,

Tôi tin rằng mỗi khung có windowđối tượng riêng của nó , vì vậy nếu bạn sử dụng các khung, bạn có thể chỉ cần đưa tập lệnh vào mỗi khung.
user113716,

4
Sử dụng window.topđể kiểm tra cửa sổ trên cùng.
Mårten Wikström

160

sử dụng phương thức hasFocus của tài liệu. Bạn có thể tìm thấy mô tả chi tiết và một ví dụ ở đây: phương pháp hasFocus

CHỈNH SỬA: Đã thêm fiddle http://jsfiddle.net/Msjyv/3/

HTML

Currently <b id="status">without</b> focus...

JS

function check()
{
    if(document.hasFocus() == lastFocusStatus) return;

    lastFocusStatus = !lastFocusStatus;
    statusEl.innerText = lastFocusStatus ? 'with' : 'without';
}

window.statusEl = document.getElementById('status');
window.lastFocusStatus = document.hasFocus();

check();
setInterval(check, 200);

3
Tôi đã thử ví dụ từ liên kết trên và nó hoạt động tốt trong IE7 +, Chrome và FF4. +1 cho bạn.
Joseph Lust

1
Chức năng nhỏ tuyệt vời, hoạt động tốt hơn nhiều so với các chức năng tương đương jQuery khác mà tôi đã chạy qua.
Heath

3
Hữu ích hơn câu trả lời được chấp nhận, tôi gặp sự cố với bộ hẹn giờ tải trong khi cửa sổ bị mất nét.
Kokos

Điều này không được hỗ trợ bởi Opera. Sự thật dịu là họ đang trong quá trình chuyển đổi các công cụ rendering để Webkit :)
Nikola Petkanski

6
Trong thời gian chờ đợi, bạn có thể sử dụng một số thứ như thế này để có được chức năng trong Opera: if(typeof document.hasFocus === 'undefined') { document.hasFocus = function () { return document.visibilityState == 'visible'; } }
Kent

3

Đoạn mã javascript đơn giản

Sự kiện dựa trên:

function focuschange(fclass) {
    var elems=['textOut','textFocus'];
    for (var i=0;i<elems.length;i++) {
        document.getElementById(elems[i]).
            setAttribute('class',fclass);
    }
}
window.addEventListener("blur",function(){focuschange('havnt')});
window.addEventListener("focus",function(){focuschange('have')});
focuschange('havnt');
.have                { background:#CFC; }
#textOut.have:after  { content:'';      }
.havnt               { background:#FCC; }
#textOut.havnt:after { content:' not';  }
<span id='textOut'>Have</span><span id='textFocus'> focus</span>

Dựa trên nhóm khoảng thời gian:

setInterval(function() {
    var fclass='havnt';
    if (document.hasFocus()) {
      fclass='have';
    };
    var elems=['textOut','textFocus'];
    for (var i=0;i<elems.length;i++) {
        document.getElementById(elems[i]).
            setAttribute('class',fclass);
    }
},100);
#textOut.have:after  { content:'';     }
#textOut.havnt:after { content:' not'; }
.have  { background:#CFC; }
.havnt { background:#FCC; }
<span id='textOut'>Have</span><span id='textFocus'> focus</span>


Tôi thích câu trả lời này vì giải pháp dựa trên sự kiện . Imho, nó luôn là cách được ưu tiên.
gần như

1

HTML:

<button id="clear">clear log</button>
<div id="event"></div>

Javascript:

$(function(){

    $hasFocus = false;

    $('#clear').bind('click', function() { $('#event').empty(); });

    $(window)
        .bind('focus', function(ev){
            $hasFocus = true;
            $('#event').append('<div>'+(new Date()).getTime()+' focus</div>');
        })
        .bind('blur', function(ev){
            $hasFocus = false;
            $('#event').append('<div>'+(new Date()).getTime()+' blur</div>');
        })
        .trigger('focus');

    setInterval(function() {
        $('#event').append('<div>'+(new Date()).getTime()+' has focus '+($hasFocus ? 'yes' : 'no')+'</div>');
    }, 1000);
});​

kiểm tra

CẬP NHẬT:

Tôi sẽ sửa nó, nhưng IE hoạt động không tốt

cập nhật thử nghiệm


Rõ ràng là hiệu ứng mờ không kích hoạt khi chuyển đổi các tab. :(
Jethro Larson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.