jQuery将div作为特定索引插入

Dan*_*Man 70 jquery

说我有这个:

<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)

  • `eq(i)`与`nth-child("+ i - 1 +")`的用途是否相同? (3认同)
  • 你可能想使用 [`.before()`](http://api.jquery.com/before/),而不是 [`.append()`](http://api.jquery.com/append/ );) (2认同)
  • 您应该使用`$("#controller> div:nth-​​child("+ i +")").before("<div> great things </ div>");`因为否则新元素可能会插入多个在##controller`的孩子的孩子们中间 (2认同)

小智 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.

  • var lastIndex = this.children().size(); 不再起作用 - 使用 this.children().length; 反而。 (2认同)

Abd*_*UMI 6

使用我的简单插件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)


Ash*_*lue 6

我发现列出的解决方案不起作用或过于复杂.您所要做的就是确定您要追加的方向.这是一个简单的以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