我似乎不能让这件事起作用。
响应点击,窗口A打开窗口B(然后有焦点)。然后,响应B的点击,窗口调用window.opener.focus()
,但是焦点不会返回到A。
我为Chrome找到了一个奇怪的解决方案(29,可能还有其他)。如果我跑:
window.opener.name = 'somename';
window.open(window.opener.location.href, window.opener.name);
window.opener.focus();
它确实工作(并且不重新加载窗口A)。但这对火狐不起作用,而且这可能是个侥幸。
在我看来,opener
和focus
应该做什么是很清楚的,但是window.opener.focus()
不起作用。我遗漏了什么?
发布于 2013-08-29 02:17:03
来自精细手册
发出请求,将窗口带到前面。由于用户设置,它可能会失败,而且在此方法返回之前,窗口不一定是最前面的窗口。
强调我的。调用focus()
只是一个请求,浏览器可以随意忽略您,通常您应该会被忽略。考虑一下,如果你需要一个浏览器忽略你的请求的原因,你可以在别人打字的时候把焦点切换到一个很小的窗口,这样你就可以做什么坏事了。
如果您需要focus()
来工作您的应用程序,那么您需要重新设计您的应用程序,以便它不需要调用focus()
。
发布于 2016-01-05 07:37:19
我明白为什么browser/OS不允许子窗口接管焦点(滥用权力)。以下是一个解决办法:
JS家长:
var child = window.open('child.html', 'child');
window.external.comeback = function() {
var back = confirm('Are you sure you want to comback?');
if(back) {
child.close();
} else {
child.focus();
}
}
联署材料儿童:
// assuming you have jQuery
$('.btn').click() {
window.opener.external.comeback();
};
--我正在实际应用程序中使用这段代码来处理在子窗口中运行的签出请求,我需要优雅地返回到父窗口。
发布于 2021-11-16 19:07:43
我找到了一个合理的解决办法,使用网络通知。
正如在其他一些答案中提到的,在浏览器和操作系统中,window.opener.focus()可能无法工作。
我能够使用postMessage和通知使其工作。
要尝试这一点:在父(opener)选项卡中添加一个“message”事件侦听器,该侦听器通过单击侦听器创建通知:
window.addEventListener("message", (event) => {
if (!("Notification" in window)) {
alert("This browser does not support desktop notification");
}
// Let's check whether notification permissions have already been granted
else if (Notification.permission === "granted") {
// If it's okay let's create a notification
var notification = new Notification("The opener needs your attention");
// Add click listener that will perform a window focus
notification.onclick = function (x) {
window.focus();
this.close();
};
}
// Otherwise, we need to ask the user for permission
else if (Notification.permission !== "denied") {
Notification.requestPermission().then(function (permission) {
// If the user accepts, let's create a notification
if (permission === "granted") {
var notification = new Notification("The opener needs your attention");
// Add click listener that will perform a window focus
notification.onclick = function (x) {
window.focus();
this.close();
};
}
});
}
});
然后,在需要焦点回到父选项卡时,您需要从子选项卡使用postMessage:
// Called from child tab
window.opener.postMessage(
{
message: "focus",
},
"*" // cross-origin
);
一旦调用postMessage,就会看到OS通知。如果用户单击此选项卡,则应将其重定向到父(opener)选项卡。
https://stackoverflow.com/questions/18501095
复制相似问题