Всплытие событий

Последнее обновление: 1.11.2015

Допустим, у нас есть следующая структура документа:

<body>
	<div>
		<button>Жми</button>
	</div>
</body>

Таким образом, у нас трехуровневая структура: на самом высоком уровне - элемент body, ниже - элемент div, и в самом низу - элемент button. Теперь добавим для каждого последовательно обработчики нажатия:

$('button').bind('click', function(e){
		console.log('Событие инициировал элемент ' + e.target.tagName);
		console.log('Событие обрабатывается для элемента ' + e.currentTarget.tagName);
	});
	$('div').bind('click', function(e){
		console.log('Событие инициировал элемент ' + e.target.tagName);
		console.log('Событие обрабатывается для элемента ' + e.currentTarget.tagName);
	});
	$('body').bind('click', function(e){
		console.log('Событие инициировал элемент ' + e.target.tagName);
		console.log('Событие обрабатывается для элемента ' + e.currentTarget.tagName);
	});

Итак, если мы нажмем на кнопку, то сработает не только собственно обработчик кнопки, но и обработчики выше лежащих уровней. Так как нажатие на кнопку - это в то же время нажатие и на элемент div и на элемент body, так как кнопка находится внутри них. Произойдет всплытие событие. То есть с каждым уровнем выше будут просматриваться обработчики события click и, если они имеются, они будут вызываться.

Однако мы можем запретить всплытие. Например, нам надо, чтобы срабатывал только обработчик нажатия кнопки. В этом случае нам надо применить метод stopPropagation:

	$('button').bind('click', function(e){
		console.log('Событие инициировал элемент ' + e.target.tagName);
		console.log('Событие обрабатывается для элемента ' + e.currentTarget.tagName);
		e.stopPropagation();
	});

Теперь обработчики вышележащих уровней не будут задействованы.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850