window.focus() not working in Google Chrome

后端 未结 16 1694
余生分开走
余生分开走 2020-11-28 05:07

Just wondering if Google Chrome is going to support window.focus() at some point. When I mean support, I mean have it work. The call to it doesn\'t fail, it jus

相关标签:
16条回答
  • 2020-11-28 05:39

    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();
                    }
                }
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-28 05:43

    A suggestion from someone's blog is to use this:

    if (navigator.userAgent.indexOf('Chrome/') > 0) {
        if (window.detwin) {
            window.detwin.close();
            window.detwin = null;
        }
    }
    window.detwin = window.open(URL,  'windowname', '...');
    window.detwin.focus();
    

    Following this bug might be useful.

    0 讨论(0)
  • 2020-11-28 05:43

    I was only able to solve my problem when I used setTimeout() and encapsulated the focus() inside an anonymous function. Here is an example:

    setTimeout(function () {
       myField.focus();
    }, 0);
    
    0 讨论(0)
  • 2020-11-28 05:44
    window.open('javascript:void(0)', 'myWindow');
    
    0 讨论(0)
提交回复
热议问题