window.focus() not working in Google Chrome window.focus() not working in Google Chrome google-chrome google-chrome

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();                }            }        }    }}