Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iPad Safari IOS 5 window.close() closing wrong window

We have an iPad application that's working on our older iPads.

We open external links using var x = window.open(url)

at the end of the day, when the user closes this part of the app, we go through all the windows it opened and do x.close() for each one and everything is okie dokie.

Testing on the new iPad with IOS 5 and the lovely tabs, opening the new windows (although now they open as tabs) is fine, but doing x.close() doesn't seem to necessarily close x, it may close window y or z. Doing x.focus() or y.focus() works just fine, the correct tab comes into focus, but close seems to just pick whatever tab it wants.

Is this a bug or am I doing something wrong? Example program:

<html>
<head></head>
<body>
    <script>
        //The openWindow array will hold the handles of all open child windows
        var openWindow = new Array();
       var win1;
       var win2;
        //Track open adds the new child window handle to the array.
        function trackOpen(winName) {
            openWindow[openWindow.length]=winName;
        }

        //loop over all known child windows and try to close them.  No error is
        //thrown if a child window(s) was already closed.
        function closeWindows() {
            var openCount = openWindow.length;
            for(r=openCount-1;r>=0;r--) {
                openWindow[r].close();
            }
        }

        //Open a new child window and add it to the tracker.
        function open1() {
            win1 = window.open("http://www.yahoo.com");
            trackOpen(win1);
        }

        //Open a different child window and add it to the tracker.
        function open2() {
            win2 = window.open("http://www.google.com");
            trackOpen(win2);

        }
        //Open whatever the user enters and add it to the tracker
        function open3() {
            var newURL = document.getElementById("url").value;
            var win3= window.open(newURL);
            trackOpen(win3);
        }

    </script>
    <input type="button" value="Open 1" onclick="open1()">
    <input type="button" value="Open 2" onclick="open2()">
    <input type="button" value="Focus 1" onclick="win1.focus()">
    <input type="button" value="Focus 2" onclick="win2.focus()">
    <input type="button" value="Close 1" onclick="win1.close()">
    <input type="button" value="Close 2" onclick="win2.close()">

    URL: <input type="text" id="url"> <input type="button" value="Open URL" onclick="open3()">
    <input type="button" value="Close All" onclick="closeWindows()">

</body>
</html>
like image 651
Lissy Avatar asked Nov 02 '11 21:11

Lissy


2 Answers

That did the trick for me (iPad 2 and 3; 3 with iOS 5.1.1)

var host=window.opener;
window.focus(); /* solves the iPad3 problem */
window.close(); /* the actual closing we want to achieve... */
/* makes the focus go back to opener on iPad2, fails silently on iPad3 */
try { host.focus(); } catch(e) {} 
like image 113
Cee McSharpface Avatar answered Nov 10 '22 20:11

Cee McSharpface


Set focus on the window before closing it

like image 43
pronouncedJerry Avatar answered Nov 10 '22 21:11

pronouncedJerry