Как найти все события внутри контейнера и делегировать их
Предположим, у меня есть разметка, как это
<div class="container">
<div class="abc" onclick="alert(this.innerHTML)">ABC</div>
<div class="abc1">ABC</div>
<div class="abc2">abc2</div>
<div class="xys3">xys3</div>
<div class="asd23">asd223</div>
</div>
И есть события, которые связаны с children
из container
как это
$( ".abc1" ).bind( "click", function(){
alert( $( this ).html() );
} );
$( ".abc2" ).bind( "click", function(){
alert( $( this ).html() );
} );
$( ".xys3" ).bind( "click", function(){
alert( $( this ).html() );
} );
$( ".asd23" ).bind( "click", function(){
alert( $( this ).html() );
} );
Теперь я достал HTML из контейнера и снова установил его:
var html = $( ".container" ).html();
// a set missing here to convert 'bind' events to 'on' events
$( ".container" ).html( html );
События не будут работать сейчас, так как они не были делегированы для начала. Кроме того, контейнер может иметь больше элементов (они являются динамическими).
Можно ли найти все события внутри контейнера и делегировать их?
Вот скрипка
2 ответа
Начиная с jQuery 1.7,
.on()
Метод является предпочтительным методом для присоединения обработчиков событий к документу. Для более ранних версий.bind()
Метод используется для прикрепления обработчика событий непосредственно к элементам.
Так что просто используйте делегирование событий на (), и это решит проблему:
$( "body" ).on( "click", ".abc2", function(){
alert( $( this ).html() );
});
Вы можете добавить общий класс ко всем элементам div, а затем присоединить к нему событие click:
HTML:
<div class="container">
<div class="my-class abc" onclick="alert(this.innerHTML)">ABC</div>
<div class="my-class abc1">ABC</div>
<div class="my-class abc2">abc2</div>
<div class="my-class xys3">xys3</div>
<div class="my-class asd23">asd223</div>
</div>
JS:
$( "body" ).on( "click", ".my-class", function(){
alert( $( this ).html() );
});
Надеюсь это поможет.
$( "body" ).on( "click", ".my-class", function(){
alert( $( this ).html() );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<div class="my-class abc" onclick="alert(this.innerHTML)">ABC</div>
<div class="my-class abc1">ABC</div>
<div class="my-class abc2">abc2</div>
<div class="my-class xys3">xys3</div>
<div class="my-class asd23">asd223</div>
</div>
Методы делегирования такие:
$(document).on( "click", ".abc1", function(){
alert( $( this ).html() );
});
Ты можешь измениться $(document)
с элементом в DOM, который не изменился, и это родительский элемент для дочерних элементов, которые необходимо делегировать. С документом будет работать во всех случаях, но производительность может быть меньше.