Javascript 在Internet Explorer中注册iframe事件

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方法,它会重新调整

我有一个web应用程序,它允许用户输入搜索条件,并将结果附加到一个portlet容器中,就在搜索条件的输入字段下方(如上所述)。 环境-JSP、JAVA和标记库 搜索页面基本上由几个JSP页面组成,这些页面引用了无数的标记库

返回搜索结果(AJAX)后,portlet iframe应根据新高度重新调整大小。一个名为setContainerHeight的javascript方法(驻留在其中一个标记库中)是重新调整大小的原因

问题-

Internet Explorer不调用我的JS方法,它会重新调整大小

我怀疑下面的帖子可以帮助解决这个问题。

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可能正在寻找一种不同的方法来注册此事件

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


我在另一篇文章中找到了答案,但本质上问题在于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”?我的这些想法对吗?