Обработайте нажатие клавиши Кадры Accross в IE

В этом подробно обсуждаются общие библиотеки на linux и влияние на производительность.

1
задан Community 23 May 2017 в 12:14
поделиться

2 ответа

Я заставил это работать

frameset.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
    <title>Test</title>
</head>
<frameset rows="50%,50%">
    <frame src="frame1.html" name="TOP">
    <frame src="frame2.html" name="BOTTOM">
</frameset>
</html>

frame1.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
    <title>Frame 1</title>
    <script type="text/javascript">
    onload = function()
    {
        top.frames.BOTTOM.document.onkeydown = 
        self.document.onkeydown = function( evt )
        {
            return function()
            {
                // Just an example to show it's working
                document.getElementById( 'output' ).value += String.fromCharCode( evt.keyCode );
            }
        }( window.event );
    }

    </script>
</head>
<body>
    frame1
    <textarea id="output"></textarea>  
</body>
</html>

frame2.html

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
   "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
    <title>Frame 2</title>
</head>
<body>
    frame2
    <textarea></textarea>
</body>
</html>

Во-первых, всегда полезно быть достаточно явным для вашего объекта Ссылки. Использование проприетарных ярлыков DOM (таких как window. frameName ) просто добавляет ненужный потенциал ошибки. Вот почему мой сценарий явно просматривает коллекцию frames объекта окна.

Далее следует ознакомиться с различными встроенными ссылками на окна в DOM при работе с наборами фреймов. Всего имеется 4

  1. окна - Текущее окно. Это также подразумевается, когда не используется (например, window.onload === onload)
  2. parent - Родительское окно для текущего
  3. верхнего - Самое верхнее окно в семействе наборов фреймов. parent === top , если у вас только один набор фреймов.
  4. self - псевдоним окна

Итак, в основном то, что я сделал здесь, когда событие onload срабатывает в окне frame1, добавил функцию обработчика к событию keydown для документов в оба окна фрейма.

Эта функция использует закрытие, чтобы гарантировать, что событие, сгенерированное во фрейме 1, доступно фактическому обработчику, независимо от того, какое окно сгенерировало событие нажатия клавиши. Это необходимо из-за того, как IE обрабатывает события. В то время как другой браузер создает новые объекты событий по мере их возникновения и передает их обработчикам событий, IE просто изменяет глобальный объект события (ссылка на него осуществляется через window.event или, что проще, просто event ) на отражать текущее событие.

Надеюсь, это имеет смысл.

когда событие onload срабатывает в окне frame1, добавляется функция-обработчик к событию keydown для документов в обоих окнах фрейма.

Эта функция использует закрытие, чтобы гарантировать, что событие, сгенерированное в frame1, доступно для фактического обработчик, независимо от того, в каком окне произошло событие нажатия клавиши. Это необходимо из-за того, как IE обрабатывает события. В то время как другой браузер создает новые объекты событий по мере их возникновения и передает их обработчикам событий, IE просто изменяет глобальный объект события (ссылка на него осуществляется через window.event или, что проще, просто event ) на отражать текущее событие.

Надеюсь, это имеет смысл.

когда событие onload срабатывает в окне frame1, добавляется функция-обработчик к событию keydown для документов в обоих окнах фрейма.

Эта функция использует закрытие, чтобы гарантировать, что событие, сгенерированное в frame1, доступно для фактического обработчик, независимо от того, в каком окне произошло событие нажатия клавиши. Это необходимо из-за того, как IE обрабатывает события. В то время как другой браузер создает новые объекты событий по мере их возникновения и передает их обработчикам событий, IE просто изменяет глобальный объект события (ссылка на него осуществляется через window.event или, что проще, просто event ) на отражать текущее событие.

Надеюсь, это имеет смысл.

Эта функция использует закрытие, чтобы гарантировать, что событие, сгенерированное во фрейме 1, доступно фактическому обработчику, независимо от того, какое окно сгенерировало событие нажатия клавиши. Это необходимо из-за того, как IE обрабатывает события. В то время как другой браузер создает новые объекты событий по мере их возникновения и передает их обработчикам событий, IE просто изменяет глобальный объект события (ссылка на него осуществляется через window.event или, что проще, просто event ) на отражать текущее событие.

Надеюсь, это имеет смысл.

Эта функция использует закрытие, чтобы гарантировать, что событие, сгенерированное во фрейме 1, доступно фактическому обработчику, независимо от того, какое окно сгенерировало событие нажатия клавиши. Это необходимо из-за того, как IE обрабатывает события. В то время как другой браузер создает новые объекты событий по мере их возникновения и передает их обработчикам событий, IE просто изменяет глобальный объект события (ссылка на него осуществляется через window.event или, что проще, просто event ) на отражать текущее событие.

Надеюсь, это имеет смысл.

2
ответ дан 3 September 2019 в 01:14
поделиться

Если у вас возникли проблемы с чтением объекта события кадра, когда событие обрабатывается в другом кадре, вам придется ссылаться на него явно

var event = top.frames.BOTTOM.event;

Я столкнулся с этим проблема сама, и начало моего обработчика событий было

var myFrame = top.frames[0];
myFrame.onkeydown = keyboardHandler;

function keyboardHandler(e) {
    if (!e && event) {
        e = event; //For handling the event in IE
    }
    if (!e && myFrame.contentWindow.event) {
        e = myFrame.contentWindow.event; //For handling event in IE6 from inside the iFrame
    }

    if (e) {
    ...
    }
}
0
ответ дан 3 September 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: