0

我有一个 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 也许正在寻找一种不同的方法来注册这个事件?

我怀疑下面的帖子可能对我寻找这个问题的答案有用——

Javascript IE 事件

4

1 回答 1

0

我在另一篇文章中找到了答案,但本质上问题在于 Internet Explorer 注册其 iframe 事件的方式与所有其他浏览器不同。
也是一个很好的帖子供您查看 - onload 与 addEventListener('load') 的 iframe 行为

下面列出了我用来解决问题的代码。我希望这可以帮助遇到我遇到类似问题的其他人。

我必须对发出请求的浏览器做一个简单的检查,你在下面看到的 2 个条件块做同样的事情,除了 IE 的语法不同。好'ol IE。哈哈。

//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(); };
}
于 2012-07-03T17:37:21.783 回答