2015-05-07 3 views
1

Я перестраиваю с помощью javascript для настройки опцию элементов на основе ввода пользователем.восстанавливать или сохранять события выбора после .replaceWith()

На начальной странице загрузки я храню все выбора опций в «countryOptions» и на основе пользовательского ввода я MATCH все содержащиеся в нем выбора опций моих «countryOptions» с новым подмножеством и создать новый выбрать элемент как «newSelect», чтобы записать его в DOM с помощью .replaceWith(newSelect).

выберите элемент имеет на изменение слушателя:

$(countrySelector).on('change', function(){...}); 

Я не использую .html(), потому что, как известно, проблемы в некоторых версиях IE при использовании .html() на выберите элемент. При замене выберите элемент с .replaceWith(), все обработчики событий удалены, как предназначено, .replaceWith().

Я не использую CSS для «скрытия» выберите опцию элементов, потому что это не работает в перекрестном браузере.

Теперь я ищу альтернативу, которая работает с перекрестным браузером или способ сохранить/восстановить обработчики событий. Есть идеи?

+2

Что о делегированных обработчиков событий? – Regent

+0

Если вы используете 'clone()' inside 'replaceWith()' и передаете ему true: '$ ('element'). Clone (true)' обработчики событий копируются. –

+0

Что такое 'countrySelector', селекторная строка? –

ответ

1

Проще всего было бы использовать обработчики событий делегата, которые вы можете связывать каждый раз при замене своих элементов. Но если вы не хотите или не можете сделать это по какой-либо причине, вы можете получить все обработчики событий с

$._data(countrySelector, "events"); 

Но следует помнить, что countrySelector должен быть HTML, а не элемент JQuery. Он возвращает объект со всеми обработчиками, которые затем можно привязать к новому элементу.

Пример кода для делегатов:

function countrySelectorChange() { 
    // do your magic 
} 

Затем связать делегат к событию:

$(countrySelector).on('change', countrySelectorChange); 

Повторите эту операцию для каждого добавленного элемента вам нужно для.

newSelect.on('change', countrySelectorChange); 
+0

Вы столкнулись с идеей использовать делегированный обработчик событий. Я принял другой ответ, потому что сначала увидел его, и у него есть пример кода. Ваш ответ хорош тем не менее, потому что вы назвали правильный ответ и даже предоставили альтернативу ... трудно выбрать между обоими ответами. Если бы вы включили образец короткого кода, я бы дал вам зеленую стрелку, так как он будет наиболее полезен для других пользователей. – KADlancer

+1

Я добавил пример.Не для стрелы, а для разработки того, что я имел в виду. Другое решение прекрасно, как есть. Я лично предпочитаю не использовать «глобальных» обработчиков событий всякий раз, когда могу, но это недействительное и простое решение. – ImreNagy

3

может помочь

$(document).on('change', countrySelector , function(){...}); 
+1

Иногда решение настолько простое, что ему не хватало лицевого фона ... Это фиксировало его для меня, и я даже понимаю его ... должно было видеть это сам. Спасибо! – KADlancer

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