Когда я играл с <input type="range">
, Firefox запускает событие onchange, только если мы переместим ползунок на новую позицию, где Chrome и другие запускают события onchange, когда ползунок перетаскивается.
Как я могу сделать это при перетаскивании в Firefox?
function showVal(newVal){
document.getElementById("valBox").innerHTML=newVal;
}
<span id="valBox"></span>
<input type="range" min="5" max="10" step="1" onchange="showVal(this.value)">
onchange
не срабатывает. Именно в устранении неполадок этой проблемы я нашел этот вопрос.Ответы:
Очевидно, что Chrome и Safari не правы:
onchange
должен запускаться только тогда, когда пользователь отпускает мышь. Чтобы получать постоянные обновления, вы должны использоватьoninput
событие, которое будет захватывать живые обновления в Firefox, Safari и Chrome, как с помощью мыши, так и с клавиатуры.Однако
oninput
в IE10 это не поддерживается, поэтому лучше всего объединить два обработчика событий, например:Проверьте эту ветку Bugzilla для получения дополнительной информации.
источник
$("#myelement").on("input change", function() { doSomething(); });
с помощью jQuery.onchange()
не работает в мобильной сети, какAndroid Chrome
иiOS Safari
. Любое альтернативное предложение?РЕЗЮМЕ:
Здесь я предоставляю кросс-браузерную возможность no-jQuery для настольных и мобильных устройств, чтобы последовательно реагировать на взаимодействия диапазона / ползунка, что невозможно в современных браузерах. По сути, это заставляет все браузеры эмулировать
on("change"...
события IE11 для ихon("change"...
или дляon("input"...
событий. Новая функция ...... где
r
ваш элемент ввода диапазона иf
ваш слушатель. Слушатель будет вызываться после любого взаимодействия, которое изменяет значение диапазона / ползунка, но не после взаимодействий, которые не изменяют это значение, включая начальные взаимодействия мыши или касания в текущей позиции ползунка или после перемещения с любого конца ползунка.Проблема:
По состоянию на начало июня 2016 года разные браузеры различаются с точки зрения того, как они реагируют на использование диапазона / слайдера. Пять сценариев актуальны:
В следующей таблице показано, как, по крайней мере, три разных настольных браузера отличаются по своему поведению в зависимости от того, на какой из приведенных выше сценариев они реагируют:
Решение:
onRangeChange
Функция обеспечивает последовательную и предсказуемую реакцию кросс-браузер для диапазона / слайдер взаимодействий. Это заставляет все браузеры вести себя согласно следующей таблице:В IE11 код, по существу, позволяет всему работать в соответствии со статус-кво, то есть он позволяет
"change"
событию функционировать стандартным образом, и"input"
событие не имеет значения, так как оно никогда не срабатывает. В других браузерах"change"
событие эффективно отключается (для предотвращения запуска дополнительных, а иногда и не совсем очевидных событий). В дополнение"input"
событие вызывает слушателя только при изменении значения диапазона / ползунка. В некоторых браузерах (например, Firefox) это происходит потому, что слушатель эффективно отключается в сценариях 1, 4 и 5 из приведенного выше списка.(Если вы действительно хотите, чтобы слушатель был активирован в любом из сценариев 1, 4 и / или 5, вы можете попробовать включить события
"mousedown"
/"touchstart"
,"mousemove"
/"touchmove"
и / или"mouseup"
/"touchend"
. Такое решение выходит за рамки этого ответа.)Функциональность в мобильных браузерах:
Я тестировал этот код в настольных браузерах, но не в мобильных браузерах. Однако в другом ответе на этой странице MBourne показал, что мое решение здесь "... похоже, работает в любом браузере, который я смог найти (Win Desktop: IE, Chrome, Opera, FF; Android Chrome, Opera и FF, iOS Safari) " . (Спасибо, MBourne.)
Использование:
Чтобы использовать это решение,
onRangeChange
включите функцию из приведенного выше резюме (упрощенного / минимизированного) или приведенного ниже фрагмента демонстрационного кода (функционально идентичного, но более понятного) в свой собственный код. Вызовите это следующим образом:где
myRangeInputElmt
- ваш желаемый<input type="range">
элемент DOM иmyListener
функция прослушивателя / обработчика, для которой вы хотите вызвать"change"
подобных событиях.При желании ваш слушатель может не иметь параметров или использовать
event
параметр, т. Е. Может работать любое из следующих действий в зависимости от ваших потребностей:или
(Удаление слушателя события из
input
элемента (например, использованиеremoveEventListener
) не рассматривается в этом ответе.)Демо Описание:
В приведенном ниже фрагменте кода функция
onRangeChange
предоставляет универсальное решение. Остальная часть кода является просто примером, демонстрирующим его использование. Любая переменная, которая начинается сmy...
имеет отношения к универсальному решению и присутствует только для демонстрации.Демонстрационные показывает значение диапазона / слайдер, а также количество раз стандартных
"change"
,"input"
и пользовательские"onRangeChange"
события обстреляли (строки A, B и C соответственно). При запуске этого фрагмента в разных браузерах обратите внимание на следующее при взаимодействии с диапазоном / ползунком:Демо-код:
Кредит:
Хотя реализация здесь в значительной степени моя собственная, она была вдохновлена ответом MBourne . Этот другой ответ предполагал, что события «input» и «change» можно объединить и что полученный код будет работать как в настольных, так и в мобильных браузерах. Однако код в этом ответе приводит к запуску скрытых «лишних» событий, что само по себе проблематично, а возникающие события различаются в разных браузерах, что является еще одной проблемой. Моя реализация здесь решает эти проблемы.
Ключевые слова:
События ползунка диапазона ввода типа JavaScript изменяют совместимость ввода в браузере кросс-браузерный рабочий стол mobile no-jQuery
источник
Я публикую это как ответ, потому что он заслуживает того, чтобы быть его собственным ответом, а не комментарием под менее полезным ответом. Я считаю, что этот метод намного лучше, чем принятый ответ, поскольку он может хранить все js в отдельном файле из HTML.
Ответ предоставил Джамрелиан в своем комментарии под принятым ответом.
Просто знайте об этом комментарии Хайме, хотя
Как и в нем будет срабатывать событие, когда вы перестали двигать мышь, а затем снова, когда вы отпустите кнопку мыши.
Обновить
По отношению к
change
событию иinput
событию, вызывающему срабатывание функции дважды, это в значительной степени не проблема.Если у вас включена функция
input
, крайне маловероятно, что при возникновенииchange
события возникнет проблема .input
срабатывает быстро при перетаскивании ползунка ввода диапазона. Беспокоиться о еще одном вызове функции в конце - все равно, что беспокоиться об одной капле воды по сравнению с океаном воды, который являетсяinput
событиями.Причина даже включения
change
события вообще ради совместимости браузера (в основном с IE).источник
ОБНОВЛЕНИЕ: я оставляю этот ответ здесь как пример того, как использовать события мыши для использования взаимодействий диапазона / ползунка в настольных (но не мобильных) браузерах. Тем не менее, я также написал совершенно другой и, как мне кажется, лучший ответ в другом месте на этой странице, в котором используется другой подход к предоставлению кросс-браузерного настольного и мобильного решения этой проблемы.
Оригинальный ответ:
Описание: кросс-браузерное простое решение JavaScript (т.е. no-jQuery), позволяющее считывать входные значения диапазона без использования
on('input'...
и / илиon('change'...
которые работают противоречиво между браузерами.На сегодняшний день (конец февраля 2016 г.) браузер по-прежнему не согласован, поэтому я предлагаю новый способ решения проблемы.
Проблема: при использовании ввода диапазона, то есть слайдера,
on('input'...
выдает постоянно обновляемые значения диапазона в Mac и Windows Firefox, Chrome и Opera, а также в Mac Safari, в то времяon('change'...
как значение диапазона отображается только при наведении мыши. Напротив, в Internet Explorer (v11)on('input'...
не работает вообще, иon('change'...
постоянно обновляется.Здесь я сообщаю о двух стратегиях получения одинаковых отчетов о значениях непрерывного диапазона во всех браузерах с использованием vanilla JavaScript (т.е. без jQuery) с помощью событий mousedown, mousemove и (возможно) mouseup.
Стратегия 1: короче, но менее эффективно
Если вы предпочитаете более короткий код более эффективному, вы можете использовать это первое решение, которое использует mousesdown и mousemove, но не mouseup. Это читает ползунок по мере необходимости, но продолжает без необходимости срабатывать при любых событиях при наведении курсора, даже если пользователь не нажал и, таким образом, не перетаскивает ползунок. По сути, он читает значение диапазона как после «mousedown», так и во время «mousemove», слегка задерживая каждое использование
requestAnimationFrame
.Стратегия 2: дольше, но эффективнее
Если вам нужен более эффективный код и вы можете терпеть большую длину кода, то вы можете использовать следующее решение, которое использует mousedown, mousemove и mouseup. Это также читает ползунок по мере необходимости, но, соответственно, перестает читать его, как только кнопка мыши отпущена. Существенным отличием является то, что прослушивание «mousemove» начинается только после «mousedown», а прослушивание «mousemove» после «mouseup» прекращается.
Демонстрация: более полное объяснение необходимости и реализации вышеуказанных обходных путей
Следующий код более полно демонстрирует многочисленные аспекты этой стратегии. Пояснения включены в демонстрацию:
Показать фрагмент кода
источник
touchmove
должно быть достаточно, и я думаю, что это можно рассматривать так же, какmousemove
в этом случае.Решения Эндрю Виллема не совместимы с мобильными устройствами.
Вот модификация его второго решения, которое работает в Edge, IE, Opera, FF, Chrome, iOS Safari и мобильных эквивалентах (которые я мог протестировать):
Обновление 1: удалена часть requestAnimationFrame, поскольку я согласен, что в этом нет необходимости:
Обновление 2: Ответ на обновленный ответ Эндрю 2 июня 2016 года:
Спасибо, Эндрю, это работает в любом браузере, который я смог найти (Win Desktop: IE, Chrome, Opera, FF; Android Chrome, Opera и FF, iOS Safari).
Обновление 3: решение if ("oninput in slider)
Следующее, кажется, работает во всех вышеупомянутых браузерах. (Я не могу найти исходный код сейчас.) Я использовал это, но впоследствии это не помогло в IE, и поэтому я пошел искать другой, поэтому я оказался здесь.
Но прежде чем я проверил ваше решение, я заметил, что это снова работает в IE - возможно, был какой-то другой конфликт.
источник
Для хорошего кросс-браузерного поведения и понятного кода лучше всего использовать атрибут onchange в комбинации формы:
То же самое с использованием oninput , значение изменяется напрямую.
источник
Еще один подход - просто установить флаг на элементе, указывающий, какой тип события должен быть обработан:
источник
Вы можете использовать событие JavaScript «ondrag» для непрерывного запуска. Это лучше, чем «ввод» по следующим причинам:
Поддержка браузера.
Может различать события ondrag и change. «вход» запускается как для перетаскивания, так и для изменения.
В jQuery:
Ссылка: http://www.w3schools.com/TAgs/ev_ondrag.asp
источник