2011-05-20 19 views
0

当我打开弹出窗口时,我希望能够设置弹出窗口可以调用的几个回调。 所以基本上我有两个页面的代码是这样的:jQuery - 如何在弹出窗口中将回调设置为父页面

*****popup.html******* 
var callBack; 
function OnSaveClick() 
{ 
    if (callBack) 
    callBack(); 
} 

********************************************** 
********popupOpener.html************* 
function callBackHandler() 
{ 
    //some code here 
} 
function OpenPopup() 
{ 
    var p = window.open("popup.html"); 
    p.callBack = callBackHandler; 
    return false; 
} 

这样做的问题是,VAR的回调被重置时popup.html负载的DOM和它不会加载,直到OpenPopup()上开瓶器完成。 所以接下来最好的事情是在popup.html的ready事件中设置callBack。但我想能够在popupOpener.html中将popup事件处理程序附加到popup.html的ready事件中。 所以OpenPopup功能现在看起来是这样的:

var p; 
function OpenPopup() 
{ 
    p = window.open("popup.html"); 
    $(p).ready(hookCallBack)  //doesn't work 
    //or $(p.document).ready(hookCallBack) //doesn't work 
    return false; 
} 
function hookCallBack() 
{ 
    p.callBack = callBackHandler; 
} 

但hookCallBack()后,$(P)。就绪(hookCallBack),而不是当popup.html的DOM准备好立即执行。有没有其他方法可以做到这一点?

在弹出页面

回答

2

见我的问题:Get DOM elements of a popup for jQuery manipulation为回答如何在加载后控制弹出窗口

所以你可以做一些像@ MattBall的回答:

popupOpener.html:

var opener = { 

     popup: null, 

     newPopup: function(windowsname){ 
      this.popup = window.open(windowsname); 
      var self = this; 

      this.popup.onload = function() 
      { 
       var doc = this.document, 
        script = doc.createElement('script'); 
        script.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js'; 
        script.onload = function() 
        { 
         function setup() 
         { 
          //something to do on the popup 
         } 

         script = doc.createElement('script'); 
         script.textContent = "(" + setup.toString() + ")();"; 
         doc.body.appendChild(script); 
        }; 

        doc.head.appendChild(script); 
      }; 
     }, 

     some_function: function(){ 
      //calling it here: 
      this.newPopup('popup.html'); 
     } 
    } 

所以加载页面加载弹出:

window.onload = function(){ 
    opener.some_function(); 
}; 

这里是一个演示:http://jsfiddle.net/EJasA/

+0

我不知道为什么,但popup.onload = someFunc;弹出DOM加载后,someFunc永远不会被调用。我在IE中测试。 – sash 2011-05-20 12:52:48

+0

你从哪里得到'popup.onload'?你所要做的就是'opener.some_function();' – Neal 2011-05-20 12:54:18

+0

@sash看我编辑 – Neal 2011-05-20 12:55:14

0

请参阅“开门红”,以获得其创建的弹出页面:

因此,例如:

function OnSaveClick() 
{ 
    if (callBack) //just have callback as a boolean field 
     opener.top.frameFocus.callbackfunc(); 
} 

看到http://www.webreference.com/js/tutorial1/opener.html

+0

这不是一个选项,因为我们不想流行将被绑定到特定的父页面。这个弹出式窗口与许多页面一起工作,它们可能有callBackfunc或不可以。我们希望尽可能地消除这种开门符类型的代码,因为有很多交互。我们希望页面和弹出窗口之间有某种合约。 – sash 2011-05-20 12:33:44

+0

我不和你在一起 - 这不会将“弹出窗口”与父母“绑定”。任何创建的弹出窗口都会引用它的创建者。如果父母不想被回叫,那么在创建弹出框时设置callback = false。 – BonyT 2011-05-20 13:15:01

0
if(callback_function) { 
    eval('window.opener.' + callbak_function)(name, age, address); 
} 

CALLBACK_FUNCTION是字符串

相关问题