ÐÑовеÑиÑÑ, Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð»Ð¸ окно в ÑокÑÑе, а Ñакже пеÑевеÑÑи внимание поÑеÑиÑÐµÐ»Ñ Ð½Ð° него â Ñложно.
РпеÑвÑÑ Ð¾ÑеÑедÑ, ÑÑо поÑомÑ, ÑÑо JavaScript не инÑегÑиÑован Ñ Ð¾ÐºÐ¾Ð½Ð½Ñм менеджеÑом ÐС. ÐÑоме Ñого, бÑаÑÐ·ÐµÑ Ð¾Ñ ÑанÑÐµÑ Ð¿Ñава поÑеÑиÑелÑ: еÑли он Ñ Ð¾ÑÐµÑ ÑкÑÑÑÑ Ð¾ÐºÐ½Ð¾, Ñо JavaScript не Ð¼Ð¾Ð¶ÐµÑ ÐµÐ³Ð¾ оÑÑановиÑÑ.
Ðо кое-ÑÑо ÑделаÑÑ, конеÑно, можно. Ðб ÑÑом и поговоÑим.
ÐеÑод window.focus
ÐеÑод window.focus позволÑÐµÑ ÑÑокÑÑиÑоваÑÑÑÑ Ð½Ð° окне. Ðн ÑабоÑÐ°ÐµÑ Ð¿Ð¾-ÑÐ°Ð·Ð½Ð¾Ð¼Ñ Ð² ÑазнÑÑ
ÐС и бÑаÑзеÑаÑ
.
ÐÑовеÑÑÑе, напÑимеÑ:
setInterval(function() { window.focus() }, 1000);
ЧÑо бÑдеÑ, еÑли запÑÑÑиÑÑ ÑÑÐ¾Ñ ÐºÐ¾Ð´, и заÑем пеÑеклÑÑиÑÑÑÑ Ð² дÑÑгое окно или вкладкÑ?
Ðожно подÑмаÑÑ, ÑÑо окно бÑÐ´ÐµÑ Ð¾ÐºÐ°Ð·ÑваÑÑÑÑ Ð² ÑокÑÑе Ñаз в ÑекÑндÑ. Ðо ÑÑо не Ñак.
ÐÑоизойдÑÑ Ð¾Ð´Ð½Ð¾ из ÑÑÑÑ :
- ÐообÑе никакого ÑÑÑекÑа. СамÑй ÑаÑпÑоÑÑÑанÑннÑй ÑлÑÑай, еÑли в окне много вкладок.
- Ðкно ÑазвеÑнÑÑÑÑ (пÑи необÑ
одимоÑÑи) и вÑÐ¹Ð´ÐµÑ Ð½Ð° пеÑедний план. ÐбÑÑно ÑÑо пÑоиÑÑ
одиÑ, когда меÑод
window.focus()вÑзÑваеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾Ð¿Ð°Ð¿Ð°, а акÑивно ÑейÑÐ°Ñ â главное окно. То еÑÑÑ, в ÑÑом ÑлÑÑае вÑзов ÑÑабоÑаеÑ. - Ðаголовок окна наÑнÑÑ Ð¼Ð¸Ð³Ð°ÑÑ. ЧÑÐ¾Ð±Ñ ÑвидеÑÑ ÑÑо в дейÑÑвии â оÑкÑойÑе даннÑÑ ÑÑÑаниÑÑ Ð² IE, запÑÑÑиÑе код и пеÑеклÑÑиÑеÑÑ Ð½Ð° дÑÑгое окно. ÐÑаÑÐ·ÐµÑ Ð¿Ð¾Ð¿ÑÑаеÑÑÑ Ð¿ÑивлеÑÑ ÐаÑе внимание миганием/меÑÑанием заголовка окна.
ÐеÑÑание заголовка
Рдополнение к window.focus() иÑполÑзÑÑÑ Ð¼ÐµÑÑание заголовка окна, как показано в пÑимеÑе ниже:
<script>
var win = open('/', 'test', 'width=300,height=300')
function getAttention(win) {
if (win.closed) {
alert( "Ðкно закÑÑÑо, пÑивлеÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ к Ð½ÐµÐ¼Ñ Ð½ÐµÐ»ÑзÑ" );
return;
}
win.focus();
var i = 0;
var show = ['************', win.document.title];
var focusTimer = setInterval(function() {
if (win.closed) {
clearInterval(focusTimer);
return;
}
win.document.title = show[i++ % 2];
}, 1000);
win.document.onmousemove = function() {
clearInterval(focusTimer);
win.document.title = show[1];
win.document.onmousemove = null;
}
}
</script>
<input type="button" onclick="getAttention(win)" value="getAttention(win)">
ÐапÑÑÑиÑе код и ÑвеÑниÑе вÑплÑваÑÑее окно. РзаÑем â нажмиÑе ÐºÐ½Ð¾Ð¿ÐºÑ Ñ Ð½Ð°Ð´Ð¿Ð¸ÑÑÑ Â«getAttention(win)». ÐÑаÑÐ·ÐµÑ Ð±ÑÐ´ÐµÑ Ð¿ÑивлекаÑÑ Ð²Ð°Ñе внимание, как ÑÐ¼ÐµÐµÑ ;)
ÐбÑаÑиÑе внимание: в коде еÑÑÑ Ð¿ÑовеÑка на win.closed. ÐопÑÑка манипÑлиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð·Ð°ÐºÑÑÑÑм окном вÑÐ·Ð¾Ð²ÐµÑ Ð¸ÑклÑÑение.
Ðак ÑолÑко поÑеÑиÑÐµÐ»Ñ ÑÑокÑÑиÑовалÑÑ Ð½Ð° окне индикаÑÐ¸Ñ Ð¿ÑекÑаÑаеÑÑÑ. ÐÐ»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñа ÑокÑÑиÑовки в пÑимеÑе вÑÑе иÑполÑзÑеÑÑÑ ÑобÑÑие document.onmousemove.
Ðожно бÑло иÑполÑзоваÑÑ ÑобÑÑие window.onfocus, но, оказÑваеÑÑÑ, оно ненадÑжно.
СобÑÑие window.onfocus
ÐÐ¾Ñ Ð¿ÐµÑепиÑаннÑй ваÑÐ¸Ð°Ð½Ñ ÑÑнкÑии getAttention(win), Ñ Ð¸ÑполÑзованием ÑобÑÑÐ¸Ñ onfocus:
<script>
var win = open('/', 'test', 'width=300,height=300')
function getAttention(win) {
if (win.closed) {
alert( "Ðкно закÑÑÑо, пÑивлеÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ к Ð½ÐµÐ¼Ñ Ð½ÐµÐ»ÑзÑ" );
return;
}
var i = 0;
var show = ['************', win.document.title];
function stop() {
clearInterval(focusTimer);
win.document.title = show[1];
}
win.onfocus = function() {
stop();
win.onfocus = null;
}
var focusTimer = setInterval(function() {
if (win.closed) {
clearInterval(focusTimer);
return;
}
win.document.title = show[i++ % 2];
}, 1000);
win.focus();
}
</script>
<input type="button" onclick="getAttention(win)" value="getAttention(win)">
Ðалее Ð¼Ñ Ð¿Ð¾ÑмоÑÑим ÑлÑÑаи, когда он не ÑÑабаÑÑваеÑ, и поÑÐµÐ¼Ñ Ð½Ð°Ð¼ вÑÑ Ð¶Ðµ нÑжно document.onmousemove.
Ðогда ÑобÑÑие onfocus не ÑабоÑаеÑ?
Ðозможно Ñакое, ÑÑо поÑеÑиÑÐµÐ»Ñ Ð¿ÐµÑеклÑÑаеÑÑÑ Ð½Ð° окно, а window.onfocus не пÑоиÑÑ
одиÑ.
ÐÑо поÑомÑ, ÑÑо пеÑеклÑÑение Ð¼ÐµÐ¶Ð´Ñ Ð¾ÐºÐ½Ð°Ð¼Ð¸ и ÑокÑÑиÑовка â ÑÑо ÑазнÑе веÑи. ÐапÑимеÑ, еÑли кÑÑÑÐ¾Ñ Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð² поле Ð´Ð»Ñ Ð²Ð²Ð¾Ð´Ð° URL бÑаÑзеÑа, Ñо ÑÑиÑаеÑÑÑ, ÑÑо окно не в ÑокÑÑе, Ñ Ð¾ÑÑ Ð¿Ð¾ÑеÑиÑÐµÐ»Ñ Ð¿ÐµÑеклÑÑилÑÑ Ð½Ð° ÑÑо окно.
ÐопÑобÑйÑе пÑоделаÑÑ ÑледÑÑÑее:
- ÐапÑÑÑиÑе пÑÐ¸Ð¼ÐµÑ Ñ
getAttentionв Chrome или IE (кÑÑаÑи, в Ð½Ð¸Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð¾ÑклÑÑиÑÑ Ð°Ð´ÑеÑнÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ). - ÐомеÑÑиÑе кÑÑÑÐ¾Ñ Ð² Ð¿Ð°Ð½ÐµÐ»Ñ Ð°Ð´ÑеÑа вÑплÑваÑÑего окна.
- ÐеÑейдиÑе обÑаÑно к Ð³Ð»Ð°Ð²Ð½Ð¾Ð¼Ñ Ð¾ÐºÐ½Ñ Ð¸ нажмиÑе кнопкÑ
getAttention(win)
ÐÑ ÑвидиÑе, ÑÑо неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо Ð²Ñ Ð¿ÐµÑеклÑÑилиÑÑ Ð½Ð° окно, и оно ÑейÑÐ°Ñ Ð½Ð° пеÑеднем плане, ÑобÑÑие onfocus не ÑÑабаÑÑваеÑ.
ÐÑÑÑ Ð¸ дÑÑгие ÑлÑÑаи, когда пеÑеклÑÑение Ð¼ÐµÐ¶Ð´Ñ Ð¾ÐºÐ½Ð°Ð¼Ð¸ не вÑзÑÐ²Ð°ÐµÑ window.onfocus. Скажем, еÑли окно ÑÑокÑÑиÑоваÑÑ ÑелÑком в поле ввода ÑоÑмÑ, Ñо в IE ÑобÑÑÐ¸Ñ window.onfocus (а Ñакже window.onfocusin) â не ÑÑабоÑаÑÑ!
Ðожно попÑобоваÑÑ Ð¿Ð¾Ð¹Ð¼Ð°ÑÑ Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑокÑÑиÑовки и по-дÑÑгомÑ, повеÑив дополниÑелÑнÑе обÑабоÑÑики ÑобÑÑий на document. Рглаве ФокÑÑиÑовка: focus/blur опиÑана ÑеÑ
ника делегиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ñ focus/blur.
Ðо ÑÑÐ¾Ñ ÑпоÑоб полÑÑÐ°ÐµÑ ÑокÑÑ ÑолÑко еÑли поÑеÑиÑÐµÐ»Ñ ÑÑокÑÑиÑÑеÑÑÑ Ð³Ð´Ðµ-Ñо в докÑменÑе: ÑÑÐ»ÐºÐ½ÐµÑ Ð¸Ð»Ð¸ ÑÐ´ÐµÐ»Ð°ÐµÑ ÐµÑÑ ÐºÐ°ÐºÐ¾Ðµ-Ñо дейÑÑвие в докÑменÑе, а не пÑоÑÑо поÑмоÑÑÐ¸Ñ Ð½Ð° него и пÑоведÑÑ Ð½Ð°Ð´ ним мÑÑкой.
ÐпÑоÑем, никÑо не меÑÐ°ÐµÑ Ð¸ÑполÑзоваÑÑ ÑоÑеÑание вÑÐµÑ Ð¾Ð¿Ð¸ÑаннÑÑ Ð¼ÐµÑодов.
ÐÑого
ФокÑÑиÑовка и пÑивлеÑение Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ðº окнÑ:
-
ÐеÑод
focusдлÑwindowне надÑжен. Ðкнами и вкладками бÑаÑзеÑа можно ÑвеÑенно ÑпÑавлÑÑÑ ÑолÑко на ÑÑовне ÐС.ÐоÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð¿ÑивлеÑÐµÐ½Ð¸Ñ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑеÑиÑÐµÐ»Ñ Ðº Ð¾ÐºÐ½Ñ ÑÑÐ¾Ð¸Ñ Ñакже иÑполÑзоваÑÑ Ð¼ÐµÑÑаÑÑий заголовок окна.
ÐбнаÑÑжение пеÑеклÑÑÐµÐ½Ð¸Ñ Ð½Ð° окно:
-
У
windowеÑÑÑ ÑобÑÑиеonfocus, но оно Ñакже ненадÑжно.ÐоÑÑÐ¾Ð¼Ñ Ð´Ð»Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿ÐµÑеклÑÑÐµÐ½Ð¸Ñ Ð½Ð° окно â иÑполÑзÑйÑе его вмеÑÑе Ñ Ð´ÐµÐ»ÐµÐ³Ð¸ÑÑемÑм
focusна докÑменÑе, а Ñакжеdocument.onmousemove.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)