2013-02-09 2 views
1

Я хотел бы иметь две (или даже более) идентичные html-формы на моем сайте.
Например, один - вверху, а другой - в нижней части страницы.
Я хочу, чтобы у них был точно такой же контент в любой момент времени. Если пользователь изменяет значение в одном из них, все остальные обновляются.
Есть ли лучший способ синхронизации javascript onchange/onkeyup событий?
onchange стреляет только после того, как элемент теряет фокус.
onkeyup также не идеален. Он тратит много процессора на длительное копирование текста и не срабатывает, если элемент потерял фокус между событиями onkeydown и onkeyup.Синхронизация идентичных форм html

+0

Возможно, вы могли бы попробовать что-то вроде knockoutjs, может быть слишком тяжело для синхронизации нескольких форм. –

+0

. Вот мысль ... Почему бы нет, когда одно поле сосредоточено, оно захватывает данные из другого поля, если Это здесь. Если нет, он ничего не делает. Если бы это был я, я бы, наверное, что-то сделал на мероприятии размытия. – Leeish

+0

@ Leeish это будет выглядеть очень грубо imo – user2052437

ответ

2

Обновление: Я только что узнал, что для этого 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.

+0

Для тех, кому это интересно, это соответствующий исходный файл в файле knockout.js: https://github.com/SteveSanderson/knockout/blob/master/src/binding/defaultBindings/value.js (поиск «keydown») , –

+0

Этот метод все еще не совсем быстр, но я не думаю, что его можно ускорить без использования указателей, которых не хватает javascript. В противном случае это прекрасно работает, спасибо. – user2052437

+0

Подход «afterkeydown», казалось, быстрее реагировал на меня, чем прослушивание клавиш и размытие (размытие вместо изменения из-за потерянного фокуса до того, как вы описали проблему с ключом) ... Я бы предположил, что это может быть неверно, если есть другие вещи однако в фоновом режиме. Это действительно единственные способы немедленного реагирования Javascript на изменения текста. –

Смежные вопросы