Итак, вот мой оригинальный вопрос, но мне показалось, что мне нужно задать отдельный вопрос, так как я не совсем понял, чего я пытаюсь выполнить
Я использую jquery Tag-it plugin https://github.com/aehlke/tag-it и должен связать эти действия с вставками/обновлениями/удалениями базы данных
то, что я пытаюсь предотвратить, - это когда пользователь начинает вводить текст и не выбирает элемент автозаполнения jquery ui и фокусируется на нем путем ввода или клавиши табуляции или щелчка мыши, тэг все еще создается для того, что пользователь набрал... я хочу, чтобы пользователь чтобы иметь возможность выбирать существующие теги из списка автозаполнения jquery ui, никакие другие действия не могут создать новый тег, новые теги будут создаваться отдельно
см. мой код в действии здесь http://jsfiddle.net/jrizzi1/2wjKR/2/
Функция Tag-It имеет методы с событиями pre и post, например: метод CreateTag имеет события beforeTagAdded и AfterTagAdded.
Я размещал свою вкладку db в событии beforeTagAdded, используя ajax $.post, но поскольку тег не должен существовать, я получаю сиротские строки для них (у объекта Entity есть тег "go" для пользователя, в таблице тегов нет тега с именем "идти")
Я думал, что у меня может быть пост ajax, тогда попробуйте до того, как вставьте select из таблицы и верните false в событие BeforeTagAdded, но ajax будет асинхронным, как отмечали все люди вида ниже, beforeTagAdded заканчивается задолго до ajax
Я также пробовал несколько разных вещей в виджетах автозаполнения, таких как
change: function (event, ui) {
if(!ui.item){
//http://api.jqueryui.com/autocomplete/#event-change -
// The item selected from the menu, if any. Otherwise the property is null
//so clear the item for force selection
$(".tagit-new input").val("");
}
который предотвращает создание размытия, но клавиши ввода и вкладок все еще позволяют не выбирать элемент автозаполнения
вот весь мой код ниже, его использование jquery> 1.5.2 jquery ui 1.8.12, tag-it 2.0
var entity_id = getParameterByName('idnumber');
function dotagit(){
$("#myTags").tagit({
//removeConfirmation: true,
beforeTagAdded: function(event, ui) { //before the tag is added to the client, NOT the database
if ( !ui.duringInitialization){
//console.log(ui);
$.ajax({
url: "handlers/tags.ashx",
dataType: "json",
data: {
idnumber: entity_id,
tag: ui.tagLabel,
operation:"tag"
}
}).done(function(data){
if(data.result == false){
return false;
}
}).complete(function(data){
});
}
},
afterTagAdded: function(event, ui) {
if ( !ui.duringInitialization){
console.log('after');
}
},
beforeTagRemoved: function(event, ui) {
$.ajax({
url: "handlers/tags.ashx",
dataType: "json",
data: {
idnumber: entity_id,
tag: ui.tagLabel,
operation:"removetag"
}
}).done(function(data){
//console.log(data);
});
},
afterTagRemoved: function(event, ui) {
},
onTagExists: function(event, ui) {
// do something special
console.log(ui.tag);
console.log('onTagExists');
},
autocomplete: { source: function( request, response ) {
$.ajax({
url: "handlers/tags.ashx",
dataType: "json",
data: {
idnumber: entity_id,
q: request.term,
operation:"query"
}
}).done(function(data){
//console.log(data);
response( $.map( data.data, function( item ) {
return {
label: item.NAME + " x " + item.COUNT, // + (item.adminName1 ? ", " + item.adminName1 : "") + ", " + item.countryName,
value: item.NAME
}
}));
})
},
change: function (event, ui) {
if(!ui.item){
//http://api.jqueryui.com/autocomplete/#event-change -
// The item selected from the menu, if any. Otherwise the property is null
//so clear the item for force selection
$(".tagit-new input").val("");
}
},
minLength: 0
}
});
};
$(document).ready(function() {
$.ajax({
type: "GET",
url: "handlers/tags.ashx",
data: {
idnumber: entity_id,
operation:"get"
}
}).done(function(data){
//console.log(data);
$.each(data.data, function(key, value){
$('#myTags').append('<li>'+value.TAG+'</li>');
});
}).fail(function(xhr, err){
var responseTitle= $(xhr.responseText).filter('title').get(0);
alert($(responseTitle).text() + "\n" + formatErrorMessage(xhr, err) );
}).complete(function(){
dotagit();
});
});
С tag-it я не считаю, что это будет возможно без изменения источника. (Я готов исправляться здесь!) Если вы можете быть гибким в своей реализации, я бы порекомендовал jQuery TokenInput, который может сделать это по умолчанию. (Set allowFreeTagging: false
).
Во всяком случае, в отношении изменения источника tagit. Размытие и добавление/вкладка обрабатываются отдельно.
Enter/Tab add - строки 269-272
if (!(that.options.autocomplete.autoFocus && that.tagInput.data('autocomplete-open'))) {
that.tagInput.autocomplete('close');
that.createTag(that._cleanedInput());
}
Blur add - строка 277-9
if (!that.tagInput.data('autocomplete-open')) {
that.createTag(that._cleanedInput());
}
Теперь я считаю, что если вы закомментируете две строки createTag
, тогда у вас будет поведение, которое вы можете добавлять только теги, нажав на них в списке. (Который, я считаю, обрабатывается в строке 286.) В качестве альтернативы, если вы все еще хотите иметь возможность добавлять теги в blur/enter, только в том случае, если они находятся в базе данных, вы можете вставить свои вызовы AJAX в этот момент - и добавьте createTag
строки done
блок вашего AJAX.
(Номера строк относятся к версии 2.0, текущей версии GitHub.)