Ваше jsfiddle немного двусмысленно относительно того, какое поле со списком должно быть очищено - есть два поля со списком, но только одна чистая ссылка, поэтому не очевидно, если ссылка должна очистить только один или оба поля со списком.
Я подозреваю, что в реальном мире каждое поле со списком имеет свою собственную четкую ссылку. Выбор правильного текстового поля для вашей чистой ссылки все зависит от вашего HTML. В одном простом случае ясной ссылкой будет следующий элемент вашего элемента <select>
:
<select class="combo">
...
</select>
<a href="#" class="clearCombo">Clear</a>
Тогда вы можете создать комбо за один вызов, используя класс. Затем создайте все обработчики кликов сразу. Обработчик будет использовать .prevAll(".ui-autocomplete-input")
для поиска соответствующего текстового поля.
$("select.combo").combobox();
$("a.clearCombo").click(function () {
$(this).prevAll('.ui-autocomplete-input').first()
.focus()
.val('')
.autocomplete('close');
return false;
});
Рабочая демонстрация в jsfiddle
Если ваша ссылка не является родственником вашего поля со списком, это нормально. Либо найдите родителя, который является родным братом, и используйте вышеуказанный подход. Или, если это не сработает, найдите общего родителя для комбинации и ссылки. Это работает, только если общий родитель содержит только одну комбинацию и одну ссылку:
<span class="comboContainer">
<span>
<select class="combo">
...
</select>
</span>
<a href="#" class="clearCombo">Clear</a>
</span>
Вы используете .closest(".comboContainer")
и .find(".ui-autocomplete-input")
:
$("select.combo").combobox();
$("a.clearCombo").click(function () {
$(this).closest(".comboContainer").find('.ui-autocomplete-input')
.focus()
.val('')
.autocomplete('close');
return false;
});
Рабочая демонстрация в jsfiddle
Хорошая вещь об этих методах заключается в том, что ссылка не должна знать идентификатор своего связанного списка. Мы можем просто сделать вывод из HTML. Это позволяет очень легко перемещать комбо и добавлять новые.
Два предложения:
- Добавьте понятный метод к вашему плагину. Пользователи вашего виджета не должны знать его внутреннюю работу. В вашем примере вы должны знать, что виджет использует
.autocomplete()
. Это также препятствует тому, чтобы вы изменили свою реализацию позже. Добавление «чистого» метода упростит ваш обработчик кликов до $(this).prevAll("select.combo").combobox("clear")
.
- Дайте вашему виджету возможность создать саму кнопку очистки. Пользователи всегда могут отключить его и добавить собственную кнопку очистки, если они хотят.