首页 文章

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

提问于
浏览
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包含在测试中 . 实际用户直接调用页面,我不希望它在不存在的父窗口上触发事件 .

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

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

2 回答

  • 1

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

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

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

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

  • 0

    你可以使用bind函数:

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

相关问题