Greg Tyler

When is a window closable?

Published on

JavaScript has a function window.close() which, under certain circumstances, will close the current window. However sometimes you'll run into an error like:

Scripts may close only the windows that were opened by it.

In this situation, your helpful "close this window" buttons don't work.

We have exactly this in situation in a current project I work on, where we ask people to open a link in a new tab so that window.close() will take them back out of it.

The problem we had was knowing when window.close() will work. If you open a new window with JavaScript (using no less) then it you're fine. But if you right click and open in a new tab, then submit a form, it won't be happy. So when is a window closable?

My first thought was the opener property of window which presumably would hint at where the window came from and – hence – what can close it. So I made a table of various difference situations which I experimented with in each of the major desktop browsers (Chrome, Firefox, IE). Find the table below and some terminology explained beneath it.

Chrome 39 Firefox 31 Internet Explorer 11 \*
Click New tab Click New tab Click New tab
Child N N N N U U
Child (\_blank) W W W N W U
Child (JS) W W W
Through form N N N N U U
Through form (\_blank) W W W N W U
Through form (JS) W W W
Through link N N N N U U
Through link (\_blank) W W W N W U
Through link (JS) W W W

"Child" means that the user was taken straight to a page with a close button on it. "Through form" means they were taken to a page which had a form submission before the close page. "Through link" means that they were taken to a page with a link to the close page.

"(_blank)" means that the window was opened using an <a> tag with the target="_blank" attribute. "(JS)" means that the window was opened with the function. All other examples were <a> tags with no attributes.

The colour of each cell is whether or not it could successfully be closed. The text denotes the value of window.opener. Where the text is "N", this value was null, where it is "W" it returned a window object. Where it is "U", it returned undefined.

What have we learnt?

Firstly, Internet Explorer is noticeably unusual. It returns undefined rather than null and then lets you close the window no matter what situation you're in (though with a prompt). Secondly, and important for my situation, asking people to open a new tab doesn't mean we'll be able to close it. As soon as they follow a link or submit a form, both Firefox and Internet Explorer lose control.

In a goal to find some sort of check whether a window is closable, I can recommend the following from my results:

if( typeof window.opener === 'object' && window.opener instanceof Window ) {
// We can certainly use window.close
} else {
// We can't be sure window.close will work

This is (from the experience above) a cross-browser way to be certain that window.close will work, without any browser sniffing.

Are my figures right? Any views on this? Comment below!