#javascript #jquery #html #select #drop-down-menu
#javascript #jquery #HTML #выберите #выпадающее меню
Вопрос:
Я искал ответ на этот вопрос в течение довольно долгого времени, но безуспешно, или глючные решения на максимуме.
Проблема, с которой я сталкиваюсь, заключается в том, что у меня есть элемент select, который (очевидно) не запускает событие «onchange» при выборе уже выбранного элемента.
Вот так:
<select onchange="alert(this.value);">
<option>1</option>
<option>2</option>
<option>3</option>
</select>
Теперь, допустим, я сначала выбираю элемент 1.
Затем мне нужно снова иметь возможность выбрать элемент 1.
Эта функция чрезвычайно важна для успеха проекта, над которым я работаю.
Любая помощь приветствуется.
Редактировать: (Дополнительная информация)
Эта функциональность необходима, поскольку я работаю над проектом с картами Google, где пользователям предоставляется выпадающий список для быстрого перехода к стране (например, вы выбираете «Испания» в выпадающем списке, карты Google устанавливают Испанию в качестве вашего вида.
проблема возникает, когда вы хотите отправиться в Испанию, затем перетаскиваете карту и оказываетесь в Италии. Теперь вы хотите вернуться в Испанию, но вы не можете выбрать его из выпадающего списка, пока сначала не выберете что-то другое. Моему боссу это не нравится 🙂
Правка2: Решение
Итак, на данный момент есть несколько решений. Один из них заключается в том, чтобы выполнить действие onblur (при расфокусировке элемента управления), это могло сработать, поскольку я мог бы размыть список при изменении, но все же для людей, выбирающих тот же элемент снова, триггер для размытия элемента управления не сработает, и если они не переключат фокус самостоятельно, они не увидят изменений на карте.
Тем не менее, я не могу понять, почему должно быть так сложно найти какое-либо событие, которое вызывает выбор опции / щелчок / размытие или что-то еще.. я продолжу поиск сам и вернусь сюда чуть позже.
Правка 3: Окончательное решение
Итак, мне наконец удалось заставить это работать, не совсем так, как это должно было быть, но достаточно близко, по крайней мере, на данный момент в любом случае.
Решение, которое я придумал, состояло в том, чтобы добавить опцию «Пожалуйста, выберите страну» в верхней части выбора. Затем при изменении я бы изменил текст и значение «Пожалуйста, выберите страну» на значение выбранного элемента и сбросил selectedindex на 0. Таким образом, при выборе, скажем, Испании, он будет находиться в верхней части списка в отключенном состоянии и далее вниз в рабочем состоянии. итак, теперь вы можете щелкнуть по испании в середине списка, чтобы вернуться к испании, даже если она все еще выбрана (верхний элемент)
Довольно аккуратно, идея была предоставлена коллегой.
сценарий выглядит следующим образом:
var dummyOption;
function setdummyCountry(obj)
{
var selectedOption = obj.options[obj.selectedIndex];
if (dummyOption != null) {
dummyOption.text = selectedOption.text;
dummyOption.value = selectedOption.value;
}
else {
dummyOption = document.createElement("option");
dummyOption.text = selectedOption.text;
dummyOption.value = selectedOption.value;
dummyOption.setAttribute("disabled", "true");
obj.options[0] = dummyOption;
}
obj.selectedIndex = 0;
}
<select onchange="setdummyCountry(this);">
<option value="">Please select country</option>
<option value="ES">spain</option>
<option value="SE">sweden</option>
<option value="NO">norway</option>
</select>
я надеюсь, что это кому-нибудь поможет!
И тем, кто пытался мне помочь, спасибо за ваши идеи и время.
Комментарии:
1. Если вы измените onchange на onclick, это поможет вам разобраться?
2. Не могли бы вы добавить больше информации о том, зачем вам нужно такое поведение? Возможно, мы сможем предложить вам лучшую альтернативу
3. просто сначала один раз напишите все параметры, а также добавьте один с
selected
тегом. все ли параметры находятся в массиве?? пожалуйста, объясните подробнее4. #thesupertramp в некоторой степени да. Я уже прочитал этот пост, но решения в нем, похоже, не решают мою проблему. Я просто схожу с ума от того, насколько это может быть сложно. Если я не смогу найти решение, я предполагаю, что (дерьмовым) решением было бы привязать событие сброса к перетаскиванию карт Google. таким образом, при каждом перетаскивании выбранный индекс сбрасывается на «пожалуйста, выберите элемент» или что-то еще. моему боссу это не понравится…
5. Мне кажется, что событие сброса ondrag — это правильный путь и хороший дизайн юзабилити. Как только вы отвлекаетесь от «Испании», вы больше не фокусируетесь на Испании. Не имеет смысла указывать «Italy», но при этом показывать «Spain» в качестве выбранной страны.
Ответ №1:
Я думаю, что событие изменения не сработает, если выбран тот же элемент. Мы столкнулись с той же проблемой, поэтому то, что мы сделали, было простым взломом удобства использования: когда элемент выбран, мы показываем пользователю элемент, выбранный в промежутке, и сбрасываем значение выпадающего списка на его значение по умолчанию (—Select—).
HTH
Ответ №2:
возможно, это не совсем то, что вы хотите, но это еще одна альтернатива, которую вы можете решить. после выбора параметра верните ему значение по умолчанию (пустой / первый)
<select onchange="alert(this.value);this.value='';">
<option value='' selected='selected'></option>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
или вы можете сделать
<select onblur="alert(this.value);">
<option>1</option>
<option>2</option>
<option>3</option>
</select>
но таким образом будет вызываться ваша функция (alert), когда пользователь покидает / размывает / расфокусирует список: p
Ответ №3:
Я искал решение для того же сценария и в итоге написал директиву angularjs для того же —
ссылка на guthub — angular select
Используется element[0].blur();
для удаления фокуса с тега select. Логика заключается в том, чтобы вызвать это размытие при втором нажатии на выпадающий список.
as-select
запускается, даже когда пользователь выбирает то же значение в выпадающем списке.
ДЕМОНСТРАЦИОННАЯ ссылка
Ответ №4:
вы можете использовать функцию onclick и вести подсчет для этого, как только вы дважды получите одно и то же target.value, тогда вы сможете выполнить свою функцию onchange там. Я реализовал это в Vue.js
Выберите блокировать:
<select
id="status"
name="status"
@change="
onChangeStatus(un.id, $event)
"
@click="
onChangeStatus(
un.id,
$event,
'same'
)
"
class="form-control"
:value="un.status"
>
<option value="Uncleaned">Uncleaned</option>
<option value="Partially Taken for cleaning">
Partially Taken for cleaning
</option>
<option value="Fully Taken for cleaning">
Fully Taken for cleaning
</option>
</select>
Изначально сохранялось значение count = 0.
Я использовал одну и ту же функцию для обоих событий, проверил условия и соответственно вернул данные
onChangeStatus(id, e, type) {
if (type === "same") {
if (e.target.value === "Partially Taken for cleaning") {
this.count = 1;
if (this.count === 2)
this.$router.push({
name: "NewPage",
params: {
id: id,
status: e.target.value,
},
});
}
} else {
this.$router.push({
name: "NewPage",
params: {
id: id,
status: e.target.value,
},
});
}
},