MS CRM 2011 IFRAME "load" 事件未触发

MS CRM 2011 IFRAME "load" event not fired

我有 MS CRM 2011(5.0.9690.2243,按需)HTML 在 IFRAME 中加载实体的网络资源:

<HTML>
    <HEAD>
        <SCRIPT type=text/javascript src="http://code.jquery.com/jquery-latest.min.js"></SCRIPT>
        <SCRIPT>
        $(document).ready(function(){ 
            if (window.console)
                console.log('doc ready');
            var f=$("#m4_ifr_entity");  
            f.bind('load', function() {
               if (window.console)
                    console.log('iframe loaded');
                // do some stuff here
            });     
        });
        </SCRIPT>
        <META charset=utf-8>
    </HEAD>
    <BODY contentEditable=true>
        <DIV style="WIDTH: 800px; FLOAT: left; HEIGHT: 600px">
            <IFRAME id=m4_ifr_entity height="100%" src="/main.aspx?etn=account&amp;pagetype=entityrecord" width="100%"></IFRAME>
        </DIV>
    </BODY>
</HTML>

在执行 "Preview" 时, 两个 console.log() 都出现在控制台中。一切顺利。

但是,当我将此 Web 资源作为 "Navigation link" 添加到实体,然后转到实体并单击导航中的 link 时,只有第一个console.log() 出现在浏览器控制台中,而 f.bind('load'... 中的另一个 console.log() 不存在,所以我认为 IFRAME 加载事件根本没有被触发。 IFRAME 本身加载得很好。

当我将调试器附加到 javascript 时,我看到已达到 f.bind('load', function() {,但调试器没有介入。

我在控制台中没有看到任何错误。我做了 "Publish" 的网络资源。在 IE 9 和 IE 11 中试过。

问题是:为什么 jQuery f.bind('load'... 在第二个用例中没有执行?

由于您已经处于不受支持的区域,您可能想要进入 html 网络资源的父级 window(如果存在)并调用一些函数。

在 html 网络资源中:

function onPreviewLoaded(){
//do something
}

形式javascript:

function onFormLoad(){
if(parent && parent.onPreviewLoaded)
parent.onPreviewLoaded();
}

事实证明这是由于 在 IFRAME 已经加载后绑定到加载事件,因此事件处理程序永远不会执行。

有 2 种可能的修复方法:

onload 放入 IFRAME html:

<IFRAME onload="someJsHere()"

或在 onload 绑定后强制重新加载 IFRAME src(当通过 javascript 将 src 动态添加到 IFRAME 时,此方法也很有用):

f.bind('load', function() {
    if (window.console)
       console.log('iframe loaded');
       // do some stuff here
    });
f.attr('src', f.attr('src'));