JQuery Clone - запуск одного и того же события на обоих элементах
Если я клонирую элемент с событиями .clone(true)
и добавить его на той же странице. Могу ли я вызвать одно и то же "живое" событие клика на обоих.
Например, если я создаю свое собственное меню выбора, используя элементы 'ul' и 'li', и добавляю событие 'live' click 'к его классу, например,'.selectOption '. Могу ли я изменить исходный элемент, если клонированный?
У меня действительно нет примера кода, но я столкнулся с проблемой раньше. Оригинал остается прежним, если вы выберете один из вариантов. Я попытался вызвать клик на оригинале, но это тоже не работает.
Я не понимаю, почему событие не внесет оба изменения. Это указывает на оба, потому что они имеют один и тот же класс и структуру.
1 ответ
Вместо того, чтобы использовать .delegate()
или же .live()
, вы должны попробовать использовать .on()
вместо. Допустим, вы клонируете элемент с элементом имени класса, затем вы можете использовать следующий код для привязки события, например, события click:
$(document).on('click', '.item', function() {
// Do magic here that changes things in both the original item and its cloned counterpart
});
Как .on()
работает то, что он прослушивает события, чтобы всплыть дерево DOM, пока не достигнет выбранного вами интересующего элемента, и в этом случае, document
, Предостережение заключается в том, что элемент, который вы слушаете при всплытии событий, должен присутствовать в DOM при выполнении jQuery, и document
это самый безопасный способ сделать это. Конечно, вы также можете использовать .on()
на других статических элементах, присутствующих в DOM, таких как <body>
,
ОП предоставила дополнительную информацию. Похоже, что OP хочет, чтобы изменения, внесенные в один элемент, распространялись на его клонированную копию, а не просто связывали одни и те же обработчики с клонированными элементами.
$(document).ready(function () {
var $selectMenu = $('.selectMenu');
$selectMenu.on('click', 'li', function () {
$(this).css('background','red');
});
$selectMenu.clone(true).appendTo('body');
});
В этом случае я бы выступил за использование индексов (с .index()
) для трансляции DOM в контексте родителя элемента.
$(document).ready(function () {
var $selectMenu = $('.selectMenu');
$selectMenu.on('click', 'li', function () {
$(".selectMenu").find('li:eq('+$(this).index()+')').css('background','red');
});
$selectMenu.clone(true).appendTo('body');
});
Смотрите скрипку здесь: http://jsfiddle.net/teddyrised/4Jxv2/2/
Также возможны некоторые улучшения:
- Добавлять / удалять классы вместо прямого манипулирования встроенным CSS элемента
- использование
.on()
так что вы можете связать события, которые изначально не связаны с элементом, перед клонированием.
Смотрите пересмотренную функцию ниже:
$(document).ready(function () {
// Clone first, worry about binding events later
$('.selectMenu').clone(true).appendTo('body');
// Bind events
$(document).on('click', '.selectMenu li', function() {
$('.selectMenu')
.find('li:eq('+$(this).index()+')')
.addClass('highlighted');
});
});
где класс .highlighted
может использоваться для объявления цвета фона:) См. скрипку здесь: http://jsfiddle.net/teddyrised/4Jxv2/3/