Internet Explorer:将子项复制/克隆到阵列

时间:2011-04-02 15:15:36

标签: javascript jquery internet-explorer dom

自昨天以来,我一直在玩这个问题。我似乎无法找到解决方案。

问题:

<ul>
<li>Cats</li>
<li>Dogs</li>
<li>Bats</li>
<li>Ogre</li>
</ul>

希望使用javascript / jQuery将文档准备好时将上述无序列表保存到数组中。

使用

执行此操作
someArray = $("ul").children()
在Internet Explorer 8中的$(document).ready()上,该数组将具有li元素但没有innerHTML

就像

<li></li>
<li></li>
...

所以我想我可以将子节点保存到函数myFunc()中的全局数组中。这将确保所有内容都已加载。

/* Global Variable */
var someArray = null;

/* function to be called*/
function myFunc() {
   if (someArray == null) someArray = $("ul").children()
   result = someArray with elements from index 0 and n-2
   $("ul").html();

   $.each(result, function() {
       $("ul").append(this)
   }
}

以上代码适用于chrome和firefox。每次调用myfunc时,新的无序列表将只包含猫和狗。

然而,在IE上,似乎用$(“ul”)改变无序列表.html()也改变了someArray。它适用于第一次调用,但在第二次调用时,它将从当前UL中拉出元素列表

  

原始元素:猫,狗蝙蝠,   食人魔第一次打电话给IE:猫,狗,   第二次调用IE:空数组

我确实尝试使用$ .extend克隆数组,但它似乎没有帮助。有没有办法可以保存原始UL中的子节点列表,而不是通过IE更改它们?

当我将子节点保存到数组

时,似乎IE使用指针引用

2 个答案:

答案 0 :(得分:2)

目前还不清楚你实际上要做什么,但如果你的目标是将这些元素的内容放到一个数组中,那么清除列表,这是一种方法:

// Grab the animals
var animals = [];
$("ul:first").children().each(function() {
  animals.push(this.innerHTML);
});

// Wipe out the list
$("ul").html("");

// Show the result
var index;
for (index = 0; index < animals.length; ++index) {
  display("animals[" + index + "] = '" + animals[index] + "'");
}

Live example

在那个例子中,我只是抓住文档中的第一个ul;显然你想要使用更合适的选择器。

如果您真的想要克隆元素,可以使用DOM cloneNode函数或jQuery的包装器clone

// Grab the animal elements
var animals = [];
$("ul:first").children().each(function() {
  animals.push(this.cloneNode(true));
});

// Wipe out the list
$("ul").html("");

// Show the result
var index;
for (index = 0; index < animals.length; ++index) {
  display("animals[" + index + "] = '" + animals[index].innerHTML + "'");
}

Live example

答案 1 :(得分:0)

以更简洁的方式:

var animals = $("ul").children().map(function(){
      return $(this).text();
}).get();

alert(animals);

Live example

我认为您的问题是您的原始代码指向原始列表,而您正在其他位置更改它。