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

13,465

Solution 1

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) {} 

Solution 2

Set focus on the window before closing it

Share:
13,465
Lissy
Author by

Lissy

Updated on July 26, 2022

Comments

  • Lissy
    Lissy almost 2 years

    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>