Определить, Если Вкладка Браузера Имеет Фокус
есть ли надежный кросс-браузер способ определить, что вкладка имеет фокус.
сценарий заключается в том, что у нас есть приложение, которое регулярно опрашивает цены на акции, и если страница не имеет фокуса, мы можем остановить опрос и спасти всех от шума трафика, тем более, что люди являются поклонниками открытия нескольких вкладок с разными портфелями.
и window.onblur и window.onfocus опции для этого?
7 ответов:
да
window.onfocusиwindow.onblurдолжны работать для вашего сценария:http://www.thefutureoftheweb.com/blog/detect-browser-window-focus
Важная Правка: этот ответ устарел. С момента его написания API видимости (mdn,пример, spec) был введен. Это лучший способ решить эту проблему.
var focused = true; window.onfocus = function() { focused = true; }; window.onblur = function() { focused = false; };насколько я знаю,
focusиblurвсе поддерживаются...всё. (см. http://www.quirksmode.org/dom/events/index.html )
в поиске об этой проблеме, я нашел рекомендацию, что API видимости страницы должен быть использован. Большинство современных браузеров поддерживают этот API в соответствии с Can I Use:http://caniuse.com/#feat=pagevisibility.
вот рабочий пример (производный от этот фрагмент):
$(document).ready(function() { var hidden, visibilityState, visibilityChange; if (typeof document.hidden !== "undefined") { hidden = "hidden", visibilityChange = "visibilitychange", visibilityState = "visibilityState"; } else if (typeof document.msHidden !== "undefined") { hidden = "msHidden", visibilityChange = "msvisibilitychange", visibilityState = "msVisibilityState"; } var document_hidden = document[hidden]; document.addEventListener(visibilityChange, function() { if(document_hidden != document[hidden]) { if(document[hidden]) { // Document hidden } else { // Document shown } document_hidden = document[hidden]; } }); });обновление: в приведенном выше примере были префиксные свойства для браузеров Gecko и WebKit, но я удалил это реализация, потому что эти браузеры уже некоторое время предлагают API видимости страницы без префикса. Я сохранил специальный префикс Microsoft, чтобы оставаться совместимым с IE10.
Да, это должно работать для вас. Вы только что напомнили мне об этой ссылке, с которой я столкнулся, что использует эти методы. интересно читать
удивительно, что никто не упомянул
document.hasFocusif (document.hasFocus()) console.log('Tab is active')
Я бы сделал это таким образом (Ссылка http://www.w3.org/TR/page-visibility/):
window.onload = function() { // check the visiblility of the page var hidden, visibilityState, visibilityChange; if (typeof document.hidden !== "undefined") { hidden = "hidden", visibilityChange = "visibilitychange", visibilityState = "visibilityState"; } else if (typeof document.mozHidden !== "undefined") { hidden = "mozHidden", visibilityChange = "mozvisibilitychange", visibilityState = "mozVisibilityState"; } else if (typeof document.msHidden !== "undefined") { hidden = "msHidden", visibilityChange = "msvisibilitychange", visibilityState = "msVisibilityState"; } else if (typeof document.webkitHidden !== "undefined") { hidden = "webkitHidden", visibilityChange = "webkitvisibilitychange", visibilityState = "webkitVisibilityState"; } if (typeof document.addEventListener === "undefined" || typeof hidden === "undefined") { // not supported } else { document.addEventListener(visibilityChange, function() { console.log("hidden: " + document[hidden]); console.log(document[visibilityState]); switch (document[visibilityState]) { case "visible": // visible break; case "hidden": // hidden break; } }, false); } if (document[visibilityState] === "visible") { // visible } };
Кросс-браузер jQuery решение!Raw доступно по адресу GitHub
весело и простой в использовании!
следующий плагин пройдет через ваш стандартный тест для различных версий IE, Chrome, Firefox, Safari и т. д.. и установите ваши объявленные методы соответственно. Он также имеет дело с такими вопросами, как:
- onblur|.размытие / онфокус|.фокус "дублировать" звонит
- окно теряет фокус через выбор альтернативного приложения, как word
- это, как правило, нежелательно просто потому, что, если у вас есть открытая страница банка, и это onblur событие говорит ему, чтобы замаскировать страницу, а затем, если вы откроете калькулятор, вы больше не можете видеть страницу!
- не срабатывает при загрузке страницы
использование так же просто, как:прокрутите вниз до ' Run Фрагмент'
$.winFocus(function(event, isVisible) { console.log("Combo\t\t", event, isVisible); }); // OR Pass False boolean, and it will not trigger on load, // Instead, it will first trigger on first blur of current tab_window $.winFocus(function(event, isVisible) { console.log("Combo\t\t", event, isVisible); }, false); // OR Establish an object having methods "blur" & "focus", and/or "blurFocus" // (yes, you can set all 3, tho blurFocus is the only one with an 'isVisible' param) $.winFocus({ blur: function(event) { console.log("Blur\t\t", event); }, focus: function(event) { console.log("Focus\t\t", event); } }); // OR First method becoms a "blur", second method becoms "focus"! $.winFocus(function(event) { console.log("Blur\t\t", event); }, function(event) { console.log("Focus\t\t", event); });/* Begin Plugin */ ;;(function($){$.winFocus||($.extend({winFocus:function(){var a=!0,b=[];$(document).data("winFocus")||$(document).data("winFocus",$.winFocus.init());for(x in arguments)"object"==typeof arguments[x]?(arguments[x].blur&&$.winFocus.methods.blur.push(arguments[x].blur),arguments[x].focus&&$.winFocus.methods.focus.push(arguments[x].focus),arguments[x].blurFocus&&$.winFocus.methods.blurFocus.push(arguments[x].blurFocus),arguments[x].initRun&&(a=arguments[x].initRun)):"function"==typeof arguments[x]?b.push(arguments[x]): "boolean"==typeof arguments[x]&&(a=arguments[x]);b&&(1==b.length?$.winFocus.methods.blurFocus.push(b[0]):($.winFocus.methods.blur.push(b[0]),$.winFocus.methods.focus.push(b[1])));if(a)$.winFocus.methods.onChange()}}),$.winFocus.init=function(){$.winFocus.props.hidden in document?document.addEventListener("visibilitychange",$.winFocus.methods.onChange):($.winFocus.props.hidden="mozHidden")in document?document.addEventListener("mozvisibilitychange",$.winFocus.methods.onChange):($.winFocus.props.hidden= "webkitHidden")in document?document.addEventListener("webkitvisibilitychange",$.winFocus.methods.onChange):($.winFocus.props.hidden="msHidden")in document?document.addEventListener("msvisibilitychange",$.winFocus.methods.onChange):($.winFocus.props.hidden="onfocusin")in document?document.onfocusin=document.onfocusout=$.winFocus.methods.onChange:window.onpageshow=window.onpagehide=window.onfocus=window.onblur=$.winFocus.methods.onChange;return $.winFocus},$.winFocus.methods={blurFocus:[],blur:[],focus:[], exeCB:function(a){$.winFocus.methods.blurFocus&&$.each($.winFocus.methods.blurFocus,function(b,c){this.apply($.winFocus,[a,!a.hidden])});a.hidden&&$.winFocus.methods.blur&&$.each($.winFocus.methods.blur,function(b,c){this.apply($.winFocus,[a])});!a.hidden&&$.winFocus.methods.focus&&$.each($.winFocus.methods.focus,function(b,c){this.apply($.winFocus,[a])})},onChange:function(a){var b={focus:!1,focusin:!1,pageshow:!1,blur:!0,focusout:!0,pagehide:!0};if(a=a||window.event)a.hidden=a.type in b?b[a.type]: document[$.winFocus.props.hidden],$(window).data("visible",!a.hidden),$.winFocus.methods.exeCB(a);else try{$.winFocus.methods.onChange.call(document,new Event("visibilitychange"))}catch(c){}}},$.winFocus.props={hidden:"hidden"})})(jQuery); /* End Plugin */ // Simple example $(function() { $.winFocus(function(event, isVisible) { $('td tbody').empty(); $.each(event, function(i) { $('td tbody').append( $('<tr />').append( $('<th />', { text: i }), $('<td />', { text: this.toString() }) ) ) }); if (isVisible) $("#isVisible").stop().delay(100).fadeOut('fast', function(e) { $('body').addClass('visible'); $(this).stop().text('TRUE').fadeIn('slow'); }); else { $('body').removeClass('visible'); $("#isVisible").text('FALSE'); } }); })body { background: #AAF; } table { width: 100%; } table table { border-collapse: collapse; margin: 0 auto; width: auto; } tbody > tr > th { text-align: right; } td { width: 50%; } th, td { padding: .1em .5em; } td th, td td { border: 1px solid; } .visible { background: #FFA; }<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <h3>See Console for Event Object Returned</h3> <table> <tr> <th><p>Is Visible?</p></th> <td><p id="isVisible">TRUE</p></td> </tr> <tr> <td colspan="2"> <table> <thead> <tr> <th colspan="2">Event Data <span style="font-size: .8em;">{ See Console for More Details }</span></th> </tr> </thead> <tbody></tbody> </table> </td> </tr> </table>
Comments