Google Chrome がいつかサポートするかどうか気になりますwindow.focus()
。サポートとは、動作することを意味します。呼び出しが失敗するのではなく、何もしないだけです。他のすべての主要ブラウザ (Firefox、IE6-IE8、Safari) ではこの問題は発生しません。
ブラウザ ウィンドウを管理するためのクライアント側クラスがあります。最初にウィンドウを作成するとウィンドウにフォーカスが当たりますが、その後ウィンドウにフォーカスを当てようとしても機能しません。
私の知る限り、これは迷惑なポップアップを避けるためのセキュリティ機能のようで、Safari では動作するため WebKit の問題ではないようです。
誰かが提案したアイデアの 1 つは、ウィンドウを閉じてから再度開くというものですが、これはひどい解決策です。Google で検索すると、これに不満を抱いているのは私だけではないようです。
明確にしておくと、タブではなく新しいウィンドウを意味します (私が読んだところによると、タブはフォーカスできません)。また、開かれるウィンドウはすべて同じドメイン内にあります。
上記で述べた悪い例以外に、何かアイデアや回避策はありますか?
これについてはChromiumプロジェクトにバグが記録されているので、確認してください。ここ投稿してくれてありがとうリッチ。
MyCompany = { UI: {} }; // Put this here if you want to test the code. I create these namespaces elsewhere in code.
MyCompany.UI.Window = new function() {
// Private fields
var that = this;
var windowHandles = {};
// Public Members
this.windowExists = function(windowTarget) {
return windowTarget && windowHandles[windowTarget] && !windowHandles[windowTarget].closed;
}
this.open = function(url, windowTarget, windowProperties) {
// See if we have a window handle and if it's closed or not.
if (that.windowExists(windowTarget)) {
// We still have our window object so let's check if the URLs is the same as the one we're trying to load.
var currentLocation = windowHandles[windowTarget].location;
if (
(
/^http(?:s?):/.test(url) && currentLocation.href !== url
)
||
(
// This check is required because the URL might be the same, but absolute,
// e.g. /Default.aspx ... instead of http://localhost/Default.aspx ...
!/^http(?:s?):/.test(url) &&
(currentLocation.pathname + currentLocation.search + currentLocation.hash) !== url
)
) {
// Not the same URL, so load the new one.
windowHandles[windowTarget].location = url;
}
// Give focus to the window. This works in IE 6/7/8, FireFox, Safari but not Chrome.
// Well in Chrome it works the first time, but subsequent focus attempts fail,. I believe this is a security feature in Chrome to avoid annoying popups.
windowHandles[windowTarget].focus();
}
else
{
// Need to do this so that tabbed browsers (pretty much all browsers except IE6) actually open a new window
// as opposed to a tab. By specifying at least one window property, we're guaranteed to have a new window created instead
// of a tab.
windowProperties = windowProperties || 'menubar=yes,location=yes,width=700, height=400, scrollbars=yes, resizable= yes';
windowTarget = windowTarget || "_blank";
// Create a new window.
var windowHandle = windowProperties ? window.open(url, windowTarget, windowProperties) : window.open(url, windowTarget);
if (null === windowHandle) {
alert("You have a popup blocker enabled. Please allow popups for " + location.protocol + "//" + location.host);
}
else {
if ("_blank" !== windowTarget) {
// Store the window handle for reuse if a handle was specified.
windowHandles[windowTarget] = windowHandle;
windowHandles[windowTarget].focus();
}
}
}
}
}
ベストアンサー1
私はこの問題に苦労してきました。別のウィンドウへの参照が必要だったので、次のように発行していました。
otherWinRef = window.open("","OtherWindow");
しかし、このコマンドを発行すると、ブラウザは OtherWindow にフォーカスを切り替えます。これを解決するには、次のようにすればよいと考えました。
otherWinRef = window.open("","OtherWindow");
window.focus();
しかし、window.focus() は効果がありません。私は以下を試しました:
otherWinRef = window.open("","OtherWindow");
setTimeout(window.focus,0);
しかし、window.focus() 呼び出しはまだ効果がありませんでした。
次のコードを OtherWindow のソースに追加することで問題を解決します。
function Bounce(w) {
window.blur();
w.focus();
}
次に、メイン ウィンドウのコードを次のように変更しました。
otherWinRef = window.open("","OtherWindow");
otherWinRef.Bounce(window);