Подтвердить что ты не робот

Автозаполнение jQuery UI запускается в полевом фокусе в Internet Explorer при наличии атрибута html 5 placeholder

HTML:

<input type="text" name="item" value="" id="item" class="input-xlarge" placeholder="Enter item name or scan barcode" accesskey="i"  />

JavaScript:

    $( "#item" ).autocomplete({
        source: '<?php echo site_url("sales/item_search"); ?>',
        delay: 10,
        autoFocus: false,
        minLength: 0,
        select: function(event, ui)
        {
            event.preventDefault();
            $( "#item" ).val(ui.item.value);
            $('#add_item_form').ajaxSubmit({target: "#register_container", beforeSubmit: salesBeforeSubmit, success: itemScannedSuccess});
        }
    });

setTimeout(function(){$('#item').focus();}, 10);

Когда страница загружается в Internet Explorer, автозаполнение происходит с пустым значением термина, результатом которого является куча результатов. Если я удалю атрибут placeholder, он будет функционировать так, как ожидалось, и НЕ делает запрос до ввода текста.

Если я удалю событие фокуса, он также работает в Internet Explorer. Но мне нужно сосредоточиться на загрузке страницы, поэтому на самом деле это не варианты. Я также хотел бы сохранить текст заполнителя.

Элемент функционирует так, как ожидалось (без запроса до ввода) в сафари, firefox и chrome.

Это ошибка? Есть ли обходной путь, поэтому я могу использовать атрибут placeholder?

Я собрал 2 примера; сломанной и фиксированной. Единственная разница между ними - наличие атрибута placeholder (в сломанной версии).

Сломанный только ломается в IE и функционирует как ожидалось в других браузерах.

ПРИМЕЧАНИЕ: по сломанному я имею в виду, что при фокусировке на поле автозаполнение активируется, когда оно не должно быть.

http://blastohosting.com/jquery_ui_autocomplete_bug/broken.html

http://blastohosting.com/jquery_ui_autocomplete_bug/working.html

ПРИМЕЧАНИЕ. В обоих этих примерах ajax всегда будет одним и тем же результатом. Пожалуйста, проигнорируйте это.

4b9b3361

Ответ 1

Проблема здесь в том, как Internet Explorer обрабатывает входное событие. Меню автозаполнения запускается во входном событии входного элемента (теги). https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js Линия 167

Если вы поместите этот код перед вашим setTimeout

document.getElementById('tags').addEventListener('input',function(ev){alert(ev.target.value);},false);

Вы увидите, что, например, встроенное событие ввода активируется в фокусе элемента. Этого не происходит на хроме. Поэтому, скорее всего, это не ошибка с jquery, а скорее особенность ie. Как вы сказали в своем вопросе, это происходит только тогда, когда элемент ввода имеет атрибут placeholder, без атрибута, входное событие не срабатывает в фокусе.

Я попытался добавить обработчик события one для фокуса, чтобы вызвать preventDefault(), прежде чем запускать фокус, но это все еще вызвало срабатывание входного события.

Атрибут autofocus html5 также по-прежнему вызывал событие ввода.

Я попробовал обернуть свой код в правильном html/head/body, но это не повлияло на

Наконец, в качестве обходного пути

1) Я по умолчанию присвоил свойству minLength значение 1

minLength: 1

2) В setTimeout я установил для параметра minLength значение 0

$("#tags").focus().autocomplete("minLength", 0);

Кажется, что это работает на 9.

Ответ 2

В

.autocomplete({
    delay: 0,
    //minLength: 0,
    minLength: 1,
    source: $.proxy(this, "_source")                         
})`

работает с флажками, как ответил Сумит. Вероятно, он работает и с текстовыми полями.

Но если вы используете автозаполнение в текстовом поле и не хотите использовать решение minlength, вы можете использовать альтернативно

$("your element or class tag").autocomplete("instance").menu.active = false; 

после инициализации кода jQuery. Я не мог видеть, как этот оператор можно использовать для флажка, используемого в текстовом поле, если вы знаете, что я с удовольствием его слушаю.

Ответ 3

Следующий код помог мне решить эту проблему:

  $("your tag").autocomplete({
   source:bla-bla,
   open:function(e,ui) /*Hack for IE11*/
   {            
     $(this).focus();
   }
   })
   .one("focus",function(){/*Hack for IE11*/
     $(this).blur(); 
   });

В скором времени виджет вызывает фокус для вашего тега, для тега мы создаем функцию с одним триггером, которая вызывается только 1 раз, когда фокус теряется, вызывая размытие. Такой обман для IE (плохой IE).

Может быть, есть лучшее решение. Пожалуйста, поделитесь этим с этим форумом.

Ответ 4

владелец места означает, что что-то отображается в текстовом поле, а автоматически завершается, когда вы пишете что-то в текстовом поле, тогда вы получите автоматически полный результат, теперь в вашем случае вы уже отобразите что-то с использованием для placeholder

Сначала попробуйте удалить поле-заполнитель в текстовое поле Backspace и попробуйте его.

Ответ 5

Дорогой, пожалуйста, напишите этот код

    $("#item").live("keydown.autocomplete",function(){
        put your code here. and try it 
        });