Javascript 在Internet Explorer中注册iframe事件
我有一个web应用程序,它允许用户输入搜索条件,并将结果附加到一个portlet容器中,就在搜索条件的输入字段下方(如上所述)。 环境-JSP、JAVA和标记库 搜索页面基本上由几个JSP页面组成,这些页面引用了无数的标记库 返回搜索结果(AJAX)后,portlet iframe应根据新高度重新调整大小。一个名为setContainerHeight的javascript方法(驻留在其中一个标记库中)是重新调整大小的原因 问题- Internet Explorer不调用我的JS方法,它会重新调整大小 我怀疑下面的帖子可以帮助解决这个问题。 Chrome、Firefox、Opera……都可以 因为我不能明确地告诉页面刷新(我将丢失搜索条件参数),也不能明确地检查发出请求的浏览器类型(我的javascript没有被调用);我如何明确地告诉页面在回调后调用我的resize方法 如果有人好奇,这是我的尺寸调整方法:Javascript 在Internet Explorer中注册iframe事件,javascript,internet-explorer,iframe,javascript-events,portlet,Javascript,Internet Explorer,Iframe,Javascript Events,Portlet,我有一个web应用程序,它允许用户输入搜索条件,并将结果附加到一个portlet容器中,就在搜索条件的输入字段下方(如上所述)。 环境-JSP、JAVA和标记库 搜索页面基本上由几个JSP页面组成,这些页面引用了无数的标记库 返回搜索结果(AJAX)后,portlet iframe应根据新高度重新调整大小。一个名为setContainerHeight的javascript方法(驻留在其中一个标记库中)是重新调整大小的原因 问题- Internet Explorer不调用我的JS方法,它会重新调整
function setContainerHeight() {
//reset the height to shrink the scroll height for the usecase where the portlet's contents got smaller.
getPortlet().style.height = '${frameHeight}px';
getPortlet().height = '${frameHeight}px';
try {
height = getFrameHeight(getPortlet());
} catch (e) {
//fallback for crossdomain permission problems.
height = '${frameHeight}';
}
//set the portlet & portlet container to be the same height - not using 100% for the portlet to avoid the inner scrollbar
try {
getPortletContainer().style.height = height + 'px';
} catch ( ex ) {
// do nothing, we can't get to the container
}
getPortlet().style.height = (height + getHorScrollBarHeight()) + 'px';
getPortlet().height = (height + getHorScrollBarHeight()) + 'px';
}
这是调用这个方法的代码部分-
/* resizes the portlet container to fit the size of the porlet. */
function resizePortletContainer() {
if (hasContainerHeightChanged()) {
saveScrollPosition();
setContainerHeight();
restoreScrollPosition();
}
//width handling needs some work
//if (hasContainerWidthChanged()) {
//setContainerWidth();
//}
}
//registering event handlers...
var frame = getPortlet();
var prevPortletLoadEvent = frame.onload ? frame.onload : function () {};
frame.onload = function () {prevPortletLoadEvent(); resizePortletContainer(); };
var prevPortletResizeEvent = frame.onresize ? frame.onresize : function () {};
var onresize = function () {prevPortletResizeEvent(); resizePortletContainer(); };
再多了解一点-
将警报语句放在上面的注册事件处理程序代码之后;我注意到IE和Firefox都只调用了这部分代码一次(在这两种情况下,当初始搜索屏幕显示到浏览器时,我的警报框都只触发了一次)。因此,这让我相信,出于某种原因,只有Firefox喜欢我用来注册事件的上述代码;IE可能正在寻找一种不同的方法来注册此事件
我怀疑下面的帖子可能对我寻找这个问题的答案有用--
我在另一篇文章中找到了答案,但本质上问题在于Internet Explorer注册iframe事件的方式与所有其他浏览器不同。
这也是一个很好的帖子,你可以看看- 下面列出了我用来解决这个问题的代码。我希望这能帮助我遇到类似问题的其他人 我必须对浏览器发出的请求做一个简单的检查,下面看到的两个条件块做了相同的事情,只是IE.Good'ol IE.LoL的语法不同
//Microsoft Internet Explorer Browser - iFrame event register
if (navigator.appName.indexOf("Microsoft") != -1) {
var frame = getPortlet();
var prevPortletLoadEvent = frame.onload ? frame.onload : function () {};
var refresh = function() { prevPortletLoadEvent(); resizePortletContainer(); };
if(frame.attachEvent) frame.attachEvent('onload', refresh);
else frame.addEventListener('load', refresh, false);
}
//All other major browsers - iFrame event register
else {
var frame = getPortlet();
var prevPortletLoadEvent = frame.onload ? frame.onload : function () {};
frame.onload = function () {prevPortletLoadEvent(); resizePortletContainer(); };
var prevPortletResizeEvent = frame.onresize ? frame.onresize : function () {};
var onresize = function () {prevPortletResizeEvent(); resizePortletContainer(); };
}
您是否也可以在调用此方法的位置发布代码?在IE中运行页面时,您是否检查了控制台中的错误?由于语法错误或不支持的函数调用,很多时候在某些浏览器中神奇地工作的代码会在IE中崩溃。Ravi或jbabey-我几乎可以肯定我的问题是如何注册iframe事件。IE不喜欢我上面使用的方法。我看过一些帖子,看起来IE想让我使用“attachEvent”或“addEventListener”?我的这些想法对吗?