从父级调用弹出窗口函数不起作用

时间:2018-01-11 10:12:42

标签: javascript php timer

我正在创建一个玩家有弹出窗口的游戏。我试图从父母到播放器2弹出

调用计时器功能

我用google搜索并将此代码放在父

var Popup = window.open("player2.php", "bpPopup",'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=420,height=300,left = 490,top = 262');
Popup.focus();
Popup.calltimer();

并在player2.php中

function calltimer() {
  alert('timer  2 called');
}

2 个答案:

答案 0 :(得分:0)

将一个加载事件附加到弹出窗口,然后通过弹出窗口window对象调用该函数。

<script>
    var Popup = window.open("./player2.php", "bpPopup", 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=420,height=300,left = 490,top = 262');
    Popup.focus();
    Popup.addEventListener('load', function() { 
        Popup.window.calltimer(); 
    }, false);
</script>

See it working(别忘了允许弹出窗口)

答案 1 :(得分:0)

问题是时间问题:window.open可以在页面加载之前返回,甚至在解析了player2脚本之前 - 因此函数对象还没有存在。

当然,IE,和Edge 等等,直到子页面加载后再从window.open返回,因此您可以立即调用子函数。在IE中添加load事件监听器实际上无法工作 - load在您尝试收听之前会被解雇。

不关心不同浏览器计时的解决方法是:

  • 打开子窗口并记录对其窗口对象的引用。
  • 在子窗口中,
  • 从load事件中调用打开窗口中的函数。这是向父母表明孩子准备就绪的信号。
  • 在收到来自孩子的信号后,家长可以继续在子窗口中调用脚本。

在父窗口中进行测试:

var Popup;
function test1() {
    Popup = window.open("player2.php", "bpPopup",  'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=420,height=300,left = 490,top = 262');
}

function player2Ready() {
    setTimeout(test2,0);
}

function test2() {
    Popup.focus();
    Popup.calltimer();  
}

从点击事件中调用test1

<span onclick="test1()">test</span>

player2Ready函数使用超时来调用test2来解析子窗口和父窗口之间的代码执行以进行测试。

在孩子(player2)

function calltimer()
{
    alert('timer  2 called');
}
window.onload = function() { opener.player2Ready()};