Как определить глобальный onkeydown для всех фреймов страницы? - PullRequest
0 голосов
/ 18 апреля 2019

У меня довольно сложная устаревшая многокадровая страница, которая должна быть совместима с IE-11 и должна реагировать на события горячих клавиш.

К сожалению, я заметил, что не могу просто объявить метод JS на родительской странице. Вместо этого кажется, что для каждого фрейма нужен собственный метод document.onkeydown (), потому что сейчас события работают только тогда, когда я щелкаю фреймы, для которых определен метод onkeydown ().

Есть ли способ глобально определить этот метод, чтобы все фреймы имели дело с событием? Я пытаюсь избежать неудобной ситуации, когда мне приходится объявлять один и тот же метод (или один и тот же код JS) для каждой страницы (и это будет кошмар, потому что фреймы - это динамически генерируемые страницы, маршрутизируемые некоторыми правилами Struts / Spring MVC)

1 Ответ

1 голос
/ 18 апреля 2019

Я могу интерпретировать этот вопрос двумя способами, и я думаю, что оба / оба могут быть полезны, поэтому я собираюсь ответить на оба.

1) Как я могу разделить код (функцию / метод / класс независимо от *) между несколькими фреймами HTML?

Нет действительно правильного способа сделать это в браузере, по крайней мере, не так, как я думаю, что вы хотите. Фреймы, считающиеся устаревшей функцией, не сильно изменились с 90-х годов, и это было до того, как появились большие сложные кодовые базы JS. Не существует собственного способа определения функции «глобально» без учета чего-то вроде расширения браузера.

Обычно это не проблема, потому что типичным способом сделать это является рисование каждого кадра из общего сценария. Вы бы поместили свой скрипт-тег вверху (или внизу) HTML-страницы.

<script src='common-code.js'></script>

Но если вы спрашиваете, как я могу использовать эту функцию JS в каждом кадре, не обновляя отдельный HTML каждого кадра? Тогда я боюсь, что тебе не повезло. Это особенность того, что каждый фрейм считается отдельным документом, и по соображениям безопасности вы не можете обратиться к другому документу и сказать «запустите этот код».

Я бы попытался найти способ массового обновления страниц и добавления тега сценария, который включает или выбирает общий код, или вам может повезти, если какой-то общий HTML уже определен, вы можете добавить его туда.

* Сюрприз, в JavaScript все это одно и то же!

2) Как я могу передать событие (keydown) из одного кадра в другой?

Вы можете эмулировать это, используя postMessage метод Window, чтобы отправить сообщение из одного кадра в другой, после чего кадр получателя обработает сообщение, а не собственное событие.

Независимо от того, используете ли вы набор фреймов или фреймы, я думаю, вам придется передавать каждое событие родительскому элементу, который затем отправляет событие обратно, используя список window.frames. Немного головной боли, но возможно.

(Для ясности, это не снимает ограничения, о которых говорилось в первом ответе. Это - то, как вы добились бы ситуации, когда щелчок в одном кадре «обрабатывается» другим - вам все равно придется обновить оба кадра включить код передачи и обработки сообщений).

...