Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.08.2013, 10:47
Новичок на форуме
Отправить личное сообщение для andrewks Посмотреть профиль Найти все сообщения от andrewks
 
Регистрация: 22.08.2013
Сообщений: 8

on('click') срабатывает не для всего контента
имеем страницу с динамически подгружаемым контентом.

вешаем обработчик
$('body').on('click', 'ul.code-lng-list li', function(e) {


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

$("ul.code-lng-list li").on("click", function(e) {

наоборот (и здесь, как раз, всё логично и в соответствии с описанием функции)

из-за чего может возникнуть такое поведение? куда рыть?
Ответить с цитированием
  #2 (permalink)  
Старый 22.08.2013, 10:58
Новичок на форуме
Отправить личное сообщение для andrewks Посмотреть профиль Найти все сообщения от andrewks
 
Регистрация: 22.08.2013
Сообщений: 8

если использовать устаревшую live


$('ul.code-lng-list li').live('click', function(e) {


поведение такое же
Ответить с цитированием
  #3 (permalink)  
Старый 22.08.2013, 11:50
Новичок на форуме
Отправить личное сообщение для andrewks Посмотреть профиль Найти все сообщения от andrewks
 
Регистрация: 22.08.2013
Сообщений: 8

итак, что нарыл самостоятельно:

часть такого контента внутри <form> - как раз здесь не срабатывает live(), но срабатываем bind(); часть (динамика) - не в <form>, там срабатывает live(), но логично не срабатывает bind()

как обойти? или вешать и через live(), и через bind() ?
Ответить с цитированием
  #4 (permalink)  
Старый 22.08.2013, 13:12
Новичок на форуме
Отправить личное сообщение для andrewks Посмотреть профиль Найти все сообщения от andrewks
 
Регистрация: 22.08.2013
Сообщений: 8

пока сделал через костыль

$('body').on('click', 'ul.code-lng-list li', function(e) {
		e.preventDefault();
		BBCode.fixedLangSel(this);
	});
	
	$("form ul.code-lng-list li").on("click", function(e) {
		e.preventDefault();
		BBCode.fixedLangSel(this);
	});


но, может, всё-таки есть нормальное решение?
Ответить с цитированием
  #5 (permalink)  
Старый 22.08.2013, 17:54
Аватар для kuzroman
Кандидат Javascript-наук
Отправить личное сообщение для kuzroman Посмотреть профиль Найти все сообщения от kuzroman
 
Регистрация: 26.11.2010
Сообщений: 124

Сообщение от andrewks Посмотреть сообщение
пока сделал через костыль
$('body').on('click', 'ul.code-lng-list li', function(e)
А что здесь костыльного?
Делегированный вызов события, все норм.

второй event можно убрать $("form ul.code-lng-list li").on("click", function(e)

Последний раз редактировалось kuzroman, 22.08.2013 в 17:57.
Ответить с цитированием
  #6 (permalink)  
Старый 22.08.2013, 18:40
Новичок на форуме
Отправить личное сообщение для andrewks Посмотреть профиль Найти все сообщения от andrewks
 
Регистрация: 22.08.2013
Сообщений: 8

Сообщение от kuzroman Посмотреть сообщение
А что здесь костыльного?
Делегированный вызов события, все норм.

второй event можно убрать $("form ul.code-lng-list li").on("click", function(e)
костылность как раз во втором эвенте, его убрать нельзя, иначе события для элементов внутри <form> срабатывать не будут

вот что нарыл:
http://stackoverflow.com/questions/1...on-inside-form
http://stackoverflow.com/questions/1...ide-a-form-tag

придётся, видимо костыль оставить
Ответить с цитированием
  #7 (permalink)  
Старый 22.08.2013, 19:15
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,744

Сообщение от andrewks
в итоге обработчик срабатывает только для динамически подгруженного контента, но не срабатывает для уже имеющегося.
а теперь поподробнее что не так
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<form>
	<input type="text" />
	<input type="password" />
	<button class="btn-login">Log in</button>
 </form>
 <button class="add">add</button>
<script>
$(document).ready(function () {
	document.body.onbeforeunload = function () {
		return "good bye";
	}
	$('form').on("click", ".btn-login", function () {
		alert("Button clicked!");
	});
	$(".add").on("click", function () {
		$("form").append('<button class="btn-login">Log in</button>');
	});
});
</script>
Ответить с цитированием
  #8 (permalink)  
Старый 23.08.2013, 09:32
Новичок на форуме
Отправить личное сообщение для andrewks Посмотреть профиль Найти все сообщения от andrewks
 
Регистрация: 22.08.2013
Сообщений: 8

Сообщение от bes Посмотреть сообщение
а теперь поподробнее что не так
я понимаю, что в это сложно поверить, не видя собственными глазами, но ситуация такая:

есть некая страничка, на которой есть некий вид управляющих элементов.

часть их подгружается статично при загрузке странички, и распоалагюся в теге <form>, а часть подгружаются динамически и расположены вне <form>, в обычном <div>

так вот, обработчик на событие 'click', навешиваемый с помощью live()/on()
$('ul.code-lng-list li').live('click', function(e) {
$('body').on('click', 'ul.code-lng-list li', function(e) {

срабатывает только для элементов, расположенных в <div>, но не срабатывает для элементов, расположенных в <form>.

в то же самое время обработчик, навешиваемый с помощью
$("ul.code-lng-list li").on("click", function(e) {
срабатывает для статичных элементов в <form> (и естественно не срабатывает для динамических)

вот и возник вопрос, отчего может появляться такой артефакт в поведении
Ответить с цитированием
  #9 (permalink)  
Старый 23.08.2013, 09:36
Новичок на форуме
Отправить личное сообщение для andrewks Посмотреть профиль Найти все сообщения от andrewks
 
Регистрация: 22.08.2013
Сообщений: 8

в общем, ситуация примерно как описанная в http://stackoverflow.com/questions/1...ide-a-form-tag

при замене <form> на <div> - работает


самое поганое то, что в созданном мной тестовом примере - работает и с <form> и с <div>

более того, скачал пример из http://stackoverflow.com/questions/1...ide-a-form-tag - он у меня тоже работает и с <form> и с <div>

короче, шайтанама какая-то, куда рыть, не знаю, поставил костыль пока
Ответить с цитированием
  #10 (permalink)  
Старый 23.08.2013, 11:00
Новичок на форуме
Отправить личное сообщение для andrewks Посмотреть профиль Найти все сообщения от andrewks
 
Регистрация: 22.08.2013
Сообщений: 8

дико извиняюсь, ложная тревога.

в проблеме разобрался, на пути оказался "лишний" перехватчик в bubble , влияние которого я не учёл

всем спасибо за участие
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Модуль для работы с модулями JSprog Ваши сайты и скрипты 29 02.09.2009 13:31
Для события onCLick получить индекс строки и объект грида. progi2007 ExtJS 4 05.08.2009 11:31
Функция onclick для созданных потомков Groonel Общие вопросы Javascript 6 24.04.2009 18:35
простой show/hide для контента M.C. Элементы интерфейса 44 17.01.2009 19:29