Cross-window Javascript communication 2.0
Back in April 2005, I wrote about a JavaScript system to regain control of an orphaned popup window. A couple of days ago, Robert Emmery left a comment stating that he had a simpler solution that didn’t require the somewhat clumsy notifier mechanism. Of course, at first, I didn’t believe him. Surely, nobody can solve a problem that I thought was insolvable!
Anyway, I challenged Rob to produce an example that reproduced exactly what mine did and he did so I declare my solution officially obsolete. Here’s Rob’s solution:
In the main window:
var popupWin = null;
function openPopup() {
var url = "popup.htm";
popupWin = open( "", "popupWin", "width=500,height=400" );
if( !popupWin || popupWin.closed || !popupWin.doSomething ) {
popupWin = window.open( url, "popupWin", "width=500,height=400" );
} else popupWin.focus();
}
function doSomething() {
openPopup();
popupWin.doSomething();
}
In the popup:
self.focus();
function doSomething() {
alert("I'm doing something");
}
As you can see it’s much cleaner. Thanks Rob!
Rob is the founder of SpaceCatch Inc, a social networking service that will launch some time in January.
You can read about the original solution and it’s problem here.

January 17th, 2007 at 12:37 am
Hello,
nice solution, but I have problems with it. Copied js code exactly from this page, tried and it is not working ;( the popup opens, but doSomething function is not fired. in firefox I get following error: Error: popupWin.doSomething is not a function. but it looks on some strange problem, because when I tried it more times (only by refreshing the page and clicking on a button), it worked sometimes. do anyone has any solution?
January 17th, 2007 at 9:57 am
michi: It works here. Send me your example so I can have a look. My email is martin at this domain
March 15th, 2007 at 5:32 pm
Nice one! I spent hours searching for some kind of getWindowByName() functionality, read tons of tutorials that all go obsolete as soon as the opener window is reloaded. Your solution is really very helpful!
April 13th, 2007 at 2:57 pm
This works in IE 6 but it does not work in Firefox 2.0.0.3. I get the error
popupWin.doSomething is not a function
April 24th, 2007 at 2:31 am
This is just what I was looking for. It works great in Mac OS X with Safari, Firefox, Opera, Camino, iCab, Netscape and even old Firebird. With Explorer (5.23), surprisingly, the pop-up window never opens.
May 4th, 2007 at 2:41 pm
I stumbled on almost the exact same solution. I didn’t think an empty url would leave the popup alone,though, so I used an empty javascript: url in stead. But then there’s the problem that led me here:
In my case, I don’t want to open the popup if it isn’t already there,
just send a command if it is.
The ‘open’ call will always return a window, possibly to an empty new
one. I suppose I could close it again immediately if the URL or
contents reveal a dummy, but it’s not very elegant; this operation
will occur quite frequently in my app.
So: is it possible to check for the pre-existence of a named window?
(without using timers in the popup, of course. The popup can be
cooperative i initialising, if that will help).
August 2nd, 2007 at 7:59 pm
Actually, for complex or slow webpages/sites, the above example won’t work because you have a race condition between the second page loading and the first page executing the javascript function call on the second page. The function doSomething() doesn’t exist until the browser parses that code and says it exists. This is some people above are getting the error.
One solution is to put a sleep timer in between the window open call and the call to doSomething(), however again, for complex or slow webpages or sites, you have no idea how long this delay needs to be and Firefox kindly warns the user if a JavaScript function executes for too long.
I believe the right way would be to override the window’s onload event handler to ensure that everything exists before executing any function call. But what if you already have an onload function defined? How can I get more than one function to execute at page load time without having a massive function or a function that calls a bunch of other functions?
I’m glad you asked. The solution is to have a callback manager for the onload event handler. You can find the code here: http://simonwillison.net/2004/May/26/addLoadEvent/
Do a search on “Andreas Karlsson” to find his callback manager code. Basically it maintains an array of functions to execute. This way, you can define your functions via “var foo = function { … } and then call “window.onload.addCallback(foo); to register your function. This way, you are guaranteed that the page has finished loading and you don’t need any sleep scripts.
–adam
August 2nd, 2007 at 8:07 pm
Whoops, that should be “var foo = function() { … }” in the last paragraph. Sorry. Also, missing the word “why” from the last sentence in the first paragraph.
–adam
August 10th, 2007 at 9:24 pm
Thank you for the excellent article. I’ve used the techniques here to create a fairly complex object that manages some pop up windows in a web application. It is pretty slick and this was a key component in it.
Also, thanks Adam for your post about adding onload events to new pop ups. I used Simon’s functions to create some pretty sweet communication between windows. Thanks again everyone!
September 21st, 2007 at 10:19 pm
Thank you a million time for this I’ve been looking to do this since quite a long and you perfectly solve my problem.
Hugs
mika
October 8th, 2007 at 11:54 pm
I go one weird problem. As usual its a browser issue. My scrips works perfectly in IE and Opera but not in Firefox. I don’t know why. Here is the problem.
I was able to open pop up window
Select Image
function showUpload(obj)
{
window.open(obj.href, “imageUploadWindow”, “width=400,height=630,scrollbars=no,resizable=no”);
}
***************
Now when I try to pass value from popup window to main window like this
function updateImages()
{
var imageName = document.getElementById(”photolist”).value;
eval(”self.opener.document.form.image.value=’”+imageName+”‘”);
}
—————————————-
It does not work in Firefox. But works perfectly in IE and Opera.
Any help or suggestion will get great appreciation.
Thank you
October 25th, 2007 at 12:11 pm
Shouldn’t you rather set an interval after opening the window that checks whether the opened window has the function you’re looking for?
October 25th, 2007 at 3:32 pm
Johann-
The problem with that is you don’t know when the page is finished loading. That depends on browser speed and whatever your computer happens to be doing at the time. Clearly, if you’re running either an I/O or memory intensive program your browser is going to be sluggish because your computer is going to be sluggish so you can’t say “Oh, I’ll just wait 5 seconds and then assume the page has finished loading and the function is there.”
This is the point of having the onload event handler. It essentially guarantees that the page has finished loading and everything that’s exposed is available.
October 30th, 2007 at 9:09 pm
Anyone have security problems with this? Once I’ve launched the popup, if I call the openPopup() again, I get a permission denied trying to access popupWin.doSomething in the if statement.
Weirdly, if I reload the page that is calling the openPopup() function and try again, it works without complaint.
This only happens when the client is on a different domain than the server. I can also eliminate the error by loading another page from the same domain before going to the page that calls openPopup().
Any ideas?
October 30th, 2007 at 9:14 pm
Re the above - I get the error in IE 6 but not Firefox.
October 30th, 2007 at 9:37 pm
Brian-
It sounds like it might be a security setting in IE.
May 12th, 2008 at 10:49 am
The problem is you call your javascript function too early;-) You have to wait the popup page be loaded before call a javascript function.
June 17th, 2008 at 8:59 am
This solution has a limitation.
It does not work if popupWin goes to a URL with a different domain to that of the main window.
October 10th, 2008 at 10:19 am
hi guys,
i find this solution very usefull, but doesn’t work in Safari for windows.
does somebody know a solution?
thanks a lot
October 31st, 2008 at 2:34 pm
??????? +10