按键打开未聚焦的选项卡

Posted

技术标签:

【中文标题】按键打开未聚焦的选项卡【英文标题】:Key press opening unfocused tab 【发布时间】:2012-07-26 06:27:41 【问题描述】:

我有以下代码可以正常工作:

// click on the button
$(".btnHeaderSearch").click(function(event) 
 
    event.preventDefault();
    window.open('/search.aspx?phrase=' + $('.txtHeaderSearch').val());
);

它将在新窗口/选项卡中打开 search.aspx,并且该窗口/选项卡将具有焦点或位于所有其他窗口/选项卡的前面。

但是,下面的代码不起作用:

// press enter key when textbox has focus to simulate button click:
$('.txtHeaderSearch').bind('keyup', function(e) 
    if ( e.keyCode === 13 )  // 13 is enter key
        window.open('/search.aspx?phrase=' + $('.txtHeaderSearch').val());
    
);

这里发生的情况是窗口/选项卡确实打开了,但它在所有其他窗口后面打开了一个窗口,或者它打开了一个选项卡而不给选项卡焦点,所以我最终留在了原始页面上。

如何按下回车键来打开一个窗口/选项卡,其行为方式与上面的按钮单击相同?即我希望这两个代码位都可以打开一个窗口或选项卡,该窗口或选项卡立即具有焦点,就像当前单击一样。

我在 IE8 中遇到了这种行为。它在谷歌浏览器中运行良好,我没有在任何其他浏览器上尝试过。不幸的是,我需要让它在 IE8 中工作。

【问题讨论】:

【参考方案1】:

来自http://msdn.microsoft.com/en-us/library/ie/ms537632(v=vs.85).aspx:

确保您网站中的所有弹出窗口都以 用户操作的直接结果,例如单击页面元素,或 跳到一个链接,然后按 ENTER。

事实上,你的代码根本不适合我,IE 默认的弹出窗口拦截器只是阻止了它。我认为这是不可接受的,因为大多数用户都不允许这样做。

我通过在按下 enter 时将焦点移动到隐藏链接(与 tab 键相同)来解决它(很重要,因为在 keyup 之后为时已晚),当它被释放时,它将与按 enter 相同而在该链接上,以便弹出窗口打开。

html

<input class="txtHeaderSearch">
<a id="hidden-link" href="#">needs to have content</a>

CSS:

#hidden-link 
    position: absolute;
    left: -9999px;
    top: -9999px;

javascript

$('.txtHeaderSearch').bind('keydown', function(e) 
    if (e.which === 13)  // which is normalized by jQuery
        $("#hidden-link").focus();
    
);

$("#hidden-link").click(function() 
    var win = window.open('/search.aspx?phrase=' + $('.txtHeaderSearch').val());
    //win.focus(); 
    //The above is optional, if the window opens but doesn't focus then uncomment the above line
);

演示:

http://jsfiddle.net/UCcqM/2/

同样的解决方法不适用于其他浏览器,因此您需要检测 IE 并根据浏览器有条件地使用适当的解决方案。

【讨论】:

【参考方案2】:

当有人在文本框内按回车键时,使用它来点击按钮:

// press enter key when textbox has focus to simulate button click:
$('.txtHeaderSearch').keyup(function(e) 
    if ( e.keyCode === 13 )  // 13 is enter key
        $(".btnHeaderSearch").click();    
    
);

【讨论】:

这是否意味着IE8不能做到这一点?【参考方案3】:

您可以尝试像这样在 .txtHeaderSearch keyup 事件上点击 .btnHeaderSearch。

$('.txtHeaderSearch').bind('keyup', function(e) 
    e.preventDefault();
    if (e.keycode === 13)    
        $('.btnHeaderSearch').click();
    

【讨论】:

也许先尝试添加阻止默认值,因为我已经编辑了上面的答案以显示。 这也没什么区别。 你可能会尝试做这样的事情 window.open('/search.aspx?phrase=' + $('.txtHeaderSearch').val()).focus() - 添加焦点( ) 最后,但结果可能不可靠 似乎对 IE8 没有任何影响。【参考方案4】:

我在 IE8 中测试过这个

http://jsfiddle.net/74mtV/2/

当它第一次发生时,它会发出弹出警告,并且没有打开任何窗口,但在允许它之后,两个事件都会打开一个新的弹出窗口,并将焦点设置在它上面。

在正常模式和启用兼容性的情况下进行了测试。

【讨论】:

我在第一次测试中得到了与您相同的结果,即关于我同意允许的弹出窗口的警告消息。之后,它会打开一个新标签,但没有重点。为什么它会为你打开一个焦点标签,而不是为我打开? 我在 MSIE 8 中测试,但版本写成:版本 8.0.6001.18702 你的也一样吗? 有些插件会干扰,你可以禁用所有插件还是从工具-管理插件中一一禁用?看看这是否能解决你的问题。 好的“在后台打开选项卡或立即切换到它的选项在这里:工具 > Internet 选项 > 常规选项卡 > 选项卡设置按钮。“打开时总是切换到新选项卡” 【参考方案5】:

例如:

    <form action="page2" method="get" onsubmit="return func()">
      <input type="text" name="search"/>
    </form>

在文本框中写入内容并按回车将调用 func(),当返回 true 时,将提交表单 (http://example.com?search=....)

因此,对于您的问题,您只需替换示例中的值并定义一个函数来处理预提交作业。

【讨论】:

【参考方案6】:

可能是动态绑定的问题,下面的链接对我有用, http://jsfiddle.net/madhuvana/McaXj/2/

【讨论】:

以上是关于按键打开未聚焦的选项卡的主要内容,如果未能解决你的问题,请参考以下文章

使用角度导航时,在新选项卡中打开链接未在新选项卡中打开

android选项卡选择,按下,聚焦之间的区别?

如何使用 Javascript 在 Chrome 中检测选项卡何时聚焦或不聚焦?

使用 jQuery 选项卡的谷歌浏览器“无效的表单控件不可聚焦”

打开多个应用程序选项卡时通知未关闭

如果我的网页未在任何选项卡中打开,则禁用通知