说我有这个:
<div id="controller">
<div id="first">1</div>
<div id="second>2</div>
</div>
Run Code Online (Sandbox Code Playgroud)
但是我想根据我提供的索引任意插入一个新的div.
假设我给索引插入0,结果应该是:
<div id="controller">
<div id="new">new</div>
<div id="first">1</div>
<div id="second">2</div>
</div>
Run Code Online (Sandbox Code Playgroud)
如果我有一个插入2的索引,结果将是.
<div id="controller">
<div id="first">1</div>
<div id="second">2</div>
<div id="new">new</div>
</div>
Run Code Online (Sandbox Code Playgroud)
如果我给索引1,结果将是:
<div id="controller">
<div id="first">1</div>
<div id="new">new</div>
<div id="second">2</div>
</div>
Run Code Online (Sandbox Code Playgroud)
忘记最后一个例子的格式.在这个网站上复制和粘贴HTML代码的简单行为非常可怕,让我发出尖叫声并拉出我的头发,我不想再浪费时间了!
And*_*ell 77
作为一个更好处理0的函数:
function insertAtIndex(i) {
if(i === 0) {
$("#controller").prepend("<div>okay things</div>");
return;
}
$("#controller > div:nth-child(" + (i) + ")").after("<div>great things</div>");
}
Run Code Online (Sandbox Code Playgroud)
编辑:在第n个子选择器中添加括号以避免NaN错误.@hofnarwillie
function insertAtIndex(i) {
if(i === 0) {
$("#controller").prepend("<div>okay things</div>");
return;
}
$("#controller > div:nth-child(" + (i) + ")").after("<div>great things</div>");
}
window.doInsert = function(){
insertAtIndex(2);
}Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="controller">
<div>Item 1</div>
<div>Item 2</div>
<div>Item 4</div>
<div>Item 5</div>
</div>
<button onclick="doInsert()">Insert "great things" at index 2.</button>Run Code Online (Sandbox Code Playgroud)
小智 53
我遇到了类似的问题.不幸的是,没有一个解决方案适合我.所以我这样编码:
jQuery.fn.insertAt = function(index, element) {
var lastIndex = this.children().size();
if (index < 0) {
index = Math.max(0, lastIndex + 1 + index);
}
this.append(element);
if (index < lastIndex) {
this.children().eq(index).before(this.children().last());
}
return this;
}
Run Code Online (Sandbox Code Playgroud)
问题的例子:
$("#controller").insertAt(0, "<div>first insert</div>");
$("#controller").insertAt(-1, "<div>append</div>");
$("#controller").insertAt(1, "<div>insert at second position</div>");
Run Code Online (Sandbox Code Playgroud)
以下是我的单元测试中的一些示例:
$("<ul/>").insertAt(0, "<li>0</li>");
$("<ul/>").insertAt(0, "<li>0</li>").insertAt(1, "<li>1</li>");
$("<ul/>").insertAt(-1, "<li>-1</li>");
$("<ul/>").insertAt(-1, "<li>-1</li>").insertAt(0, "<li>0</li>");
$("<ul/>").insertAt(0, "<li>0</li>").insertAt(-1, "<li>-1</li>");
$("<ul/>").insertAt(-1, "<li>-1</li>").insertAt(1, "<li>1</li>");
$("<ul/>").insertAt(-1, "<li>-1</li>").insertAt(99, "<li>99</li>");
$("<ul/>").insertAt(0, "<li>0</li>").insertAt(2, "<li>2</li>").insertAt(1, "<li>1</li>");
$("<ul/>").insertAt(0, "<li>0</li>").insertAt(1, "<li>1</li>").insertAt(-1, "<li>-1</li>");
$("<ul/>").insertAt(0, "<li>0</li>").insertAt(1, "<li>1</li>").insertAt(-2, "<li>-2</li>");
$("<ul/>").insertAt(0, "<li>0</li>").insertAt(1, "<li>1</li>").insertAt(-3, "<li>-3</li>");
$("<ul/>").insertAt(0, "<li>0</li>").insertAt(1, "<li>1</li>").insertAt(-99, "<li>-99</li>");
Run Code Online (Sandbox Code Playgroud)
编辑:它现在优雅地处理所有负面的indizes.
使用我的简单插件Append With Index :
$.fn.appendToWithIndex=function(to,index){
if(! to instanceof jQuery){
to=$(to);
};
if(index===0){
$(this).prependTo(to)
}else{
$(this).insertAfter(to.children().eq(index-1));
}
};*
Run Code Online (Sandbox Code Playgroud)
现在:
$('<li>fgdf</li>').appendToWithIndex($('ul'),4)
Run Code Online (Sandbox Code Playgroud)
要么 :
$('<li>fgdf</li>').appendToWithIndex('ul',0)
Run Code Online (Sandbox Code Playgroud)
我发现列出的解决方案不起作用或过于复杂.您所要做的就是确定您要追加的方向.这是一个简单的以OOP方式为jQuery编写的东西.
$.fn.insertIndex = function (i) {
// The element we want to swap with
var $target = this.parent().children().eq(i);
// Determine the direction of the appended index so we know what side to place it on
if (this.index() > i) {
$target.before(this);
} else {
$target.after(this);
}
return this;
};
Run Code Online (Sandbox Code Playgroud)
您只需使用一些简单的语法即可使用上述内容.
$('#myListItem').insertIndex(2);
Run Code Online (Sandbox Code Playgroud)
目前在可视化编辑器项目中使用它可以通过拖放移动大量数据.一切都很好.
编辑:我添加了一个实时交互式CodePen演示,您可以在其中使用上述解决方案http://codepen.io/ashblue/full/ktwbe