我需要实现如下效果:
  在一个主窗口用window.open()打开一个子窗口,焦点转到子窗口,然后在子窗口中响应键盘事件执行一些操作,
操作完成之后,焦点返回主窗口。
  现在需要在子窗口执行操作时,把焦点锁定在子窗口,以便在子窗口在处理键盘操作,就算是用户用鼠标选中主窗口,焦点也要立即跳回子窗口中,直到操作结束才能让焦点回到主窗口。
  
  我的做法是在子窗口的blur事件中把焦点重新设置到子窗口中,(用了jquery)如下:  //lock focus   
$(document).bind('blur',function(){
    window.focus();
  });事件有响应到,可是没有达到预期效果,焦点没有锁定在子窗口中,上面的代码有问题吗?
或者哪位有其它的实现方法请指教下。谢谢!

解决方案 »

  1.   

    你的子窗口是怎么实现的,是新开子页还是 div层的隐藏和显示?,用div层控制的话,弄个遮盖层就行了
      

  2.   

    现在发现窗口的blur事件,在ff下好像有点问题,没办法在子窗口失去焦点的情况下,再在blur事件中使子窗口获得焦点,和ff下的事件执行顺序有关。有解决办法吗?
      

  3.   

    在子窗口加入如下代码:
    window.onblur = function ()
    {
      setTimeout(function(){window.focus();},10);
    };
    在ie和ff下都能达到效果了,可是如果换成下面的jquery代码:
    $(document).ready(function(){
      $(document).bind("blur",function(){
      setTimeout(function(){window.focus();},10);
    });
    });
    为什么在ie下没效果呢?
      

  4.   

    http://blog.csdn.net/java_pengjin/archive/2010/12/03/6052113.aspx01.<html>   
    02.<head>     
    03.<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />     
    04.<title>无标题文档</title>     
    05.<script language="javascript">   
    06.     
    07. window.onfocus = function focus(){//重写父窗口window对象中的onfocus,使其在获得焦点时执行以下代码      
    08.  if( typeof(window.childWindow)!="undefined"){//如果子窗口存在,将焦点转到子窗口      
    09.   window.childWindow.focus();      
    10.  }      
    11. }      
    12. function showChild(){      
    13.     
    14.//打开一个子窗口,并将子窗口的引用保存在父窗口window的childWindow属性中      
    15.  var height=30;      
    16.  var width=220;      
    17.  var left, top;      
    18.  left = (window.screen.availWidth - width) / 2; //使得对话框处于屏幕的正中间      
    19.   top = (window.screen.availHeight - height) / 2;      
    20.   var pos = 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top + ',screenX=' + left + ',screenY=' + top;        
    21.  
    22.  window.childWindow = window.open ("child.html", "newwindow",pos,"toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no");    
    23. }      
    24.</script>     
    25.</head>     
    26.     
    27.<body>     
    28.<input name="btn_show" type="button" value="显示子窗口" onclick="showChild()" />     
    29.<input name="btn_alert" type="button" value="显示其他" onclick="alert('被调用了')" />     
    30.</body>     
    31.</html>  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/java_pengjin/archive/2010/12/03/6052113.aspx
      

  5.   

    你的方法是可以,现在主要是,希望当子窗口处理完所有事情后,焦点就不用锁定在子窗口了,可以在两个窗口来回切换了,这样就需要在子窗口创建一个函数,当子窗口处理完成后,调用这个函数来使焦点锁定失效。
    也就是子窗口在调用父窗口的一个方法,来重写父窗口的onfous事件,使焦点不在锁定到子窗口。
    这样来来回回的调,是不是有点烦琐了?
      

  6.   

    window.open的话,绝不是好办法。很多浏览器,都对新窗口是否立即获得焦点有设置。而很多人,包括我,都是设置为不获得焦点。这样就可以在一个页面里打开多个相关链接页面后再逐个去看每个页面。如果每个页面都立即获得焦点,就很困扰,所以必须这样设置。而这个,和你的实现就很冲突。不考虑兼容,showModalDialog还是很方便的。
    考虑兼容的话,用层和遮罩就好了。楼主说的遮罩后别的还会获得焦点,应该是哪里没搞好。贴下代码吧。
      

  7.   

    $(window).bind("blur",function(){
       setTimeout(function(){window.focus();},10);
       });
    在网上查到一段,用上面这段代码搞定了。虽然说有点不安全,但在ie和ff下基本运行正常了。
    子窗口程序处理完后,在unbind这个事件,焦点就可以自由切了。
    不过这个延时执行是为什么呢?