Я хотел бы иметь две (или даже более) идентичные html-формы на моем сайте.
Например, один - вверху, а другой - в нижней части страницы.
Я хочу, чтобы у них был точно такой же контент в любой момент времени. Если пользователь изменяет значение в одном из них, все остальные обновляются.
Есть ли лучший способ синхронизации javascript onchange
/onkeyup
событий?
onchange
стреляет только после того, как элемент теряет фокус.
onkeyup
также не идеален. Он тратит много процессора на длительное копирование текста и не срабатывает, если элемент потерял фокус между событиями onkeydown
и onkeyup
.Синхронизация идентичных форм html
ответ
Обновление: Я только что узнал, что для этого HTML5 есть более подходящее событие, oninput
, но, конечно же, оно не работает в старых браузерах. oninput
обнаружит любое изменение текста, включая Paste
, Cut
и Delete
в меню правой кнопки мыши. Таким образом, лучшим вариантом может быть проверка, поддерживает ли браузер oninput
(например, с помощью рекомендованной функции here), возвращаясь к методу ниже, если нет. В более старых версиях IE onpropertychange
может использоваться для имитации oninput
.
Я решил изменить свой ответ на основе того, как KnockoutJS выполняет это. Из this page в Knockout документы:
«afterkeydown» - обновляет модель представления, как только пользователь начинает вводить характер. Это работает, улавливая событие keydown браузера и обрабатывая событие асинхронно.
Из этих вариантов «afterkeydown» - лучший выбор, если вы хотите сохранить свою модель обзора в режиме реального времени.
Выполняет асинхронное поведение с использованием setTimeout
с нулевым значением времени. Кроме этого, он выглядит как обычный обработчик события keydown
.
Вот простой пример, используя JQuery, который я считаю, ведет себя равносильно «afterkeydown» событие KNOCKOUT в:
$('#email').keydown(function() {
setTimeout($.proxy(handler, this), 0);
});
function handler() {
console.log(this.value);
}
Примечание: Это не поймаешь правой кнопкой мыши пастообразных события и события перетаскивания и падение , Если вы хотите обновить текст на этих событиях тоже просто слушать их в том же порядке, как KeyDown, например:
$('#email').on('keydown paste drop', function() {
setTimeout($.proxy(handler, this), 0);
});
Как keydown
, paste
и drop
также нуждаются в setTimeout
для обновления с последним значением текста.
Оригинальный ответ:
onkeyup
, вероятно, путь, но вы поднимаете хороший момент об этом не стрелять, если элемент теряет фокус между KeyDown и KeyUp.Основываясь на this answer, я уверен, что решение будет состоять в том, чтобы прослушать событие keyup на элемент контейнера (или на теле, хотя в этом случае, вероятно, было бы наиболее целесообразно связать его с элементом <form>
).
Что касается использования процессора при вставке, вы можете попробовать отменить событие, если не прошло определенного времени (скажем, 50 мс) ... надеюсь, этого будет достаточно. Если нет, вы можете посмотреть, как некоторые из популярных двухсторонних структур привязки данных справляются с этим ... большинство из тех, что я видел, используют onkeyup
.
Для тех, кому это интересно, это соответствующий исходный файл в файле knockout.js: https://github.com/SteveSanderson/knockout/blob/master/src/binding/defaultBindings/value.js (поиск «keydown») , –
Этот метод все еще не совсем быстр, но я не думаю, что его можно ускорить без использования указателей, которых не хватает javascript. В противном случае это прекрасно работает, спасибо. – user2052437
Подход «afterkeydown», казалось, быстрее реагировал на меня, чем прослушивание клавиш и размытие (размытие вместо изменения из-за потерянного фокуса до того, как вы описали проблему с ключом) ... Я бы предположил, что это может быть неверно, если есть другие вещи однако в фоновом режиме. Это действительно единственные способы немедленного реагирования Javascript на изменения текста. –
- 1. JQuery.Validate() для идентичных форм
- 2. Отправка нескольких идентичных форм?
- 3. Синхронизация двух оконных форм C#
- 4. C# Синхронизация двух идентичных наборов данных через веб-службу
- 5. Несколько идентичных форм на странице в asp.net. Как получить переменные?
- 6. jQuery: ошибка определения значений текстовой области из нескольких идентичных форм
- 7. Два идентичных репозитория git
- 8. Как предотвратить заполнение пустых форм HTML-форм?
- 9. Понимание HTML-форм submittion
- 10. Предустановленное значение HTML-форм
- 11. Проблемы с HTML-форм
- 12. Конфликт двух HTML-форм
- 13. Создание семантических форм HTML
- 14. Создание форм и html
- 15. Формы внутри форм HTML
- 16. Синхронизация объекта с таблицей HTML
- 17. Передача нескольких форм через AJAX - синхронизация или async
- 18. условное отображение форм элементов html
- 19. HTML несколько форм Ajax submit
- 20. Выгрузка форм в HTML выпуска
- 21. Как спланировать «безопасный» HTML-ФОРМ
- 22. Проверка HTML-форм в Web2py
- 23. HTML-обработка PHP-форм; Переменная
- 24. Несколько форм на 1 html
- 25. Использование HTML-форм с PHP
- 26. Какова цель генератора форм HTML?
- 27. Использование нескольких форм в HTML
- 28. Как перенаправить ответ HTML-форм
- 29. Вставка форм HTML-форм в таблицу MySQL (с использованием PDO)
- 30. Синхронизация строки Android и преобразование объектов html
Возможно, вы могли бы попробовать что-то вроде knockoutjs, может быть слишком тяжело для синхронизации нескольких форм. –
. Вот мысль ... Почему бы нет, когда одно поле сосредоточено, оно захватывает данные из другого поля, если Это здесь. Если нет, он ничего не делает. Если бы это был я, я бы, наверное, что-то сделал на мероприятии размытия. – Leeish
@ Leeish это будет выглядеть очень грубо imo – user2052437