2011-04-02 33 views
2

自昨天以来,我一直在玩这个问题。我似乎无法找到解决办法。Internet Explorer:复制/克隆孩子到阵列

问题:

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

愿望上述无序列表保存到数组当文件使用javascript/jQuery是准备就绪。

在Internet Explorer 8中

someArray = $("ul").children() 

在$(文件)。就绪()这样做,阵列将有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。它适用于第一个呼叫,但在第二次调用,它将从目前的UI元素的列表

原创要素:猫,狗蝙蝠, 食人魔在IE 第一个呼叫:猫,狗, 在IE第二个电话:空数组

我曾尝试克隆与$ .extend的阵列,它似乎并没有帮助。有没有一种方法可以保存原始UL中的子节点列表,而不是通过IE更改它们?

看来,IE使用指针引用,当我救子节点放入数组

+0

那是什么语言?因为'result = someArray与索引0和n-2的元素'不是JavaScript。 – 2011-04-02 15:29:44

+0

只是解释..并不意味着它是一个合适的代码。 它与从0到n-2迭代someArray相同,因为n是数组的长度。 for(i = 0; i Kyle 2011-04-02 15:35:28

+0

但你说*“上面的代码完全适用于Chrome和Firefox ......”*你可以看看为什么我认为这是实际的代码。 – 2011-04-02 15:38:23

回答

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

0

在更jQuery的安永方式:

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

alert(animals); 

Live example

我认为你的问题是你的原始代码指向原始列表,并且你正在改变它的其他地方。