JQuery UI: Принудительный выбор автозаполнения

0

Итак, вот мой оригинальный вопрос, но мне показалось, что мне нужно задать отдельный вопрос, так как я не совсем понял, чего я пытаюсь выполнить

Я использую 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();  
  });
});
Теги:
autocomplete
tag-it

1 ответ

1

С 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.)

  • 0
    Я придерживаюсь того же мнения и изменил источник в строке 246, я оставлю вопрос открытым, чтобы кто-то мог доказать, что мы неправы

Ещё вопросы

Сообщество Overcoder
Наверх
Меню