Состояние гонки при установке даже слушателя на кадрах

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

Главная страница выглядит так:

<html>
   <head>
      <meta http-equiv = "content-type" content = "text/html; charset=UTF-8">
      <meta http-equiv = "X-UA-Compatible" content = "IE=edge">
      <title>My title</title>
   </head>
   <frameset rows = "*" cols = "250,*" framespacing = "3" frameborder = "yes" border = "1" class = "doc-result-frameset">
       <frame src = "left.html" name = "info" id = "info" scrolling = "auto" class = "doc-result-frame-info">
       <frame src = "right.html" name = "doc" id = "doc" class = "doc-result-frame-doc">
   </frameset>
   <noframes>&lt;body&gt;&lt;/body&gt;</noframes>
</html>

Правый фрейм - это страница, которая загружается намного дольше, чем левый фрейм. В левом кадре я пытаюсь добавить JavaScript для управления всей страницей.

Я написал следующее:

top.window.addEventListener("keydown",
   function(event: KeyboardEvent) {handleKeyboardEvent(event, previous, next);},
   true);
var topWindowFrames : Window = top.window.frames;
for (var i = 0; i < topWindowFrames.length; i ++) {
   var frame : Window = topWindowFrames[i];
   frame.onload = (function(frame: Window) {
      return function() {
         frame.document.addEventListener("keydown",
            function(event: KeyboardEvent) {handleKeyboardEvent(event, previous, next);},
            true);};
         })(frame);   
}

Я также пробовал не оборачивать frame.onload внутри другой функции, просто используя frame внутри кода.

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
52
1

Ответы 1

запускать привязку слушателей событий через body.onLoad

<body onLoad = "bindEvents()">

Спасибо за Ваш ответ. Я попробую это. Я уже выполнил этот код в предложении $(document).ready(). Как вы думаете, это изменит ситуацию?

Vic Seedoubleyew 24.04.2018 09:50

Другие вопросы по теме