У меня есть форма ввода, которая позволяет мне выбирать из нескольких вариантов и что-то делать, когда пользователь меняет выбор. Например,
<select onChange="javascript:doSomething();">
<option>A</option>
<option>B</option>
<option>C</option>
</select>
Теперь doSomething()
срабатывает только при выборе изменении .
Я хочу запустить, doSomething()
когда пользователь выбирает любую опцию, возможно, же снова.
Я попытался использовать обработчик «onClick», но он срабатывает до того, как пользователь начинает процесс выбора.
Итак, есть ли способ вызвать функцию при каждом выборе пользователем?
Обновить:
Ответ, предложенный Дэррилом, похоже, сработал, но он не работает последовательно. Иногда событие запускается, как только пользователь щелкает раскрывающееся меню, даже до того, как пользователь завершил процесс выбора!
javascript
html
html-select
dom-events
ePharaoh
источник
источник
Ответы:
Вот самый простой способ:
Работает как с выделением мыши, так и с клавишами вверх / вниз, когда выбор сфокусирован.
источник
undefined
любом случае.if(type(this.selectedIndex) != undefined; doSomething()
doSomething()
Функция не срабатывает , когда пользователь выбирает уже выбранный параметр. Смотрите это шлепнуть , где цвет фона меняется только при выборе другого варианта , чем выбранный в данный момент один.doSomething()
когда выбрана одна конкретная опция, например, «опция 3» в вышеприведенном примере, используйтеif (this.selectedIndex==4)
где цифра «4» представляет числовой индекс опций, а НЕ указаннуюvalue
! (т. е. «вариант 3» является четвертым вариантом<select name="ab">
).Мне нужно что-то точно так же. Вот что сработало для меня:
Поддерживает это:
источник
У меня была такая же проблема, когда я создавал дизайн несколько месяцев назад. Решение, которое я нашел, состояло в том, чтобы использовать
.live("change", function())
в сочетании с.blur()
элементом, который вы используете.Если вы хотите, чтобы он что-то делал, когда пользователь просто щелкает вместо изменения, просто замените
change
наclick
.Я назначил в раскрывающемся списке идентификатор
selected
и использовал следующее:Я видел, что у этого не было выбранного ответа, поэтому я решил дать свой вклад. Это отлично сработало для меня, так что, надеюсь, кто-то другой сможет использовать этот код, когда застрянет.
http://api.jquery.com/live/
Редактировать: использовать
on
селектор в отличие от.live
. Смотрите jQuery .on ()источник
Просто идея, но возможно ли поставить onclick на каждый из
<option>
элементов?Другим вариантом может быть использование onblur для выбора. Это будет срабатывать каждый раз, когда пользователь щелкает мышью вдали от выбора. На данный момент вы можете определить, какой вариант был выбран. Чтобы это срабатывало даже в нужное время, щелчок опции мог бы размыть поле (сделать что-то еще активным или просто .blur () в jQuery).
источник
Подход onclick не совсем плох, но, как уже было сказано, он не будет срабатывать, когда значение не изменяется щелчком мыши.
Однако возможно вызвать событие onclick в событии onchange.
источник
Собираюсь расширить ответ Jitbit. Я нахожу это странным, когда вы щелкаете по раскрывающемуся списку, а затем щелкаете по раскрывающемуся списку, ничего не выбирая. Закончилось чем-то вроде:
Это имеет немного больше смысла для пользователя и позволяет запускать JavaScript каждый раз, когда они выбирают любую опцию, включая более раннюю опцию.
Недостатком этого подхода является то, что он лишает вас возможности вкладываться в выпадающий список и использовать клавиши со стрелками для выбора значения. Это было приемлемо для меня, так как все пользователи все время кликают до конца вечности.
источник
this
вместо$(this)
. Тем не менее, я не получаю все предполагаемое поведение из этого; это не предупреждает, когда я повторно выбираю ту же самую опцию.onchange
срабатывает при добавлении параметров удаления в поле выбора через JS. Не только когда пользователь выбирает предметЕсли вам действительно нужно, чтобы это работало так, я бы сделал это (чтобы он работал с помощью клавиатуры и мыши)
К сожалению, onclick будет запускаться несколько раз (например, при закрытии select ... и при выборе / закрытии), а onkeypress может срабатывать, когда ничего не меняется ...
источник
Чтобы правильно инициировать событие каждый раз, когда пользователь выбирает что-то (даже одну и ту же опцию), вам просто нужно обмануть поле выбора.
Как уже говорили другие, укажите отрицательный
selectedIndex
фокус, чтобы вызвать событие изменения. Хотя это позволяет вам обмануть окно выбора, оно не будет работать после этого, пока оно все еще имеет фокус. Простое исправление - заставить окно выбора размыться, как показано ниже.Стандартный JS / HTML:
Плагин jQuery:
Вы можете увидеть рабочую демонстрацию здесь .
источник
На самом деле события onclick НЕ будут срабатывать, когда пользователь использует клавиатуру для изменения выбора в элементе управления select. Возможно, вам придется использовать комбинацию onChange и onClick, чтобы получить поведение, которое вы ищете.
источник
Это может не дать прямого ответа на ваш вопрос, но эта проблема может быть решена с помощью простых настроек уровня дизайна. Я понимаю, что это не может быть на 100% применимо ко всем случаям использования, но я настоятельно призываю вас подумать о переосмыслении вашего пользовательского потока вашего приложения и возможности реализации следующего предложения по проектированию.
Я решил сделать что - то простое , чем взлом альтернатив для
onChange()
использования других событий , которые не были на самом деле предназначены для этой цели (blur
,click
и т.д.)Как я это решил:
Просто предварительно ожидайте тег-опцию-заполнитель, например select, который не имеет значения.
Таким образом, вместо использования следующей структуры, которая требует хакерских альтернатив:
Рассмотрите возможность использования этого:
Таким образом, ваш код намного упрощен и
onChange
будет работать, как и ожидалось, каждый раз, когда пользователь решает выбрать что-то отличное от значения по умолчанию. Вы даже можете добавитьdisabled
атрибут к первому параметру, если не хотите, чтобы они выбирали его снова и заставляли выбирать что-либо из параметров, таким образом вызываяonChange()
пожар.Во время ответа я пишу сложное приложение Vue и обнаружил, что этот выбор дизайна значительно упростил мой код. Я потратил часы на эту проблему, прежде чем освоился с этим решением, и мне не пришлось переписывать много кода. Однако, если бы я использовал альтернативные варианты, мне пришлось бы учитывать крайние случаи, предотвращать двойное срабатывание запросов ajax и т. Д. Это также не портит поведение браузера по умолчанию в качестве приятного бонуса (протестировано на мобильных устройствах). браузеры также).
Иногда вам просто нужно сделать шаг назад и подумать над общей картиной для самого простого решения.
источник
Что я сделал, столкнувшись с подобной проблемой, так это то, что я добавил «onFocus» в поле выбора, которое добавляет новый универсальный параметр («выбрать параметр» или что-то похожее) и по умолчанию его в качестве выбранного параметра.
источник
Поэтому моя цель состояла в том, чтобы иметь возможность выбрать одно и то же значение несколько раз, что по существу перезаписывает функцию onchange () и превращает его в полезный метод onclick ().
Основываясь на предложениях выше, я пришел с этим, который работает для меня.
http://jsfiddle.net/dR9tH/19/
источник
onfocus="this.selectedIndex=-1"
решениях: текущий выбор обнуляется, если вы переходите на компонент, или если вы щелкаете мышью по меню, ничего не выбирая. Нажмите вкладку на скрипке, чтобы понять, что я имею в виду. (Также обратите внимание, что вы получаете пустое значение, а не «-», когда вы делаете это. Это потому, чтоselectedIndex=-1
не дает вам<option value="-1">
; это было бы небольшим улучшением здесь для использованияonfocus="this.selectedIndex=0"
. Это наполовину приличный обходной путь, но я не как потеря текущего выбора только из-за того, что я заглянул в меню, или даже просто во вкладке к немув первую очередь вы используете onChange в качестве обработчика событий, а затем используете переменную-флаг, чтобы она выполняла функцию, которую вы хотите каждый раз, когда вносите изменения
источник
Добавьте дополнительную опцию в качестве первой, например, заголовок столбца, который будет значением по умолчанию для раскрывающейся кнопки до ее щелчка и сброса в конце
doSomething()
, поэтому при выборе A / B / C событие onchange всегда срабатывает, когда выбор сделанState
, ничего не делай и возвращайся.onclick
очень нестабильно, как многие люди упоминали ранее. Поэтому все, что нам нужно сделать, это сделать начальную метку кнопки, которая отличается от ваших истинных опций, чтобы onchange работал с любой опцией.источник
Замечательная вещь в теге select (в этом сценарии) заключается в том, что он извлекает свое значение из тегов option.
Пытаться:
Работал достойно для меня.
источник
используйте jquery:
источник
Вот мое решение, совершенно отличное от любого другого здесь. Он использует положение мыши, чтобы выяснить, был ли выбран вариант, а не щелкнуть поле выбора, чтобы открыть раскрывающийся список. Он использует позицию event.screenY, поскольку это единственная надежная кросс-браузерная переменная. Сначала необходимо прикрепить событие наведения мыши, чтобы можно было определить положение элементов управления относительно экрана перед событием щелчка.
Вот мой jsFiddle http://jsfiddle.net/sU7EV/4/
источник
вы должны попробовать использовать
option:selected
источник
Что работает для меня:
Таким образом, onchange вызывает doSomething () при изменении параметра, а onclick вызывает doSomething (), когда событие onchange равно false, другими словами, когда вы выбираете ту же опцию
источник
Попробуйте это (событие срабатывает точно при выборе опции, без изменения опции):
http://jsbin.com/dowoloka/4
источник
Здесь у вас есть возвращенный индекс, и в коде js вы можете использовать этот возврат с одним переключателем или чем угодно.
источник
Попробуй это:
источник
Давным-давно, но в ответ на первоначальный вопрос, это поможет? Просто вставь
onClick
вSELECT
линию. Затем поместите то, что вы хотите, чтобы каждыйOPTION
делал вOPTION
строках. то есть:источник
источник
Я столкнулся с аналогичной необходимостью и закончил тем, что написал директиву angularjs для того же самого -
ссылка guthub - угловой выбор
Используется
element[0].blur();
для удаления фокуса с метки выбора. Логика заключается в том, чтобы вызвать размытие при втором щелчке раскрывающегося списка.as-select
срабатывает даже тогда, когда пользователь выбирает одно и то же значение в раскрывающемся списке.ДЕМО - ссылка
источник
Единственный верный ответ - не использовать поле выбора (если вам нужно что-то сделать, когда вы повторно выбираете тот же ответ).
Создайте выпадающее меню с обычным div, кнопкой, показать / скрыть меню. Ссылка: https://www.w3schools.com/howto/howto_js_dropdown.asp
Можно было бы избежать, если бы можно было добавить слушателей событий к опциям. Если был прослушиватель onSelect для элемента select. И если нажатие на поле выбора не отягчает работу mousedown, mouseup, и нажмите все одновременно на mousedown.
источник
Есть несколько вещей, которые вы хотите сделать здесь, чтобы убедиться, что он запоминает более старые значения и вызывает событие onchange, даже если тот же параметр будет выбран снова.
Первое, что вы хотите, это обычное событие onChange:
Чтобы вызвать событие onChange даже при повторном выборе того же параметра, можно отменить выбор выбранного параметра, когда раскрывающийся список получает фокус, установив для него недопустимое значение. Но вы также хотите сохранить ранее выбранное значение, чтобы восстановить его, если пользователь не выберет какую-либо новую опцию:
Приведенный выше код позволит вам активировать обмен, даже если выбрано то же значение. Однако, если пользователь щелкает за пределами поля выбора, вы хотите восстановить предыдущее значение. Мы делаем это на onBlur:
источник
Пожалуйста, обратите внимание, что обработчики событий не поддерживаются для тэга OPTION в IE, и я подумал ... Я пришел к этому решению, попробуйте его и оставьте свой отзыв:
Здесь я на самом деле сбрасываю индекс выбора, так что событие onchange будет вызываться всегда, правда, вы теряете выбранный элемент при нажатии, и это может раздражать, если ваш список длинный, но это может помочь вам в некотором роде ..
источник
как насчет изменения значения выбора, когда элемент получает фокус, например (с помощью jquery):
источник
Я нашел это решение.
установить selectedIndex элемента select на 0 изначально
вызвать этот метод событие onChange
источник