window.focus() not working in Google Chrome
I've been struggling with this issue. I wanted a reference to another window, so I was issuing a:
otherWinRef = window.open("","OtherWindow");
However when I issue this command, the browser will switch focus to the OtherWindow. I thought this could be addressed by doing this:
otherWinRef = window.open("","OtherWindow");window.focus();
but the window.focus() has no effect. I tried:
otherWinRef = window.open("","OtherWindow");setTimeout(window.focus,0);
But the window.focus() call still had no effect.
I resolve the issue by adding the following code to the OtherWindow's source.
function Bounce(w) { window.blur(); w.focus();}
Then I changed the code in the main window to:
otherWinRef = window.open("","OtherWindow");otherWinRef.Bounce(window);
Still the same in version 14.0.835.202 m on Windows 7; found another workaround, not more elegant but at least will avoid losing data on the page: show an alert in the window you want to focus.
UPDATE: This solution appears to no longer work in Chrome.
Unbelievably, the solution is quite simple. I've been trying to figure this issue out for at least a week. All you need to do is blur the window then give it focus. I had tried this previously and it didn't work.
windowHandle.blur();windowHandle.focus();
So I ended up trying this instead:
windowHandle.blur();setTimeout(windowHandle.focus, 0);
and that seems to work.
I've updated my code here:
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 = {}; var isChrome = /chrome/.test(navigator.userAgent.toLowerCase()); // Public Members this.focus = function(windowHandle) { if (!windowHandle) { throw new Exception("Window handle can not be null."); } if (isChrome) { windowHandle.blur(); setTimeout(windowHandle.focus, 0); } else { windowHandle.focus(); } } 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. that.focus(windowHandles[windowTarget]); } 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'; windowProperties = windowProperties || 'menubar=yes,location=yes,width=' + (screen.availWidth - 15) + ', height=' + (screen.availHeight - 140) + ', 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 || !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(); } } } }}