2014-02-08 74 views
0

获取一些怪异的行为有一段代码,应该做的简单的DOM操作:insertAfter,然后删除以前的元素

b.detach(); 
b.insertAfter(a); 
a.remove(); 

最初的HTML看起来像

<a> 
    <b> </b> 
</a> 

(如果它的事项,我使用b.wrap('<a></a>')构建它)

之后代码运行它应该a后移动b

<a></a> 
<b></b> 

然后取出a

<b></b> 

但事实并非如此。相反a仍然存在,并b就会消失。任何想法可能是错误的?

我试着用after()代替,倒车争论,但得到了同样的结果。

回答

1

我不知道你的意思,如果我尝试它,它的工作原理,你想要的方式:

http://jsfiddle.net/8wy7v/

HTML:

<div id="test"> 
    <a> 
     Test <b>Test</b> 
    </a> 
</div> 

<button id="change_dom">manipulate</button> 
<br /> 
<textarea id="result"></textarea> 

JS:

$(document).ready(function(){ 
    $('#change_dom').click(function(){ 
     var a = $('a'), 
      b = $('b'); 

     b.detach(); 
     b.insertAfter(a); 
     a.remove(); 

     $('#result').val($('#test').html()); 
    }); 
}); 

更新:

这是它如何能够在这个小提琴描述的场景来完成:http://jsfiddle.net/8wy7v/1/

var list = b.parents('ul') 
b.insertAfter(list); 
list.remove(); 
+0

你好这是奇怪的:)我已经更新了你的提琴,以反映我的实际代码 - http://jsfiddle.net/8wy7v/1/和它有同样的问题 – thelolcat

+0

这奇怪了。看起来,只要你调用'wrap',变量'a'就不再包含'ul'和'li'元素。我会更新我的答案以及如何解决它,但我不知道为什么它不起作用。 –

+0

确定这样wrap()是问题:/谢谢!我替换insertAfter的组合包()和追加,这工作太 – thelolcat

1

删除b.detach() b.insertAfter(a)的将其移动

1

的原因是wrap确实克隆的元素 - 所以什么是a引用从未实际上包含b。顺便说一句,该detach是多余的,因为元件将当在DOM别处插入被自动删除。

因此,要获取要插入的a,您需要重新选择它(例如通过b.parent())。

+0

感谢的解释,好知道。我认为wrap()会成为'a.insertAfter(b)的快捷方式; a.find('li')。append(b);':) – thelolcat

相关问题