jQuery insert div as certain index

后端 未结 9 686
眼角桃花
眼角桃花 2020-12-07 19:38

Say I have this:

1
2

bu

相关标签:
9条回答
  • 2020-12-07 20:15

    You could always use prepend('#div');

    ex.

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

    That would put "#new" before "#first" Not sure if that's what you want.

    0 讨论(0)
  • 2020-12-07 20:16

    This one works best for me,

    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);
                    }
    
                }
            };
    
    0 讨论(0)
  • 2020-12-07 20:17
    //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 );
    
    0 讨论(0)
  • 2020-12-07 20:20

    If you need to do this a lot, you can wrap it in a little function:

    ​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
    

    If you're concerned about that temporary ID, you can add a final step to remove it.

    Edit: Updated to handle cases of zero children, and specified n > current number of divs.

    0 讨论(0)
  • 2020-12-07 20:25

    I had a similar problem. Unfortunately none of the solutions worked for me. So I coded it this way:

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

    Examples for the problem:

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

    Here are some examples taken from my unittests:

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

    Edit: It handles all negative indizes gracefully now.

    0 讨论(0)
  • 2020-12-07 20:33

    Use .insertAfter():

    $('<div class="new">').insertAfter($('div.first'));
    
    0 讨论(0)
提交回复
热议问题