insertBefore和IE7

时间:2011-01-19 14:10:40

标签: javascript internet-explorer internet-explorer-7

首先道歉,我处理密码后面的页面,我希望这已经足够了,但如果你想要更多的代码,那就问问吧!

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

添加新活动时,我会找到它应放置的位置并使用:

document.getElementById('eventRows').insertBefore(div, document.getElementById('eventRow' + id));

div是新的事件行,id是我想要插入的事件的id!

这在Chrome,Safari,Firefox和IE8中完美运行,但在IE7中出错了 - 新的事件行似乎放置正确,但是围绕它的行没有正确地移开,留下了混乱的文字。

过了一会儿,我发现这可以在插入后使用代码修复:

$('eventRows').innerHTML = $('eventRows').innerHTML;

所以我几乎已经解决了,但我对以下问题的想法不是很满意:

我应该这样做,因为它似乎有用吗?

如果浏览器是IE7,我应该这样做吗?

我应该找到更好的解决办法吗?

非常感谢

本。

2 个答案:

答案 0 :(得分:1)

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

  • 您描述的那个
  • 据报道
  • 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_redraw插件:http://plugins.jquery.com/content/forceredraw-102。我确定还有其他人,我只是不知道他们。

答案 1 :(得分:0)

经过多次演奏后,我已经满足以下要求:

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

许多其他想法几乎有效,但并不完全,填充想法曾经工作过一次,但是在超时时引起了一次令人讨厌的跳跃,这似乎没有任何关于性能的问题 - 所以为什么不呢! : - )

感谢您的帮助!!