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

Изменение .html() <option> сбрасывает свойство selectedIndex <option> от '-1' до '0'

Использование jQuery при смене .html() <option> внутри a <select> (которое я ранее задал для свойства selectedIndex значение -1) сбрасывает свойство selectedIndex <select> из '-1' до '0'

<!DOCTYPE html>
<html>
<head>
<script src="//code.jquery.com/jquery-2.1.1.min.js"></script>
  <meta charset="utf-8">
  <title>JS Bin</title>
</head>
<body>
<select id="myselect" class="drpmnu">

   <option id="one" >(01)</option>

   <option id="two" >(02)</option>

   <option id="three" >(03)</option>

</select>
  <script>
    $(".drpmnu").prop('selectedIndex', -1)
    $('#three').html("moo")
  </script>
</body>
</html>

http://jsbin.com/filowe/2/edit?html,output

4b9b3361

Ответ 1

Этот случай упоминается в спецификации HTML5:

При настройке атрибут selectedIndex должен установить для всех элементов опции в списке параметров значение false, а затем option в списке опций, индексом которого является заданное новое значение, если оно есть, должно быть установлено, что его выделение установлено в true, а его грязность - true.

Примечание.. Это может привести к тому, что ни один элемент, для которого выбранная функция не установлена ​​равным true, даже в случае элемента выбора, не имеющего множественного атрибута, и размера экрана 1.

...

Если узлы вставлены или удалены узлы, что приводит к тому, что список параметров получает или теряет один или несколько элементов опций или если элемент опций в списке опций запрашивает reset, то, если атрибут множественного выбора элемента отсутствует, размер отображения элемента выбора равен 1, и никакие элементы-опции в списке элементов выбора элементов не имеют установленную для них истину, пользовательский агент должен установить выбранность первого элемента параметра в списке параметров в древовидном порядке, который не отключен, если таковой имеется, для истины.

Изменение параметра с помощью его свойства innerHTML или textContent запускает этот reset (кроме Firefox), но свойство text (только <option>) не вызывает его (кроме IE).

// these triggers the <select> element reset (except on Firefox)
$("#three")[0].innerHTML   = "foo";
$("#three")[0].textContent = "foo";

// this does not trigger the reset (except on IE)
$("#three")[0].text = "foo";

Firefox следует строго строго, он только сбрасывает <select>, если есть новый <option>, или было удаление одного из <option> s. Но он не может выполнить reset при установке свойства <option> selected на false (но который должен запускать reset тоже).

Короче говоря, все текущие браузеры полностью не реализуют спецификацию, поэтому единственным кросс-платформенным решением является изменение selectedIndex в качестве последней операции над элементом выбора (и его дочерними элементами):

$("#three").html("moo");
$(".drpmnu").prop("selectedIndex", -1);

Ответ 2

В разных браузерах поведение различно. Я просто проверил в firefox и работал без ошибок. Он показал мне пустое раскрывающееся меню, и я проверил, что выбранный индекс был -1. В Chrome все же было не так.

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

Изменение параметра HTML не вызывает событие изменения, если это произойдет - следующий код закончится запуском бесконечного цикла.

var i = 0;
$(".drpmnu").change(function (e) {
    i++;
    $('#three').html("data" + i);
})

Ответ 3

Сначала я просмотрел функцию JQuery . html(), но не смог найти ничего, что могло бы вызвать проблему. Затем я попытался изменить innerHTML свойство без jquery (это то, что я должен был сделать первым). Он выглядит нормально в Firefox 33.1 и 34.0.5, но сбрасывает selectedIndex с помощью Chrome 40.0.2214.94, IE 10 и Opera 27.0.1689.66.

Я думаю, это доказывает, что комментарий @Blake Plumb верен для некоторых браузеров.

Это проблема перекраски. При изменении текста параметра происходит выбор перекрашивать. В перерисовке есть проблема, по которой prop получает reset до значение по умолчанию.

Ответ 4

Это потому, что вы устанавливаете содержимое HTML $('#three') после предварительной установки индекса. Поэтому, если вы хотите сохранить индекс -1, измените свой код на порядок.

<script>
    $('#three').html("moo");
    $(".drpmnu").prop('selectedIndex', -1);
</script>

Событие onchange автоматически запускается при изменении значения элемента. Таким образом, индекс reset индекса.