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