Как изменить плагин jquery tag-it: ограничить количество тегов и разрешить только доступные теги
Как изменить плагин tag-it ui https://github.com/aehlke/tag-it (версия v2.0) так, чтобы он позволял выбирать только x номеров тегов и как разрешать только те теги, которые находятся в "availableTags" -option"?
этот вопрос (или его первая часть) уже задавался и задавался в прошлом, но для предыдущей версии плагина.
6 ответов
Сначала добавьте пользовательские параметры (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
}
затем замените функцию _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;
}
Теперь вы можете использовать параметры при инициализации tagit. разрешены только выборочные теги с максимум 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,
})
});
Вы можете просто предоставить этот параметр.tagit:
beforeTagAdded: function(event, ui) {
if($.inArray(ui.tagLabel, availableTags)==-1) return false;
}
где 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;
});
Обновление 2013-03-13:
Во-первых, перечитывая ОП, я теперь не понимаю, действительно ли я отвечаю на вопрос, поскольку они специально спросили, как изменить плагин tag-it для выполнения двух настроек. Если ОП действительно хочет изменить плагин, это нормально, но, как я уже говорил, кажется, что вам нехорошо - а вам нет!
Итак, вот как выполнить обе вещи без изменения плагина:)
во-первых, у вас должен быть какой-то глобальный массив для размещения вещей, если есть лучший способ сделать это, lmk, но в противном случае:
var returnUsers = [];
Затем:
$("#ccList").tagit({
autocomplete: {
source: function( request, response ) {
$.ajax({
url: "http://[your server]/user_lookup",
dataType: "json",
data: {
term: request.term
},
success: function( data ) {
returnedUsers = data;
response( $.map( data, function( item ) {
return {
label: item,
value: item
}
}));
},
error: function(xhr, status, error) {
returnedUsers = [];
}
});
}
},
beforeTagAdded: function(event, ui) {
if ($.inArray(ui.tagLabel, returnedUsers)==-1)
return false;
if ($(".tagit-choice").length >= 5)
return false;
}
});
Таким образом, вы должны указать autocomplete.source на функцию, в которой вы обрабатываете все элементы Ajax и создаете свой собственный список. Обратите внимание, что это дает вам некоторую гибкость в том, что вы возвращаете из своего cgi-сервера (т. Е. Это не обязательно должен быть массив строк, это может быть массив хешей, которые вы анализируете и встраиваете в пользовательский список). Также обратите внимание, что в этом не было бы необходимости, если бы я только мог найти способ получить доступ к списку возвращаемых значений из более простой функции автозаполнения в событии beforeTagAdded - то, что Джек подразумевал, было возможно, но не уточняло.
Как только вы построите массив вещей для отображения, вы вернете его с помощью функции response(). В то же время теперь у вас есть копия этого списка в returnUsers, которую вы можете использовать в функции beforeTagAdded. Кроме того, очень просто ограничить количество тегов, которые вы разрешаете в поле, просто посчитав, сколько их уже есть, и вернув false, если это>= для этого числа. Не уверен, что это лучший способ получить счет, но он определенно работает.
Я знаю, что это старо, и я уверен, что любой эксперт найдет миллион способов сделать это лучше, чем я, но я не нашел никого, кто изложил бы, как обойти эту проблему лучше, чем я обрисовал на самом деле без смена плагина, что я не предпочитаю делать. НТН!
jQuery UI Tag-это! @version v2.0 (06/2011).
Перейти к файлу tag-it.js
И найти функцию createTag
И следующий код в начале.
if (that.options.maxTags) {
if ($('.tagit li').length > that.options.maxTags) {
alert('Maxmium ' + that.options.maxTags + ' tags are allowed')
return false;
}
}
И на странице
$("#myTags").tagit({
maxTags: 8
});
Это ограничит теги до 8 тегов. Вы можете изменить число на любое, чтобы ограничить количество тегов.
Найти tagLimit
в tag-it.js и установите число, которым вы хотите ограничить. Я ограничен 5. Значение по умолчанию null
,
removeConfirmation: false, // Require confirmation to remove tags.
tagLimit : 5, -
Я улучшил ответ @kaspers с новой обновленной библиотекой. внести некоторые изменения в библиотеку 1. добавить новую опцию в опции onlyAvailableTags: false,
поставить проверку в методе createTag
if (this.options.onlyAvailableTags &&$.inArray(this._formatStr(value),this.options.autocomplete.source)==-1) { return false; }
затем вызовите tagit, как это. Теперь отметьте это библиотека поддерживает tagsLimit. Поэтому нам не нужно настраивать его.
$(function(){
var sampleTags = ['php', 'coldfusion', 'javascript', 'asp', 'ruby', 'python'];
//-------------------------------
// Tag events
//-------------------------------
var eventTags = $('#s_tags');
eventTags.tagit({
availableTags: sampleTags,
caseSensitive: false,
onlyAvailableTags: true,
tagLimit: 3,
})
});