在iframe中触发jquery事件,在父窗口中运行回调

时间:2013-05-04 16:19:37

标签: jquery events iframe

我可以从iframe触发父窗口范围内的事件并监听,但是我无法从iframe范围内的iframe触发事件并在父窗口中监听它。例如,在父窗口中,我有一个iframe和一些jquery代码来监听在它的主体中触发的事件

<iframe id="myframe" src="/vf-install.php" width="500" height="500"></iframe>
jQuery('#myframe').contents().find("body").on('foo',function(){
    alert('foo');
});

在iframe中我发起了一个事件:

<script type="text/javascript">jQuery("body").trigger("foo");</script>

我没有触发我的事件。作为旁注,我可以从iframe中触发父窗口中的事件,如下所示:

parent.jQuery("body").trigger("foo");

但这对我来说是不可接受的。原因是通过iframe包含的vf-install.php是我程序的安装程序。我正在使用qUnit编写回归测试,其中包括我在iframe中的安装程序,单击安装按钮,然后当安装程序完成(触发事件)时,测试将进行断言。因此,唯一一次通过iframe包含在测试中。实际用户直接调用页面,我不希望它在不存在的父窗口上触发事件。

另外作为旁注,我尝试将事件监听器附加到iframe的主体,当调用load()时,如果这是一个“实时查询”相关问题(事件在ajax改变页面后没有绑定):

jQuery('#myframe').load(function(){
    // attach the event listener like above
});

2 个答案:

答案 0 :(得分:1)

你能写一个用于推送事件的通用处理程序吗?

function triggerEvent(eventName) {
if(underTest == true) {
parent.jQuery("body").trigger(eventName);
}
else {
    jQuery("body").trigger(eventName);
}

然后你可以在你的代码中调用triggerEvent方法,并让你的测试将'underTest'变量设置为true,或者不是有一个全局var,检查你的测试工具是否存在?

这个解决方案不会过于漂亮,但它可能会起作用。

答案 1 :(得分:0)

你可以使用bind函数:

jQuery("#yourFrameID").bind("load", function() {
    var res = jQuery(this).contents().find('body').html().toString();
    //do something with the response
});