2

我可以从 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 包含在测试中。实际用户直接调用该页面,我不希望它在不存在的父窗口上触发事件。

另外作为旁注,我尝试在调用 load() 时将事件侦听器附加到 iframe 的主体,以防这是与“实时查询”相关的问题(在 ajax 更改页面后事件未绑定):

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

2 回答 2

1

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

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

然后您可以在代码中调用 triggerEvent 方法,并让您的测试将“underTest”变量设置为 true,或者不使用全局变量,而是检查您的测试工具是否存在?

这个解决方案感觉不是很漂亮,但它可能会完成这项工作。

于 2013-05-04T16:41:48.947 回答
0

您可以使用绑定功能:

jQuery("#yourFrameID").bind("load", function() {
    var res = jQuery(this).contents().find('body').html().toString();
    //do something with the response
});
于 2014-08-09T11:44:48.180 回答