Javascript 焦点选项卡或窗口

Javascript 焦点选项卡或窗口,javascript,jquery,firefox,Javascript,Jquery,Firefox,对于一个小应用程序,我正在从脚本中打开几个窗口/选项卡。当然,浏览器是打开一个窗口还是打开一个选项卡并不在我的掌握之中 但是,我保留了对新创建的窗口对象的引用,并且确实从另一个窗口“远程”更改了它们的内容。这一切都发生在相同的document.domain下,因此没有xss问题 问题是,我无法可靠地聚焦那些创建的窗口/选项卡。因为我正在为一个客户编写一个非常特定的应用程序,所以我只把Firefox作为浏览器。当然,我有一个选择,就是做一个remoteWindow.alert('foobar')将

对于一个小应用程序,我正在从脚本中打开几个窗口/选项卡。当然,浏览器是打开一个窗口还是打开一个选项卡并不在我的掌握之中

但是,我保留了对新创建的
窗口
对象的引用,并且确实从另一个窗口“远程”更改了它们的内容。这一切都发生在相同的
document.domain
下,因此没有xss问题

问题是,我无法可靠地
聚焦那些创建的窗口/选项卡。因为我正在为一个客户编写一个非常特定的应用程序,所以我只把Firefox作为浏览器。当然,我有一个选择,就是做一个
remoteWindow.alert('foobar')将窗口/标签带到前面,但这很难看,不是吗

我找到了这个答案

据说Firefox有一个允许脚本聚焦的选项。所以最后我的问题是,这个选择是什么? 我在
about:config
中搜索了“tabs”和“focus”,但没有找到任何相关内容


如何配置?

请参阅Mozilla文档:

var wm=Components.classes[“@mozilla.org/appshell/windowmediator;1”]
.getService(组件.接口.nsIWindowMediator);
var browserEnumerator=wm.getEnumerator(“导航器:浏览器”);
//检查每个浏览器实例
while(browserEnumerator.hasMoreElements()){
var browserWin=browserEnumerator.getNext();
var tabbrowser=browserWin.gBrowser;
//检查此浏览器实例的每个选项卡
var numTabs=tabbrowser.browsers.length;
对于(变量索引=0;索引

这里有一种更简单的事件驱动方法-。

简单的答案是:你不能。浏览器不会将这种API暴露给javascript。

你尝试过吗?

没有真正的方法可以做到这一点,原因很简单,如果网站有这种能力,他们最终会使用它来自动聚焦广告或诸如此类


这是可以做到的,但只有在Firefox中用户启用了它,他很可能不会。打开新的浏览器窗口/选项卡是有问题的。你考虑过对话框而不是打开一个新窗口吗?

我看到的唯一解决方案是强制在一个新窗口中弹出,因为似乎没有办法聚焦另一个选项卡。这个解决方案您还需要更改
工具>选项>内容选项卡
中的默认Javascript安全设置,并单击
启用Javascript
复选框旁边的
高级
按钮,选中中间框以允许聚焦窗口

要强制使用窗口而不是选项卡,请使用
win=window.open(“http://www.google.com“,“test”,“modal=yes”);
然后随时调用
win.focus();

编辑:实际上忘记了提及这只是FF。

回答您的问题:我发现,您正在寻找的设置称为“允许升高和降低窗口”


另一个设置是
about:config/dom.disable\u window\u flip
(设置为false)。

您是否尝试过在菜单工具->选项…->内容选项卡->高级按钮的“启用JavaScript”旁边选中名为“升高或降低窗口”的框


可以找到一个关于如何设置焦点的示例。

以下内容在IE8和FF13中适用:

<script type="text/javascript">
// Stupid script to force focus to an existing tab when the link is clicked.
// And yes, we do need to open it twice.
function openHelp(a) {
    var tab = window.open(a.href, a.target);
    tab.close();
    tab = window.open(a.href, a.target);
    return false;
}
</script>
<a href="help.html" target="help" onclick="return openHelp(this);">Help</a>

//愚蠢的脚本,在单击链接时强制将焦点放在现有选项卡上。
//是的,我们确实需要打开两次。
函数openHelp(a){
var tab=window.open(a.href,a.target);
tab.close();
tab=window.open(a.href,a.target);
返回false;
}

它又脏又难看,所以它只是附加信息:如果您调用警报()在任何打开的选项卡/窗口中,该选项卡都将获得焦点。

扩展上述Alex的贡献。用例是有一个CMS。当站点所有者登录到CMS时,前端将加载到另一个选项卡中。您在前端为站点所有者提供一个链接,重新加载CMS选项卡并聚焦

将此JavaScript放在前端页面上(或包含在全局JS文件中):


//愚蠢的脚本,在单击链接时强制将焦点放在现有选项卡上。
//是的,我们确实需要打开两次。
函数loadAdmin(a){
var tab=window.open(a.href,a.target);
tab.close();
tab=window.open(a.href,a.target);
返回false;
}
我喜欢将CMS链接放在H1内容之后。同样,这仅在他们登录到CMS时才进行。在这种情况下,我指向一个框架CMS,因此它必须知道加载到主框架中的内容(双关语)


页眉
这是为了确保选项卡是唯一的,以防我的浏览器中有多个CMS(支持多个客户端):

target=“#cgi.server#u name#wvAdmin”

最后,在CMS中的帧加载器上,添加此

<script type="text/javascript">
    window.name = '#cgi.server_name#wvAdmin';
</script>

window.name='#cgi.server#u name#wvAdmin';

…以确保如果用户自己打开CMS,我们仍然可以使用它。

感谢您的回复,但我不是在编写浏览器插件。我要求在Firefox中使用vanilla js解决方案。更准确地说,是允许vanilla js工作的选项。如果浏览器禁用focus,除了closin,我看不到任何方法关闭窗口并重新打开它,如果存在用户数据,可能会保留用户数据。我认为您正在试图打破浏览器对页面自由的限制。如果有解决方案,它在默认情况下确实不会打开。我很确定它不是默认的(作为前端开发人员,我希望如此!)但我想知道Firefox中是否有任何选项,通过允许脚本更改焦点窗口/选项卡来覆盖默认行为。打开新的浏览器
<script type="text/javascript">
// Stupid script to force focus to an existing tab when the link is clicked.
// And yes, we do need to open it twice.
function loadAdmin(a) {
    var tab = window.open(a.href, a.target);
    tab.close();
    tab = window.open(a.href, a.target);
    return false;
}
</script>
<h1>
    Page Heading
    <a href="/admin/main/?load=pages/page.cfm?id=#request.pageid#" title="Edit this page"
        onclick="return loadAdmin(this);"
        target="#cgi.server_name#wvAdmin"            
    ><img src="/media/admin/icon-edit.png" alt="Edit this page"/></a>
</h1>
<script type="text/javascript">
    window.name = '#cgi.server_name#wvAdmin';
</script>