浅谈 IE下innerHTML导致的问题

先来看个demo吧:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html>
<html>
<head>
    <meta charset=" utf-8">
    <meta name="author" content="http://www.softwhy.com/" />
    <title>蚂蚁部落</title>
    <script type="text/javascript">
        window.onload = function() {
            var obox = document.getElementById("box");
            var lis = obox.getElementsByTagName("li");
            var obt = document.getElementById("bt");
 
            var theArray = [];
            for (var index = 0; index < lis.length; index++) {
                theArray.push(lis[index]);
            }
 
            function randomSort(a, b) {
                return Math.random() > 0.5 ? -1 : 1;
            }
            obt.onclick = function() {
                obox.innerHTML = "";
                var newArray = theArray.sort(randomSort);
                for (var i = 0; i < newArray.length; i++) {
                    obox.appendChild(newArray[i]);
                }
            }
        }
    </script>
</head>
 
<body>
    <ul id="box">
        <li>蚂蚁部落一</li>
        <li>蚂蚁部落二</li>
        <li>蚂蚁部落三</li>
        <li>蚂蚁部落四</li>
        <li>蚂蚁部落五</li>
    </ul>
    <input type="button" id="bt" value="查看效果" />
</body>
</html>

可以在IE下测试效果,推荐IE10,IE11浏览本页。

测试区
-
  • 蚂蚁部落一
  • 蚂蚁部落二
  • 蚂蚁部落三
  • 蚂蚁部落四
  • 蚂蚁部落五

chrome,firefox,safari 下没问题,可是IE所有版本下运行都不行。

这个是一哥们 落叶 在写demo的时候发现的,他说这个在IE下有问题,我测试了下,确实就IE这个老变态不行。
于是我监视了下 theArray 这个数组,发现当  obox.innerHTML = "";  执行后,
IE 下 theArray 数组的 li 的内容被清空了,但是 li 节点还在。

在chrome下不受影响。

这个问题就纠结了,我也不知道为什么,谷歌找了半个小时也没找到,或者我找的关键词不对。
我只能给个简单的解决方法,就是克隆一份 li,并且在 appendChild 的时候,也克隆一份副本进去,这样才能确保正确。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<!DOCTYPE html>
<html>
<head>
    <meta charset=" utf-8">
    <meta name="author" content="http://www.softwhy.com/" />
    <title>蚂蚁部落</title>
    <script type="text/javascript">
        window.onload = function() {
            var obox = document.getElementById("box");
            var lis = obox.cloneNode(true).getElementsByTagName("li");
            var obt = document.getElementById("bt");
 
            var theArray = [];
            for (var index = 0; index < lis.length; index++) {
                theArray.push(lis[index]);
            }
            function rnd(a, b) {
                return Math.random() > 0.5 ? -1 : 1;
            }
             
            obt.onclick = function() {
                obox.innerHTML = "";
                var newArray = theArray.sort(rnd);
                for (var i=0,l=newArray.length; i&lt;l; i++) {
                    obox.appendChild(newArray[i].cloneNode(true));
                }
            }
        }
    </script>
</head>
 
<body>
    <ul id="box">
        <li>蚂蚁部落一</li>
        <li>蚂蚁部落二</li>
        <li>蚂蚁部落三</li>
        <li>蚂蚁部落四</li>
        <li>蚂蚁部落五</li>
    </ul>
    <input type="button" id="bt" value="查看效果" />
</body>
</html>
测试区
-
  • 蚂蚁部落一
  • 蚂蚁部落二
  • 蚂蚁部落三
  • 蚂蚁部落四
  • 蚂蚁部落五

好了,今天算是水了一篇,如果有大神知道怎么回事的,还望指点一二,小生在此先谢过了。

posted @   楼教主  阅读(4635)  评论(10编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
js output×
点击右上角即可分享
微信分享提示