如何在jQuery中将焦点带到窗口?

9

我正在尝试使用jQuery将焦点放在窗口上。该窗口是通过父页面上的按钮单击启动的弹出窗口。子窗口中有一些ajax调用,因此数据正在更新。我的问题是,如果用户单击父窗口并将子窗口隐藏在其后面,则如果有数据更新,我希望将该子窗口带回前台。

在$(document).ready中,我绑定了以下事件:

  $(window).blur(function(){
    WindowHasFocus =false;
}).focus(function(){
    WindowHasFocus =true;
});

如果数据被更新,我就调用这个函数:

function FocusInput(){

 if(!WindowHasFocus){
    $(window).focus();
 }
}

这在IE8中的效果如预期一样,但在FireFox(和所有其他浏览器)中,如果我点击父窗口,则模糊事件似乎从未发生过。 有什么建议/想法可以实现这一点吗?

更新:

完全愚蠢的时刻: 在FireFox中: * 工具 * 选项... * 内容选项卡 * “启用JavaScript”旁边的高级按钮 * 选中名为“提升或降低窗口”的复选框


请将以下与编程相关的内容从英文翻译成中文。请将翻译后的文本放在单独的回答中,以便我们可以点赞并将问题从未回答列表中移除。 - Sarel Botha
5个回答

3

总的来说,这是一个非常尴尬的时刻:在FireFox浏览器中:

  • 点击 “工具”
  • 选择 “选项…”
  • 点击 “内容” 标签页
  • 在 “启用JavaScript” 旁边点击 “高级” 按钮
  • 勾选名为“提升或降低窗口”的复选框

默认情况下此功能是关闭的,需要手动启用。另外,我曾经以为在Chrome中也可以使用此功能,但是你知道,有一句谚语叫做“不要妄加猜测”(它可以在Safari中正常使用,但是在Chrome中不行)。


2
您说得很对。在FF中,似乎它确实触发了事件,但同时似乎它没有将元素注册为已聚焦。因此,模糊事件永远不会被触发。不确定我是否解释正确...以下代码说明了一切。
在此示例中,默认情况下隐藏该框,但通过焦点事件侦听器显示。在IE 8中,如果单击主窗口,它仍然会触发模糊,但在FF中不会:
<html>
<head>

</head>
<body>
    <div id="hiddenWin" style="width: 100px; height: 100px; background-color: Black; display: none;"></div>

    <script type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js"></script>
    <script type="text/javascript">
        var something = 12;
        something += 4; 

        $(document).ready(function()        
            {

                $("#hiddenWin").focus(function()
                    {
                        $(this).show();
                    }
                ).blur(function()
                    {
                        $(this).hide();
                    }               
                )               

                $("#hiddenWin").focus();
            }
        );
    </script>

</body>
</html>

针对您的需求,设置一个覆盖背景是否可行?这个背景应该是固定位置在顶部和左边,占据整个屏幕,并且z-index值比弹出窗口小。这样,当用户点击背景时,它会夺取焦点,然后您就可以隐藏所有内容……?我不确定,这只是一个建议。我会继续尝试看能否找到解决方案。好问题。+1


不,这个想法是让用户浏览网站,只有在数据更新时才将子窗口置于前台。 - Mike_G
在FireFox中:
  • 工具
  • 选项...
  • 内容选项卡
  • “启用JavaScript”旁边的高级按钮
  • 选中名为“提高或降低窗口”的复选框
找到了...我是个白痴。
- Mike_G

2

不能使用模态框,必须是一个独立的窗口。 - Mike_G
1
在这种情况下,尝试从父窗口调用焦点:url='someUrl' newWin=window.open(url,"helpWin","features"); ... newWin.window.focus() - Miquel
一个很强的原因是安全性:父窗口可能是常规的 http,需要打开一个 https 窗口。 - JohnK

1

看起来你不需要关心窗口何时变得模糊。当数据更新时,你的窗口要么没有焦点,这时你需要将其聚焦,要么已经有焦点,再次聚焦也不会对你造成任何伤害。


好的,原因是子窗口有一个文本输入框,我不想让焦点从那里移开。但无论如何,在FF中$(window).focus()似乎没有任何作用。 - Mike_G
1
你尝试过直接使用window.focus()而不是jquery调用吗? - levik

0

是的,模态框可能是最好的选择,但有时您只需要按照自己想要的方式进行操作。

我会使用普通的JavaScript。给窗口命名并将其带入焦点。

    function showImageWindow(imageURL)
    {
        var imageWindow = window.open(imageURL,"My_Window","width=1000px,height=1000px,menubar=0,titlebar=0,toolbar=0,location=0,scrollbars=0,status=0"); 
        imageWindow.focus();
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接