Захват событий keydown на html-странице с фреймами - PullRequest
2 голосов
/ 06 января 2011

У меня есть страница jsp с фреймами

<%@ include file="/includes/taglibs.jsp"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
  <head>
  <title>Welcome</title>
    <script type="text/javascript" src="/js/jquery-1.3.2.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $(this).keydown(function(e) {
                if(e.keyCode==27){
                    alert("escape pressed");
                    e.preventDefault();
                }
          });       
        }   
        );  
      </script> 
  </head>
      <frameset rows="42,*" frameborder="0" framespacing="0" id="framest">
          <frame src="/xyz/abc.html" scrolling="no" name="frame1"/>
          <frame src="/xyz/init.html" scrolling="no" name="frame2"/>
      </frameset>
</html>

Я пытаюсь перехватить нажатие клавиши escape.Но это не похоже на работу.В каждом отдельном html-кадре, если я пишу один и тот же код захвата, он прекрасно работает.

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

Ответы [ 2 ]

4 голосов
/ 06 января 2011

Помните, что фрейм - это совершенно новая HTML-страница с отдельным DOM, поэтому jQuery не включает ее в ваши привязки.

Так что вам нужно будет также связать эти документы:

function keyDownHandler(e) {
    if(e.keyCode==27){
        alert("escape pressed");
        e.preventDefault();
    }
}

for (var id in window.parent.frames)
    $(window.parent.frames[id].document).keydown(keyDownHandler);
$(document).keydown(keyDownHandler);

Если вышеописанное не работает для вас из-за id:

for (var i = 0; i < window.parent.frames.length; i ++) {
   var frame = window.parent.frames[i].document;
   frame.addEventListener("keydown",keyDownHandler, true);
}

Если вы хотите сослаться на все кадры, с верхнего уровня

for (var i = 0; i < top.window.frames.length; i ++) {
   var frame = top.window.frames[i].document;
   frame.addEventListener("keydown",keyDownHandler, true);
}
2 голосов
/ 06 января 2011

Вы также можете попробовать это:

Запишите свой код в файл .js и включите файл во все кадры. Таким образом, вы должны написать функцию только один раз и можете вызывать ее во всех кадрах.

Надеюсь, это hepls.

...