Javascript insertBefore和IE7

Javascript insertBefore和IE7,javascript,internet-explorer,internet-explorer-7,Javascript,Internet Explorer,Internet Explorer 7,首先,我要道歉,我正在处理一个隐藏密码的页面,我希望这足够了,但是如果你想要更多的代码,尽管问吧 我有一个列出事件的网页,每个事件都是一组复杂的元素,都包装在一个相对定位的div中,一个eventRow 添加新事件时,我会找到它应该放置和使用的位置: document.getElementById('eventRows').insertBefore(div, document.getElementById('eventRow' + id)); div是新的事件行,id是我要插入的事件的id 这

首先,我要道歉,我正在处理一个隐藏密码的页面,我希望这足够了,但是如果你想要更多的代码,尽管问吧

我有一个列出事件的网页,每个事件都是一组复杂的元素,都包装在一个相对定位的div中,一个eventRow

添加新事件时,我会找到它应该放置和使用的位置:

document.getElementById('eventRows').insertBefore(div, document.getElementById('eventRow' + id));
div是新的事件行,id是我要插入的事件的id

这在Chrome、Safari、Firefox和IE8中非常有效,但在IE7中出现了错误——新的事件行似乎放置正确,但其周围的行没有正确移动,留下了混乱的重叠文本

过了一段时间,我发现这是可以修复的,插入后,使用代码:

$('eventRows').innerHTML = $('eventRows').innerHTML;
所以我几乎解决了它,但我不太高兴,对以下问题有什么想法:

我是不是应该照它看起来的那样做

我应该只在浏览器是IE7时才这样做吗

我应该找一个更好的解决办法吗

非常感谢


Ben.

您可以尝试强制重新绘制。我可以想到以下几种方法:

  • 你描述的那个
  • node.className=node.className
    报告可以工作,尽管我从未尝试过
  • 附加文本节点
  • 添加一个类,然后将其删除
  • 进行其他样式更改,然后删除它们(填充、边框、边距)
附加文本节点:

function redraw(node) {
  var doc = node.ownerDocument;
  var text = doc.createTextNode(' ');
  node.appendChild(text);
  setTimeout(function() {
    node.removeChild(text);
  },0);
}
添加/删除类

function redraw(node) {
  node.className += ' redraw';
  setTimeout(function() {
    node.className = node.className.replace(/\sredraw$/, '');
  }, 0);
}
此代码未经测试,因为我没有IE7


这些方法也存在于各种库中。对于Ext,它是
Element.repaint()
。jquery有一个force_重画插件:。我肯定还有其他人,我只是不知道他们。

玩了很多之后,我选择了以下几点:

function redrawElement(e) {
    if (/MSIE (\d+\.\d+);/.test(navigator.userAgent) && new Number(RegExp.$1) <= 7) {
        e.innerHTML = e.innerHTML
    }
}
函数重绘元素(e){

如果(/MSIE(\d+\.\d+)/.test(navigator.userAgent)和new Number(RegExp.$1),我认为您在上面的第一个jQuery示例中缺少了一个结束语
。这就是这里的情况,还是在您的代码中也是如此?非常正确-为了清晰起见,我删减了代码-我编辑了问题我测试了您的所有建议,所有这些都有效(包括className=className)除了一个例外-我有一个绝对定位复选框(不是唯一的AP div)除非我使用innerHTML=innerHTML,否则它不会出现-那么我应该坚持使用它吗?我应该过滤掉工作的浏览器吗?@Ben我读过AP divs可能是个问题。我记得看到了一个解决方案。让我看看。@Ben你有没有查看过声明的源代码是
残忍的
(添加然后删除填充)方法将处理绝对定位的节点。如果您尝试过这种方法(可能是带有边距的版本),那么我认为您应该坚持使用
innerHTML
方法,但如果您有性能问题,我只会过滤掉工作的浏览器。