如何修改jquery tag-it插件:限制标签数量并仅允许可用标签

kas*_*ans 13 jquery jquery-ui tag-it

如何修改tag-it ui插件https://github.com/aehlke/tag-it(版本v2.0),因此它只允许选择x个标签以及如何仅允许"availableTags"中的标签-选项"?

这个问题(或者它的第一部分)在过去已经被问过和aswerd,但是对于以前版本的插件.

kas*_*ans 14

首先将自定义选项(maxTags和onlyAvailableTags)添加到插件文件中,如此...

options: {
            itemName          : 'item',
            fieldName         : 'tags',
            availableTags     : [],
            tagSource         : null,
            removeConfirmation: false,
            caseSensitive     : true,
            maxTags           : 9999,//maximum tags allowed default almost unlimited
            onlyAvailableTags : false,//boolean, allows tags that are in availableTags or not 
            allowSpaces: false,
            animate: true,
            singleField: false,
            singleFieldDelimiter: ',',
            singleFieldNode: null,
            tabIndex: null,
            onTagAdded  : null,
            onTagRemoved: null,
            onTagClicked: null
        }
Run Code Online (Sandbox Code Playgroud)

接下来用这个替换_isNew函数......

_isNew: function(value) {
            var that = this;
            var isNew = true;
            var count = 0;
            this.tagList.children('.tagit-choice').each(function(i) {
                count++;

                if (that._formatStr(value) == that._formatStr(that.tagLabel(this))|| count >= that.options.maxTags) {
                    isNew = false;
                    return false;
                }
                if (that.options.onlyAvailableTags && $.inArray(that._formatStr(value),that.options.availableTags)==-1) {
                    isNew = false;
                    return false;
                }

            });
            return isNew;
        }
Run Code Online (Sandbox Code Playgroud)

现在,您可以在初始化tagit时使用这些选项.只允许使用sampleTag,最多包含3个标签

$(function(){
            var sampleTags = ['php', 'coldfusion', 'javascript', 'asp', 'ruby', 'python'];

            //-------------------------------
            // Tag events
            //-------------------------------
            var eventTags = $('#s_tags');
            eventTags.tagit({
                availableTags: sampleTags,
                caseSensitive: false,
                onlyAvailableTags: true,
                maxTags:3,

            })

        });
Run Code Online (Sandbox Code Playgroud)

  • 不知何故,这个解决方案仍然允许我的第一个标签不包含在可用标签中. (3认同)

Jac*_*mes 7

您只需将此参数提供给.tagit即可:

beforeTagAdded: function(event, ui) {
  if($.inArray(ui.tagLabel, availableTags)==-1) return false;
}
Run Code Online (Sandbox Code Playgroud)

其中availableTags是您的自动完成数组.


关于下面的@snuggles查询,我相信(尽管我对json协议的熟悉程度有限),你可能会做这样的事情:

//define autocomplete source
var returnedUsers, jsonUrl = "http://[your server]/user_lookup";
$.getJSON(jsonUrl,function(json){
        returnedUsers = json; // or whatever handler you need to use               
}); 

// instantiate tagit

$("#ccList").tagit({
     availableTags: returnedUsers,
     beforeTagAdded: function(event, ui) { 
     // only allow existing values
     if($.inArray(ui.tagLabel, returnedUsers)==-1) return false;
     // limit length
     if ($(".tagit-choice").length >= 5) return false;
});
Run Code Online (Sandbox Code Playgroud)