2016-02-17 67 views
2

正如你在这个https://jsfiddle.net/yxvwfh6x/中看到的,我试图在div之后添加一个元素。jQuery insertBefore()insertAfter()之后

var hi = $('<h1>Hi</h1>'); 
var div = $('div'); 
hi.insertAfter(div); 
hi.insertBefore(div); 

在结果insertBefore删除最后Hi。请尝试使用此代码来了解正在发生的事情。

var hi = $('<h1>Hi</h1>'); 
var div = $('div'); 
hi.insertAfter(div); 
setTimeout(function(){ 
    hi.insertBefore(div); 
},1000); 

这是jQuery的bug吗?

回答

2

因为hi是指同一个对象,所以下面的序列之后是

  • 第一后加入 - > HI1
  • 后第二相加克隆副本 - > HI2
  • 第一和前添加后移除第一。 - > HI2
  • 增加了一个克隆副本前第二 - > HI3

用这个代替

var div = $('div'); 
$('<h1>Hi</h1>').insertAfter(div); 
$('<h1>Hi</h1>').insertBefore(div); 
+0

这个什么https://jsfiddle.net/yxvwfh6x/2/ 作为你的答案,应该删除所有嗨,然后在第一个元素之前添加 –

+0

@MohammadRezaei它将最后一个克隆的节点添加到div2之后并放置在div1之前。再次检查我的解释。 – gurvinder372

+0

@MohammadRezaei更新了解释以解释克隆和未克隆节点的概念。 – gurvinder372

0
<div class="inner">1</div> 
<div class="inner">2</div> 


$("<h1>Hi</h1>").insertBefore(".inner"); 
$("<h1>Hi</h1>").insertAfter(".inner"); 

试试这个希望它有助于 的jsfiddle:https://jsfiddle.net/ssuryar/336z5pnt/2/

1

不,这是而不是jQuery的bug。这是因为在执行语句后,现在在DOM中第一次引用'<h1>Hi</h1>'。所以,你可以这样改:

var h1Text = '<h1>Hi</h1>'; 
var div = $('div'); 
$(h1Text).insertAfter(div); 
$(h1Text).insertBefore(div); 

或者你也可以与您现有的代码中使用clone()

var hi = $('<h1>Hi</h1>'); 
var div = $('div'); 
hi.insertAfter(div); 
hi.clone().insertBefore(div); 
1
<script> 
var div = $('div'); 
div.insertAfter(div); 
div.insertBefore(div); 
</script>