对于一个小应用程序,我正在从我的脚本打开几个窗口/标签。浏览器是打开窗口还是选项卡当然不在我手中。
但是,我保留了对新创建的window
对象的引用,并且我确实从另一个窗口“远程”更改了它们的内容。这一切都发生在相同的document.domain
下,因此没有xss问题。
问题是,我无法可靠focus
那些创建的窗口/标签。由于我正在为客户编写一个非常具体的应用程序,因此我只将Firefox作为浏览器。我有一个选择当然只是做一个remoteWindow.alert('foobar');
来把窗口/标签放在前面,但这是非常丑陋的不是它。
我找到了这个答案How to focus window/tab like alert()?
并且在那里说,Firefox有一个允许脚本焦点的选项。所以最后我的问题是,那个选项是什么?
我在about:config
搜索了“标签”和“焦点”,但未发现任何相关内容。
如何配置?
答案 0 :(得分:13)
以下似乎适用于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>
答案 1 :(得分:7)
我看到的唯一解决方案是在新窗口中强制弹出窗口,因为似乎没有办法聚焦另一个选项卡。此解决方案还要求您更改Tools > Options > Content tab
中的默认Javascript安全设置,然后单击Advanced
复选框旁边的Enable Javascript
按钮,并选中中间框以允许对焦窗口。
要强制使用窗口而不是标签,请使用win = window.open("http://www.google.com", "test" ,"modal=yes");
,然后在您愿意的时候致电win.focus();
。
编辑:实际上忘了提到这只是FF的事实。
答案 2 :(得分:2)
请参阅Mozilla的文档:https://developer.mozilla.org/en/Code_snippets/Tabbed_browser。
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator);
var browserEnumerator = wm.getEnumerator("navigator:browser");
// Check each browser instance
while (browserEnumerator.hasMoreElements()) {
var browserWin = browserEnumerator.getNext();
var tabbrowser = browserWin.gBrowser;
// Check each tab of this browser instance
var numTabs = tabbrowser.browsers.length;
for (var index = 0; index < numTabs; index++) {
var currentBrowser = tabbrowser.getBrowserAtIndex(index);
if (/*some logic*/) {
// For an example
tabbrowser.selectedTab = tabbrowser.tabContainer.childNodes[index];
// Focus *this* browser-window
browserWin.focus();
break;
}
}
以下是一种更简单的事件驱动方法 - https://developer.mozilla.org/En/Listening_to_events_on_all_tabs。
答案 3 :(得分:2)
您是否尝试过window.focus()?
答案 4 :(得分:2)
没有真正的方法可以做到这一点,原因很简单,如果网站有这种能力,他们最终会用它来自动聚焦广告或其他什么。
可以这样做,但只有在Firefox中,用户启用了它,而他很可能不会这样做。
答案 5 :(得分:1)
要回答问题:我找到了http://www.gtalbot.org/FirefoxSection/Popup/PopupAndFirefox.html#RaiseLowerSetting,其中说明您要查找的设置称为“允许升高和降低窗口”。
另一个设置是about:config/dom.disable_window_flip
(为假),找到here。
答案 6 :(得分:1)
您是否尝试过菜单工具 - &gt;选项...... - &gt;内容标签 - &gt; “启用JavaScript”旁边的高级按钮,选中名为“升级或降低Windows”的框?
可以找到有关如何设置焦点的示例here。
答案 7 :(得分:1)
它很脏又丑,所以它只是加信息:如果你在任何打开的标签/窗口中调用alert(),该标签将获得焦点。
答案 8 :(得分:0)
简单的答案是:你做不到。浏览器不会将这种API公开给javascript。
答案 9 :(得分:0)
扩展亚历克斯的贡献。用例是CMS。站点所有者登录CMS时,前端加载到另一个选项卡中。您为网站所有者提供了一个重新加载CMS选项卡的前端链接,重点是。
将此javacript放在前端页面上(或包含在全局JS文件中):
<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内容之后放置CMS链接。同样,这只有在他们登录CMS时才会出现。在这种情况下,我指向一个Framed CMS,所以它必须知道要加载到主框架中的内容(双关语)。
<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>
这是为了确保选项卡是唯一的,以防我的浏览器中有多个CMS(支持多个客户端):
目标=&#34;#cgi.server_name#wvAdmin&#34;
最后,在CMS中的帧加载器上,添加此...
<script type="text/javascript">
window.name = '#cgi.server_name#wvAdmin';
</script>
...确保如果用户自己打开CMS,我们仍然可以使用它。
答案 10 :(得分:-1)
打开新的浏览器窗口/标签是有问题的。您是否考虑过jqueryui对话而不是打开新窗口?