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&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'));
我有 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&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'));