jQuery插入div作为特定的索引

说我有这个:

<div id="controller"> <div id="first">1</div> <div id="second>2</div> </div> 

但是说我想根据我提供的索引任意插入一个新的div。

说我给索引插入0,结果应该是:

 <div id="controller"> <div id="new">new</div> <div id="first">1</div> <div id="second">2</div> </div> 

如果我有一个索引插入2的结果将是。

 <div id="controller"> <div id="first">1</div> <div id="second">2</div> <div id="new">new</div> </div> 

如果我给一个1的索引,结果将是:

 <div id="controller"> <div id="first">1</div> <div id="new">new</div> <div id="second">2</div> </div> 

只是忘记最后一个例子的格式。 在这个网站上复制和粘贴HTML代码的简单行为足以让我尖叫,把我的头发拉出来,我不想再花时间搞这个了!

作为一个更好的处理0的函数:

 function insertAtIndex(i) { if(i === 0) { $("#controller").prepend("<div>okay things</div>"); return; } $("#controller > div:nth-child(" + (i) + ")").after("<div>great things</div>"); } 

编辑:添加括号中的第n个孩子select器,以避免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); } 
 <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> 

我有一个类似的问题。 不幸的是没有解决scheme为我工作。 所以我这样编码:

 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; } 

问题的例子:

 $("#controller").insertAt(0, "<div>first insert</div>"); $("#controller").insertAt(-1, "<div>append</div>"); $("#controller").insertAt(1, "<div>insert at second position</div>"); 

以下是我的单位testing中的一些例子:

 $("<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>"); 

编辑:它现在优雅地处理所有负面指示。

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

现在:

 $('<li>fgdf</li>').appendToWithIndex($('ul'),4) 

要么 :

 $('<li>fgdf</li>').appendToWithIndex('ul',0) 

我发现列出的解决scheme没有工作或过于复杂。 你所要做的就是确定你所追加的方向。 这里有一些简单的用jQuery编写的OOP方式。

 $.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; }; 

你可以简单地使用上面的一些简单的语法。

 $('#myListItem').insertIndex(2); 

目前在一个可视化编辑器项目上使用这个工具,通过拖放来移动大量的数据。 一切都很好。


编辑:我已经添加了一个实时互动CodePen演示,你可以玩上述解决schemehttp://codepen.io/ashblue/full/ktwbe

 //jQuery plugin insertAtIndex included at bottom of post //usage: $('#controller').insertAtIndex(index,'<div id="new">new</div>'); //original: <div id="controller"> <div id="first">1</div> <div id="second>2</div> </div> //example: use 0 or -int $('#controller').insertAtIndex(0,'<div id="new">new</div>'); <div id="controller"> <div id="new">new</div> <div id="first">1</div> <div id="second>2</div> </div> //example: insert at any index $('#controller').insertAtIndex(1,'<div id="new">new</div>'); <div id="controller"> <div id="first">1</div> <div id="new">new</div> <div id="second>2</div> </div> //example: handles out of range index by appending $('#controller').insertAtIndex(2,'<div id="new">new</div>'); <div id="controller"> <div id="first">1</div> <div id="second>2</div> <div id="new">new</div> </div> /**! * jQuery insertAtIndex * project-site: https://github.com/oberlinkwebdev/jQuery.insertAtIndex * @author: Jesse Oberlin * @version 1.0 * Copyright 2012, Jesse Oberlin * Dual licensed under the MIT or GPL Version 2 licenses. */ (function ($) { $.fn.insertAtIndex = function(index,selector){ var opts = $.extend({ index: 0, selector: '<div/>' }, {index: index, selector: selector}); return this.each(function() { var p = $(this); var i = ($.isNumeric(opts.index) ? parseInt(opts.index) : 0); if(i <= 0) p.prepend(opts.selector); else if( i > p.children().length-1 ) p.append(opts.selector); else p.children().eq(i).before(opts.selector); }); }; })( jQuery ); 

如果你需要做很多,你可以把它包装在一个小函数中:

 ​var addit = function(n){ $('#controller').append('<div id="temp">AAA</div>') .stop() .children('div:eq('+n+')') .before( $('#temp') ); } addit(2); // adds a new div at position 2 (zero-indexed) addit(10); // new div always last if n greater than number of divs addit(0); // new div is the only div if there are no child divs 

如果您担心该临时ID,则可以添加最后一步将其删除。

编辑:更新处理零子的情况,并指定n >当前的div数。

这个最适合我,

 function SetElementIndex(element, index) { var Children = $(element).parent().children(); var target = Children[index]; if ($(element).index() > index) { if (target == null) { target = Children[0]; } if (target != element && target != null) { $(target).before(element); } } else { if (target == null) { target = Children[Children.length - 1]; } if (target != element && target != null) { $(target).after(element); } } }; 

你总是可以使用prepend('#div');

恩。

 $(document).ready(function(){ $('#first').prepend('<div id="new">New</div>'); });​ 

那会在“#first”之前加上“#new”不知道这是不是你想要的。