Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   проигрывание флэш на странице блокирует события документа (https://javascript.ru/forum/events/26446-proigryvanie-flehsh-na-stranice-blokiruet-sobytiya-dokumenta.html)

alexey980 09.03.2012 01:07

проигрывание флэш на странице блокирует события документа
 
взять тот же youtube. при нажатии play на видеоролике документ теряет фокус и никак не реагирует на нажатие клавиш. горячие клавиши типа ctrl+t окна браузера (например, Firefox) тоже не работают. приходится вручную кликать в свободной области документа, чтобы вернуть фокус. после этого документ снова реагирует на события. можно-ли как-то обойти этот флэш-баг с помощью javascript? хочу сделать небольшой скрипт для greasemonkey.

alexey980 09.03.2012 02:22

пока удалось продвинуться вот насколько:
function returnfocus (){
	var flash = document.getElementsByTagName("embed")[0]; 
	    flash.addEventListener('mouseout', function () { document.body.tabIndex = 0; document.body.focus(); }, false);
}
window.addEventListener('load', returnfocus, false);
данный код возвращает документу фокус (а следовательно и возможность использования горячих клавиш), если увести мышь с флэш-объекта. для простоты кода речь пока идёт только о первом флэш-объекте на странице. как бы сделать так, чтобы фокус возвращался не по событию mouseout, а, например, по keydown. если просто засунуть keydown в addEventListener флэш-объекта, то обработчик события не срабатывает.

alexey980 09.03.2012 12:28

nasqad,
спасибо за ссылку.

пришлось немного модифицировать для Greasemonkey одно из предложенных там решений. суть приёма в том, чтобы сделать флэш-объект проницаемым, а его родительскому элементу повесить обработчик события click, которым передавать фокус назад документу. муздыхался с добавлением параметра wmode="transparent" к уже существующему флэш-объекту. получилось только через клонирование и замену:
function returnfocus (){
	var flash = document.getElementsByTagName("embed")[0]; 
		flash.parentNode.addEventListener('click', function () {document.body.tabIndex = 0; document.body.focus();}, false);
	var cloneFlash = flash.cloneNode(true);
        cloneFlash.setAttribute('wmode','transparent');
        flash.parentNode.replaceChild(cloneFlash,flash);

}
window.addEventListener('load', returnfocus, false);


Часовой пояс GMT +3, время: 01:39.