Select2 Event for creating a new tag

前端 未结 3 1180
闹比i
闹比i 2021-01-01 15:58

I\'m using the jQuery Select2 (v4) plugin for a tag selector.

I want to listen for when a new tag is created in the select element and fire an ajax request to store

相关标签:
3条回答
  • 2021-01-01 16:14

    The only event listener that worked for me when creating a new tag was:

    .on("select2:close", function() {
     (my code)
    })
    

    This was triggered for new tags and selecting from the list. change, select2:select, select2:selecting and any others did not work.

    0 讨论(0)
  • 2021-01-01 16:19

    I can't find any native method unfortunately. But if you're interested in simple "workarounds", maybe this get you closer:

    $('.select2').select2({
        tags: true,
        tokenSeparators: [",", " "],
        createTag: function (tag) {
            return {
                id: tag.term,
                text: tag.term,
                // add indicator:
                isNew : true
            };
        }
    }).on("select2:select", function(e) {
        if(e.params.data.isNew){
            // append the new option element prenamently:
            $(this).find('[value="'+e.params.data.id+'"]').replaceWith('<option selected value="'+e.params.data.id+'">'+e.params.data.text+'</option>');
            // store the new tag:
            $.ajax({
                // ... 
            });
        }
    });
    

    DEMO


    [EDIT]
    (Small update: see @Alex comment below)

    The above will work only if the tag is added with mouse. For tags added by hitting space or comma, use change event.

    Then you can filter option with data-select2-tag="true" attribute (new added tag):

    $('.select2').select2({
        tags: true,
        tokenSeparators: [",", " "]
    }).on("change", function(e) {
        var isNew = $(this).find('[data-select2-tag="true"]');
        if(isNew.length && $.inArray(isNew.val(), $(this).val()) !== -1){
            isNew.replaceWith('<option selected value="'+isNew.val()+'">'+isNew.val()+'</option>');
            $.ajax({
                // ... store tag ...
            });
        }
    });
    

    DEMO 2

    0 讨论(0)
  • 2021-01-01 16:29

    Another workaround. Just insert it to the beginning:

               }).on('select2:selecting', function (evt) {
    
                 var stringOriginal = (function (value) {
                    // creation of new tag
                    if (!_.isString(value)) {
                        return  value.html();
                    }
                    // picking existing
                    return value;
                })(evt.params.args.data.text);
                ........
    

    It relies on underscore.js for checking if it's string or not. You can replace _.isString method with whatever you like.

    It uses the fact that when new term is created it's always an object.

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