最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

jquery - Javascript - remove specific element from dynamically created array - Stack Overflow

programmeradmin3浏览0评论

I have a page where users can create tags (much like here in stackoverflow), which are then sent(POST) to the back end to be stored in a database. The user can make tags but also remove them before finally hitting Submit.

In the DOM the tags are generated along with an 'x' button. The 'x' button removes the element from the DOM, but the trouble es when removing from the array. The closest I could get to a solution was this question, however I couldn't get it to quite work for me.

Here's the codepen

Here's the javascript (i'm using JQuery)

window.tag_array = [];

$( "#addtag" ).click(function() {

var tag = $("#input-tag").val();

//if tag is empty
if(!$('#input-tag').val()) {

    alert("can't be empty");

    } else {
        //put tag.val into an array         
        tag_array.push(tag);

        //add to DOM
        $( "#tagsbox" )
        .append( "<div class='displaytag'><i>"+tag+"</i><input type='hidden' class='tag' value="+tag+"><button onClick='return false;' class='removetag'>x</button></div>" );

        //reset value in text area to null
        $("#input-tag").val("");

        //remove tag onclick
        $('.removetag').click(function() {
            $(this).parent().remove(); //remove tag from DOM

            //splice from array
            tag_array.splice( this, 1 ); //<--HERE IS PROBLEM (i think)

        });


    } //end else

    alert(tag_array); //check array
});

The end result is the splice takes out too many array items.

I have also tried

tag_array.splice(tag_array.indexOf(tag),1);

to a similar result.

Please help! Thanks in advance

I have a page where users can create tags (much like here in stackoverflow), which are then sent(POST) to the back end to be stored in a database. The user can make tags but also remove them before finally hitting Submit.

In the DOM the tags are generated along with an 'x' button. The 'x' button removes the element from the DOM, but the trouble es when removing from the array. The closest I could get to a solution was this question, however I couldn't get it to quite work for me.

Here's the codepen

Here's the javascript (i'm using JQuery)

window.tag_array = [];

$( "#addtag" ).click(function() {

var tag = $("#input-tag").val();

//if tag is empty
if(!$('#input-tag').val()) {

    alert("can't be empty");

    } else {
        //put tag.val into an array         
        tag_array.push(tag);

        //add to DOM
        $( "#tagsbox" )
        .append( "<div class='displaytag'><i>"+tag+"</i><input type='hidden' class='tag' value="+tag+"><button onClick='return false;' class='removetag'>x</button></div>" );

        //reset value in text area to null
        $("#input-tag").val("");

        //remove tag onclick
        $('.removetag').click(function() {
            $(this).parent().remove(); //remove tag from DOM

            //splice from array
            tag_array.splice( this, 1 ); //<--HERE IS PROBLEM (i think)

        });


    } //end else

    alert(tag_array); //check array
});

The end result is the splice takes out too many array items.

I have also tried

tag_array.splice(tag_array.indexOf(tag),1);

to a similar result.

Please help! Thanks in advance

Share Improve this question edited May 23, 2017 at 11:53 CommunityBot 11 silver badge asked Sep 8, 2014 at 16:20 bjurtownbjurtown 1734 silver badges13 bronze badges
Add a ment  | 

2 Answers 2

Reset to default 5

You should probably use something like .indexOf() to get an index of the element and then splice an array:

tag_array.splice(tag_array.indexOf(elm),1);

Working demo

The splice part is OK. The problem is that you're adding a click callback to .removetag too many times.

Everytime you append a new element, you are adding another click event to every .removetag item that is already on the page.

$('.removetag').click(function()

This way, whenever you click on one element, all the others were assign to fire the click callback too.

Solution

Instead, when creating the tag, set the click event only to the last added .removetag element:

$('.removetag').last().click(function()

Updated CODEPEN

发布评论

评论列表(0)

  1. 暂无评论