Как заставить браузер отображать все параметры каталогизации, когда установлено значение по умолчанию?

У меня есть HTML-форма с datalist и где значение задано с помощью PHP, например

<input list="values" value="<?php echo $val; ?>">
 <datalist id="values">
  <option value="orange">
  <option value="banana">
 </datalist>

Я хочу, чтобы пользователь видел параметры в datalist, а также текущее значение из PHP. Однако действие "автозаполнение" вызывает значения из списка, которые не соответствуют (или начинают с) текущее значение, которое должно быть скрыто из списка, скажем, если $val='apple'. Есть ли способ избежать этого, или это поведение исправлено браузером?

Ответ 1

<datalist> использует функцию автозаполнения, поэтому это нормальное поведение.

Например, если вы устанавливаете значение ввода "o", вы увидите только оранжевые параметры в диалоговом окне. Он проверяет слово из первой буквы. Но если вы установите значение ввода на "a", вы не увидите никаких параметров.

Итак, если у вас уже есть значение во вводе, то ничего не будет показано в параметрах datalist, кроме этого значения, если оно существует. Он не ведет себя как select.

Обходным путем для этого будет использование jquery, например, например:

$('input').on('click', function() {
  $(this).val('');
});
$('input').on('mouseleave', function() {
  if ($(this).val() == '') {
    $(this).val('apple');
  }
});

Полный тест здесь: https://jsfiddle.net/yw5wh4da/

Или вы можете использовать <select>. Для меня это лучшее решение в этом случае.

Ответ 2

HTML:

<input list="values" placeholder="select">
<datalist id="values">
  <option value="orange">
  <option value="banana">
  <option value="lemon">
  <option value="apple">
</datalist>

JS:

$('input').on('click', function() {
    $(this).attr('placeholder',$(this).val());
  $(this).val('');
});
$('input').on('mouseleave', function() {
  if ($(this).val() == '') {
    $(this).val($(this).attr('placeholder'));
  }
});

Ответ 3

Вышеприведенные решения великолепны, но если пользователь, естественно, просто нажимает рядом со значением placeholder, внутри поля ввода, намереваясь сохранить и продолжить его, он будет полностью удален.

Итак, основываясь на решениях выше, я сделал для меня следующее решение:

HTML:

<input id="other" list="values" value="<?php echo $val; ?>">
 <datalist id="values">
  <option value="orange">
  <option value="banana">
 </datalist>

JS:

jQuery(document).ready(function ($) {
    function putValueBackFromPlaceholder() {
        var $this = $('#other');
        if ($this.val() === '') {
            $this.val($this.attr('placeholder'));
            $this.attr('placeholder','');
        }
    }

    $('#other')
        .on('click', function(e) {
            var $this = $(this);
            var inpLeft = $this.offset().left;
            var inpWidth = $this.width();
            var clickedLeft = e.clientX;
            var clickedInInpLeft = clickedLeft - inpLeft;
            var arrowBtnWidth = 12;
            if ((inpWidth - clickedInInpLeft) < arrowBtnWidth ) {
                $this.attr('placeholder',$this.val());
                $this.val('');
            }
            else {
                putValueBackFromPlaceholder();
            }
        })
        .on('mouseleave', putValueBackFromPlaceholder);
});

Для меня есть много полей ввода на странице, и я хочу, чтобы у этого только было такое поведение, поэтому я работаю с id и имею его "личным". Если вы хотите изменить его на более общую функцию, вам придется привязать putValueBackFromPlaceholder к элементу, по которому произошел щелчок, и самому событию.

Ответ 4

Просто вставьте желаемое значение по умолчанию во входной тег. Никакого дополнительного кодирования JavaScript не требуется!

        <input list="skills" value="DBA">

          <datalist name="skills" id="skills">

              <option value="PHP">Zend PHP</option>
              <option value="DBA">ORACLE DBA</option>
              <option value="APEX">APEX 5.1</option>
              <option value="ANGULAR">ANGULAR JS</option>

          </datalist>