Основная проблема заключается в следующей строке:
$('#myselect').html(initialHTML);
Она выполняется для опции a
, а затем опция b
больше не может быть удалена, поскольку HTML-код изменился, даже если он фактически идентичен.Поэтому удалите эту строку, и ваш код будет работать.
$('#myselect option')
создает список параметров, а $(this).remove()
удаляет параметр b
из списка, но список больше не связан с HTML, посколькуHTML уже был изменен на $('#myselect').html(initialHTML)
, который был выполнен для опции a
.
var initialHTML = $('#myselect').html();
$('#myselect option').each(function() {
if (this.value === 'b') {
$(this).remove();
console.log('matching. removed.');
return false;
} else {
//$('#myselect').html(initialHTML);
console.log('not matching. html restored.');
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<select id="myselect">
<option>a</option>
<option>b</option>
<option>c</option>
</select>
Я изменил $(this).val()
на this.value
.Оба будут работать, но второй более эффективен, потому что нет смысла преобразовывать объект JavaScript в объект jQuery только для получения значения.
Однако помните, что строка:
return false;
приведет к выходу из цикла each()
, как только будет найдено совпадение.Это нормально, если будет только один матч.Если совпадений может быть несколько, удалите эту строку, чтобы цикл мог пройти через все параметры.