Триггер jQuery не срабатывает после клона - PullRequest
4 голосов
/ 22 февраля 2012

У меня есть div в моем коде, и когда я его клонирую, он не запускает событие. Вот код:

<div id="draggable" onclick="alert(1);" class="ui-widget-content drag">
    <p>Drag me to my target</p>
</div>
<div id="here">
</div>

<script type="text/javascript">
    $("#draggable").clone().removeAttr("id").attr('id', 'draggable2').appendTo("#here");
    $("#draggable2").trigger('onclick');
</script>

Когда я затем щелкаю по клонированному элементу, событие обычно запускается.

Если я изменю сценарий, чтобы позволить исходному элементу сработать, он также будет работать нормально:

<script type="text/javascript">
    $("#draggable").clone().removeAttr("id").attr('id', 'draggable2').appendTo("#here");
    $("#draggable").trigger('onclick');
</script>

Также отлично работает функция привязки:

<script type="text/javascript">
    $("#draggable").clone().removeAttr("id").attr('id', 'draggable2').appendTo("#here");
    $("#draggable2").bind('click', function () { alert('2'); });
    $("#draggable2").trigger('click');
</script>

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

Ответы [ 2 ]

20 голосов
/ 22 февраля 2012

Чтобы клонировать элемент И его события, вы должны передать «true» в качестве первого аргумента.Чтобы передать события его потомков, вы также должны передать «true» в качестве второго аргумента.

$myClone = $('#element').clone( true, true );

http://api.jquery.com/clone/

0 голосов
/ 22 февраля 2012

Это хрупкий подход с самого начала.У вас есть функция для создания клона, а затем у вас есть функция, которую нужно выполнить после клонирования.Почему бы просто не вызвать эту функцию, чтобы она происходила после клонирования?Создайте повторно используемую функцию, которую можно вызывать из привязки щелчка или вызывать напрямую из функции клонирования.

Если это абсолютно необходимо, вы можете просто использовать $(selector).click(), которая вызовет событие щелчка.

[edit: я не знал о необходимости передавать 'true' в соответствии с ответом Фаунтлероя, поэтому без этого совета мой подход тоже не сработал бы.Но общий совет «это, вероятно, плохой подход» стоит]

...