我有一个 Web 应用程序,它允许用户输入搜索条件,结果会附加到搜索条件的输入字段正下方的 portlet 容器(如上所述)。环境 - JSP、JAVA 和 TAG 库 搜索页面本质上由几个 JSP 页面组成,这些页面引用了无数的标签库。
返回搜索结果 (AJAX) 后 - portlet iframe 应根据新高度重新调整大小。调用的 JavaScript 方法(驻留在其中一个标记库中)setContainerHeight
是重新调整大小的原因。
问题 -
Internet Explorer 不会调用我的 JS 方法来重新调整大小!
我怀疑下面的帖子可以帮助解决这个问题。 Javascript IE 事件
Chrome、Firefox、Opera……都可以!
因为我不能明确地告诉页面刷新(我将失去我的搜索条件参数),我也不能明确地检查什么类型的浏览器正在发出请求(我的 JavaScript 没有被调用);如何在回调后明确告诉页面调用我的 resize 方法?
万一有人好奇——这是我重新调整大小的方法:
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 也许正在寻找一种不同的方法来注册这个事件?
我怀疑下面的帖子可能对我寻找这个问题的答案有用——