防止浏览器在调用外部应用程序时失去焦点

5
我正在使用Skype构建一个快速的VOIP演示,当我按下呼叫按钮时,Skype应用程序会将焦点从浏览器中移开。您可以在此处尝试:http://developer.skype.com/skype-uris/skype-uri-tutorial-webpages ,其中有几个“在此处尝试”链接。当我点击这些链接时,我希望浏览器保持焦点。是否有办法做到这一点? 感谢。
3个回答

4
你需要做的是从我的网络搜索中显然称为“焦点窃取”。
至少在Windows系统方面,似乎没有可靠的方法仅从浏览器中完成此操作。
我刚刚谷歌了“焦点窃取”(这就是JavaScript唯一的解决方案所需完成的操作),并发现许多答案表明,尽管理论上可能,但根据Windows的配置,浏览器从Skype夺走焦点可能在大多数情况下不起作用。
Google链接中的投诉很多,有些答案相互矛盾,但看起来可靠地将焦点“窃取”回到浏览器不会得到支持。
不过,这是件好事,如果你想想的话-我个人不希望任何旧的JavaScript程序在我正在工作的内容上改变我的焦点,这将是一个非常恼人的行为,最坏的情况下会使我的系统无用。
如果您可以在浏览器中使用某种允许的方法来完成此操作,那么其他人也可以-甚至是恶意网站。
最好的解决办法是永远不让焦点离开浏览器,但我不知道如何在您的特定情况下实现。也许您用来启动Skype的任何手段都有一个选项或其他内容,可以在后台启动它,从而永远不改变焦点。
我没有找到与Apple操作系统、Linux或移动操作系统相关的具体链接,但我有一种感觉,相同的关注和限制也适用于这些操作系统。
以下是一些谷歌搜索上的链接(对于您的需求,很抱歉带来了坏消息): Microsoft Answers论坛帖子 窃取焦点是邪恶的

http://pcsupport.about.com/od/windowsxp/ht/stealingfocus02.htm


1

您可以在新窗口中打开它,然后关闭新窗口并将焦点放回您的窗口。

类似这样:

a=window.open('skype:ohadcn?chat',10,10);
//i couldn't find a relevant event, onload() do not work for me here
//so i used setTimeOut, hoping that two seconds is enough to open skype but not enough to loose the user
setTimeout(function(){ a.close();window.focus();},2000)

1
我在Chrome中访问了Skype教程页面,打开了控制台并尝试了Ohad的答案,但它无法将焦点返回到教程网页。我甚至尝试了一个脚本,不断将焦点放在搜索文本框中。
    function ASDF() {
      document.getElementsByName("q")[0].focus();
      setTimeout(ASDF, 1000);
    } 
    setTimeout(ASDF, 1000);

仍然没有运气。

我尝试修改Ohad的脚本,使其在skype应用程序打开后在新窗口中重新打开教程页面。如果教程/控制台页面是窗口中唯一的选项卡,则可以正常工作:

a=window.open('skype:ohadcn?chat',10,10);
setTimeout(function(){ 
  a.close();
  a=window.open('http://developer.skype.com/skype-uris/skype-uri-tutorial-webpages', 10, 10);
  window.close();},2000);

然而,如果教程页面/控制台脚本在其他标签页的窗口中,它不会将焦点返回到重新打开的页面。更不用说,IE可能会警告用户原始页面正在尝试关闭。
我认为没有一种方法可以始终实现您的目标,但我保留错误的权利。

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