2011-04-02 30 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

我認爲你的問題是你的原始代碼指向原始列表,並且你正在改變它的其他地方。