Changing various id's after cloning in jquery

后端 未结 3 780
离开以前
离开以前 2020-12-06 02:14

I\'m trying to clone a table row and update the multiple id\'s to reflect the input fields. I start by doing this and it works:

$(id).clone().attr(\"id\", \"         


        
相关标签:
3条回答
  • 2020-12-06 02:50

    I have created a generalised solution. The function below will change ids and names of cloned object. In most cases, you will need the row number so Just add "data-row-id" attribute to the object.

    function renameCloneIdsAndNames( objClone ) {
    
        if( !objClone.attr( 'data-row-id' ) ) {
            console.error( 'Cloned object must have \'data-row-id\' attribute.' );
        }
    
        if( objClone.attr( 'id' ) ) {
            objClone.attr( 'id', objClone.attr( 'id' ).replace( /\d+$/, function( strId ) { return parseInt( strId ) + 1; } ) );
        }
    
        objClone.attr( 'data-row-id', objClone.attr( 'data-row-id' ).replace( /\d+$/, function( strId ) { return parseInt( strId ) + 1; } ) );
    
        objClone.find( '[id]' ).each( function() {
    
            var strNewId = $( this ).attr( 'id' ).replace( /\d+$/, function( strId ) { return parseInt( strId ) + 1; } );
    
            $( this ).attr( 'id', strNewId );
    
            if( $( this ).attr( 'name' ) ) {
                var strNewName  = $( this ).attr( 'name' ).replace( /\[\d+\]/g, function( strName ) {
                    strName = strName.replace( /[\[\]']+/g, '' );
                    var intNumber = parseInt( strName ) + 1;
                    return '[' + intNumber + ']'
                } );
                $( this ).attr( 'name', strNewName );
            }
        });
    
        return objClone;
    }
    
    0 讨论(0)
  • 2020-12-06 03:07

    The program will crash as you have it since you're missing a function call.

    Try this instead. Notice the call to find():

    $(id).clone().attr("id", "newId").find("#input_1").attr("id", "input_2");
    

    It will probably be better to reference the clone in a variable first.

    var $clone = $(id).clone();
    
    $clone.attr("id", "newId").find("#input_1").attr("id", "input_2");
    $clone.find("#someElement").attr("id","someElement_2");
    $clone.find("#someOtherElement").attr("id","someOtherElement_2");
    

    You can set the ID attributes one at a time for the descendants of your clone if you wish. If there are several, and if you have a consistent pattern for IDs, you will likely be able to do something a little more automated.


    EDIT:

    Here's an example of automatically updating all the IDs in the $clone.

    Please note that this may not work for you, as it assumes that all the IDs end with a number.

    var $clone = $(id).clone();    // Create your clone
    
          // Get the number at the end of the ID, increment it, and replace the old id
    $clone.attr('id',$clone.attr('id').replace(/\d+$/, function(str) { return parseInt(str) + 1; }) ); 
    
         // Find all elements in $clone that have an ID, and iterate using each()
    $clone.find('[id]').each(function() { 
    
         //Perform the same replace as above
        var $th = $(this);
        var newID = $th.attr('id').replace(/\d+$/, function(str) { return parseInt(str) + 1; });
        $th.attr('id', newID);
    });
    
    0 讨论(0)
  • 2020-12-06 03:07

    I have found when I do a lot of .clone() stuff it is better to use a class rather than an id attribute. This way you can clone, yet reference it by a known entity (the class), and still get unique via an index into the element group via an .eq()

    0 讨论(0)
提交回复
热议问题