Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

window.focus() not working in Google Chrome

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 just doesn't do anything. All other major browsers do not have this problem: FireFox, IE6-IE8 and Safari.

I have a client-side class for managing browser windows. When I first create a window the window comes into focus, but subsequent attempts to bring focus to the window do not work.

From what I can tell, this appears to be a security feature to avoid annoying pop-ups and it does not appear to be a WebKit issue as it works in Safari.

I know one idea someone brought forward was to close the window then reopen it, but this is a horrible solution. Googling shows that I do not appear to be the only person frustrated with this.

And just to be 100% clear, I mean new windows, not tabs (tabs cannot be focused from what I've read) and all the windows being opened are in the same domain.

Any ideas, workarounds aside from the bad one I mention above?

There is a bug logged on the Chromium project about this, check it out here. Thanks for posting that Rich.

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();                 }             }         }     } } 
like image 733
nickytonline Avatar asked May 03 '10 14:05

nickytonline


People also ask

Does chrome have a focus mode?

For now, it will only be available for Mac, Chrome OS, Windows, and Linux. The Android version of it is not expected to launch anytime soon. Once this is enabled, an item will appear in the right-click context menu, giving an option of “Focus this tab”.

What is window focus?

focus() Makes a request to bring the window to the front. It may fail due to user settings and the window isn't guaranteed to be frontmost before this method returns.


1 Answers

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); 
like image 133
Aheho Avatar answered Sep 22 '22 13:09

Aheho