繁体   English   中英

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

[英]Fire a jquery event in an iframe, run a callback in parent window

我可以从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
});

您可以编写一个用于推送事件的通用处理程序吗?

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

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

这个解决方案看起来并不太漂亮,但是可以完成任务。

您可以使用bind函数:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM