Search code examples
javascriptjqueryfunctionwindow

call parent window function in child window javascript


Hi I want to run function from parent window in child window

But the following code does not work

index.php

//set status message
function setStatus($html){
    $("#data").html($html);
    }

//twitter login page handler
function twitter(){
    win = window.open('twit.php','win',"width=882,height=750,toolbar=0");
    setStatus('proccess...');
    }

//close window
 function closeWin(){
    win.close();
    }

//open new window
$(".twitterBtn").click(twitter);

twit.php

<script language="javascript" type="text/javascript">
window.opener.setStatus('Login with Twitter!');
window.opener.closeWin();
</script>

My problem with window.opener, It does not work

Please suggest a way that will work in all browsers and does not conflict with other codes

Thank you


Solution

  • Ok, it took a while but I have a working example.

    I use postMessage for the information exchange, however, it is only needed for letting the child know its parent.. but I extended the example to a parent-child chat. Have fun:

    <html>
    <head>
        <script>
            window.addEventListener("load",init,false);
            window.addEventListener("message",message,false); //register postMessages
    
            //we need this because master(original) and slave(=window.open) must do different actions
            var isSlave=window.location.href.indexOf("slave=true")>0
    
            //the other-window (in the slave, this is undefined, until the handshake is complete
            var popupwindow;
            if (!isSlave){
                popupwindow=window.open(window.location.href+"?slave=true", "_blank",'toolbar=0,location=0,menubar=0'); 
            }
    
            // this is called from the child window, after handshake
            function test(){
                var listElem = document.createElement('li');
                listElem.innerHTML="handshake succesful!!!!!";
                document.querySelector("ul").appendChild(listElem);
            }
    
            function init(){
                document.querySelector("button").addEventListener("click",function(){
                            ////popupwindow.test(); //note this works only if same origin policy allows this, else use postMessages
    
                    //here we send the message to the other window
                    popupwindow.postMessage(document.querySelector("#inp").value,"*");
                },false);
    
    
                //the timetrigger is needed, because opening and initializing the new window takes time, then we perform a handshake to let the new window know his origin
                setTimeout(function(){
                if(!isSlave)
                    popupwindow.postMessage("handshake successful","*");//handsake needed for bidirectional conneciton  
                },200);
    
    
            }
    
    
            //called when receiving a message
            function message(data){
    
                //needed for bidirectional message
                if (!popupwindow){
                    popupwindow=data.source;
                    //popupwindow.postMessage("handshake successful","*"); //send the handshake back to the origin (notification purpose only) //instead, we do test()
                    popupwindow.test();
                }
    
                //display the message
                var listElem = document.createElement('li');
                listElem.innerHTML=data.data;
                document.querySelector("ul").appendChild(listElem);
    
    
            }
        </script>
    </head>
    
    <body>
        <button>say hello</button>
        <input type="text" id="inp" />
        <ul></ul>
    </body>
    </html>