2014-12-30 3 views
1

У меня есть смешная проблема, которую мне нужно решить. Короче говоря, Internet Explorer использует событие window.onblur, чтобы сфокусировать элемент в iFrame. Из-за этого это рекурсия, и вы не можете щелкнуть что-либо за пределами iFrame. Проблема возникает в IE9, IE10, IE11 (не IE8 и ниже).Internet Explorer Iframe recursive window.onblur

Попробуйте здесь: Try it (in IE)

Скачать его здесь: Download it

Моего реальный вопрос: Есть ли способ, чтобы перезаписать событие window.onblur внутри плавающего фрейма снаружи плавающего фрейма? Это ошибка, и я должен сообщить об этом где-то в Microsoft?

Update

Спасибо за помощь @ Джонатан Самсона, это работает, как можно увидеть здесь:

See working example - вы должны ждать, пока IFrame не будет полностью загружен, чтобы иметь возможность перезаписать

ответ

0

Я работаю над командой Internet Explorer и с удовольствием рассмотрю это для вас. Чтобы ответить на ваш вопрос о перезаписи обработчика onblur в iframe, это может быть возможно, если два документа имеют общий домен. В вашем примере это так.

document.querySelector("iframe").contentWindow.onblur = null; 

В качестве альтернативы, вы можете только хотите связать с самим высоким окном с помощью window.top.

+0

Спасибо, что посмотрели. Действительно, это работает. Но вам нужно подождать, пока IFrame не будет загружен или он будет перезаписан. Я надеюсь, что есть хороший способ сделать это за пределами IFrame, но вопрос решается с помощью этого ответа. – CodingYourLife

+0

@CodingYourLife В идеале вы должны изменить код * внутри * iframe таким образом, чтобы он привязывался к 'window.top' вместо этого или просто отказывался добавлять обработчик к' onblur', если 'window! == window.top'. Если вам нужно внести изменения из верхнего окна, вы можете привязать к событию iframe 'DOMContentLoaded' или' Load' и запустить там свой код, избегая необходимости в 'setTimeout'. – Sampson

+0

Решил мою конкретную проблему с обходным решением. В моем случае у меня была вкладка навигации, которая изменила iFrame src (другого выхода не было). Я не мог подключиться к событию загрузки (также не имел доступа к странице содержимого iFrame) и даже пытался сбросить onblur каждые 1 секунду, но я мог даже видеть в отладчике, что onblur не установил значение null после строки. То, что я сделал, было новым событием onblur на странице, включая iFrame, который спрашивает пользователя, хочет ли он покинуть текущую вкладку. Если да, я устанавливаю IFrame src примерно: blank и затем перезаписываю onblur. -> превратил его в "особенность" ^^ – CodingYourLife