2010-05-19 2 views
5

Я использую jQuery UI AutoComplete control (только что обновленный до jQuery UI 1.8.1). Всякий раз, когда пользователь покидает текстовое поле, я хочу установить содержимое текстового поля в известное значение и установить поле скрытого идентификатора для выбранного значения. Кроме того, я хочу, чтобы страница была отправлена ​​обратно, когда содержимое текстового поля было изменено.jQuery AutoComplete выбрать стрельбу после смены?

В настоящее время я реализую это, когда событие выбора автозаполнения задает скрытый идентификатор, а затем событие изменения в текстовом поле, которое устанавливает значение текстового поля и, при необходимости, вызывает сообщение назад.

Если пользователь просто использует клавиатуру, это работает отлично. Вы можете ввести, используйте стрелки вверх и вниз, чтобы выбрать значение, а затем вкладку, чтобы выйти. Событие выбора срабатывает, идентификатор установлен, а затем происходит событие изменения, и страница возвращается.

Если пользователь начинает вводить текст, а затем использует мышь, чтобы выбрать из параметров автозаполнения, но событие изменения срабатывает (когда фокус переходит в меню автозаполнения?), А страница возвращается обратно до того, как событие выбора имеет возможность установить ID.

Есть ли способ, чтобы событие изменения не срабатывало до тех пор, пока не произойдет событие select, даже если используется мышь?

$(function() { 
    var txtAutoComp_cache = {}; 
    var txtAutoComp_current = { label: $('#txtAutoComp').val(), id: $('#hiddenAutoComp_ID').val() }; 
    $('#txtAutoComp').change(function() { 
     if (this.value == '') { txtAutoComp_current = null; } 
     if (txtAutoComp_current) { 
      this.value = txtAutoComp_current.label ? txtAutoComp_current.label : txtAutoComp_current; 
      $('#hiddenAutoComp_ID').val(txtAutoComp_current.id ? txtAutoComp_current.id : txtAutoComp_current); 
     } else { 
      this.value = ''; 
      $('#hiddenAutoComp_ID').val(''); 
     } 
     // Postback goes here 
    }); 
    $('#txtAutoComp').autocomplete({ 
     source: function(request, response) { 
      var jsonReq = '{ "prefixText": "' + request.term.replace('\\', '\\\\').replace('"', '\\"') + '", "count": 0 }'; 
      if (txtAutoComp_cache.req == jsonReq && txtAutoComp_cache.content) { 
       response(txtAutoComp_cache.content); 
       return; 
      } 
      $.ajax({ 
       url: 'ajaxLookup.asmx/CatLookup', 
       contentType: 'application/json; charset=utf-8', 
       dataType: 'json', 
       data: jsonReq, 
       type: 'POST', 
       success: function(data) { 
        txtAutoComp_cache.req = jsonReq; 
        txtAutoComp_cache.content = data.d; 
        response(data.d); 
        if (data.d && data.d[0]) { txtAutoComp_current = data.d[0]; } 
       } 
      }); 
     }, 
     select: function(event, ui) { 
      if (ui.item) { txtAutoComp_current = ui.item; } 
      $('#hiddenAutoComp_ID').val(ui.item ? ui.item.id : ''); 
     } 
    }); 
}); 

ответ

0

Я не знаю, о предотвращении события изменения от стрельбы, но вы можете легко бросить несколько условные в вашем случае изменения, которое гарантирует, что скрытое поле было установлено, и что TextBox в настоящее время имеет значения ,

+0

Значения текстового поля и скрытых идентификаторов сохраняются из предыдущих сообщений, поэтому я не вижу простого способа определить, что я поймал текущие изменения, а не предыдущие изменения, которые уже были обработаны. Я предполагаю, что проблема заключается в том, что выход из текстового поля без выбора элемента является допустимым и его нужно обрабатывать отдельно от выхода из текстового поля при выборе элемента, и я не могу понять, как определить, что происходит, если вы выбираете огонь после изменения. – Zarigani

3

Вы можете решить эту проблему, выполнив ваше событие изменения как вариант автозаполнения, как и select, вместо функции jQuery change().

Вы можете увидеть список событий на the autocomplete demo & documentation page. В нем указано, что событие изменения всегда запускается после события закрытия, которое, как я полагаю, запускается после события выбора. Посмотрите на источник для «combobox», чтобы увидеть пример смены события.

+0

Это лучший ответ, чтобы реализовать это изменение стратегии. –

1

Он работал для меня на мышь выбрать, когда я сделал это:

focus: function (event, ui) { 
         $j(".tb").val(ui.item.value); 
         return true; 
        } 

Это приводит текст TextBox для изменения на фокус мыши события, так же, как это происходит, как на события клавиатуры. И когда мы выбираем элемент, он вызывает выбор.

+2

, за исключением того, что он не использует автоматическое полное фокусное событие, он использует событие изменения jquery. –

Смежные вопросы