Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.02.2013, 13:39
Аспирант
Отправить личное сообщение для NeVirus Посмотреть профиль Найти все сообщения от NeVirus
 
Регистрация: 09.01.2013
Сообщений: 54

Передать событие предку
Добрый день,

такая ситуация - есть динамически созданная сетка из div' ов, в самих дивах лежат span' ы и картинки (то же все создается динамически), при клике на div выскакивает popup окошко с инфой конкретно по объектам того div' а на который тыкнули. Вот так инфа загоняется в popup:

open: function() {	
					var goods_id = event.target.id;
					$('#popup_id').val(goods_id);
					$('#popup_type').val(JSON.stringify( goods[goods_id-1].type));
					$('#popup_title').val(JSON.stringify( goods[goods_id-1].title));
					$('#popup_manufacturer').val(JSON.stringify( goods[goods_id-1].manufacturer));
					$('#popup_description').val(JSON.stringify( goods[goods_id-1].description));
					$('#popup_price').val(JSON.stringify( goods[goods_id-1].price));
					$('#popup_in_stock').val(JSON.stringify( goods[goods_id-1].in_stock));
					},


Тут все понятно и работает. Но если клик был по потомку div' a например по вставленной картинке то соответственно ID не получается процедурой и инфа не достается.
Итак вопрос - как можно заставить обрабатывать клик по потомку как клик по предку, попутно остановив клик по самому потомку? С виду все просто но из за того что все создается динамически выходит много проблем(

P.S. не по теме, но то же нужно - как можно ajax запросом обновить данные в файле json? хотя бы намек
Ответить с цитированием
  #2 (permalink)  
Старый 28.02.2013, 15:13
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,252

Сообщение от NeVirus
как можно заставить обрабатывать клик по потомку как клик по предку, попутно остановив клик по самому потомку?
Это как понять?
В каком бы месте "предка" ты не ткнул - его событие таки выполнится, если всплытие события не остановить
http://javascript.ru/tutorial/events...ovka-vsplytiya
Ответить с цитированием
  #3 (permalink)  
Старый 28.02.2013, 16:12
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

NeVirus, я не понял, а на какой элемент обработчик навешан? В обработчике this указывает на элемент, на котором навешан обработчик, а event.target - на элемент, на котором событие было инициировано (то есть в данном случае непосредственно элемент, по которому кликнули)
Ответить с цитированием
  #4 (permalink)  
Старый 28.02.2013, 21:17
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от danik.js
В обработчике this указывает на элемент, на котором навешан обработчик,
только не в ИЕ.
<head>
<meta charset="utf-8">
<title>Документ без названия</title>
<style type="text/css">
#apDiv1 {
	position:absolute;
	width:200px;
	height:115px;
	z-index:1;
	background-color: #0000FF;
}
#apDiv2 {
	position:absolute;
	width:155px;
	height:73px;
	z-index:1;
	background-color: #FFFF00;
	left: 25px;
	top: 16px;
}
</style>
</head>

<body>
<div id="apDiv1">
  <div id="apDiv2">Click</div>
</div>
<script>
 if (document.attachEvent) document.getElementById('apDiv1').attachEvent('onclick',function(){alert(this.id)});
 else document.getElementById('apDiv1').addEventListener('click',function(){alert(this.id)},false);
</script>
</body>

Последний раз редактировалось dmitriymar, 28.02.2013 в 23:39.
Ответить с цитированием
  #5 (permalink)  
Старый 01.03.2013, 00:27
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от dmitriymar
только не в ИЕ.
Это можно дописать практически к любому высказыванию. Только с маленькой поправкой: "только не в древних ИЕ".

Например это же применимо и к:
Сообщение от danik.js
event.target
Вместо которого с старых ишаках srcElemement.

Спысла упоминать это нет, так как видно что автор использует jQuery. Так или иначе все это легко воркэраундится и не создает серьезных проблем.

Другое дело с фазой перехвата и с stopImmediatePropagation - тут беда..
Ответить с цитированием
  #6 (permalink)  
Старый 01.03.2013, 01:23
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,144

Сообщение от NeVirus
при клике на div
так и берите id того дива к которому привязан клик ...
2 варианта $(this).attr('id') или event.delegateTarget.id
<!DOCTYPE HTML>

<html>
<head>
  <title></title>
  <script src="http://code.jquery.com/jquery-latest.js" type="text/javascript">
</script>
  <script type="text/javascript">
        $(function () {
                         $("#apDiv1").click(function (event) {
                         alert("event.target.id : "+event.target.id
                         +"\n$(this).attr('id') : "+$(this).attr('id')
                         +"\nevent.delegateTarget.id : "+event.delegateTarget.id);
                    });
                });


  </script>
  <meta charset="utf-8">

  <title>Документ без названия</title>
  <style type="text/css">
#apDiv1 {
    position:absolute;
    width:400px;
    height:215px;
    z-index:1;
    background-color: #0000FF;
  }
  #apDiv2 {
    position:absolute;
    width:355px;
    height:173px;
    z-index:1;
    background-color: #FFFF00;
    left: 25px;
    top: 16px;
  }
  </style>
</head>

<body>
  <div id="apDiv1">
    <div id="apDiv2">Click<img src="http://javascript.ru/forum/images/ca_serenity/misc/logo.gif"
    border="0" alt=""></div>
  </div>
</body>
</html>
Ответить с цитированием
  #7 (permalink)  
Старый 01.03.2013, 07:50
Аспирант
Отправить личное сообщение для NeVirus Посмотреть профиль Найти все сообщения от NeVirus
 
Регистрация: 09.01.2013
Сообщений: 54

Спасибо всем кто отписался,

что такое всплытие я знаю, про "delegateTarget" тоже - вся проблема в том что элементы создаются динамически "event.delegateTarget" возвращает в этом случае "#document".

Я могу получить ID нужного дива вот так
$(this).parent(this).attr("id");

но обработать событие клика по нему у меня не выходит (

UPD:

Все разобрался... отсеял event.target' ы по наличию нужного предка в самой процедурке вызова поп-апа, ну а вопрос с делегированием на динамических объектах видимо пока останется открытым

Последний раз редактировалось NeVirus, 01.03.2013 в 08:42.
Ответить с цитированием
  #8 (permalink)  
Старый 01.03.2013, 11:01
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,144

NeVirus,
наверное (но лучше сами сказали) у вас клик стоит на документе а див идёт в контексте -- поэтому конец всплытия delegateTarget это "#document".
тогда искать можно так
var goods_id = $(this).attr("id")||$(this).parents("div:first").attr("id")
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно подавить событие при подключении своего обработчика? Маэстро Firefox/Mozilla 2 03.09.2011 11:46
Отловить событие simple Events/DOM/Window 3 11.05.2011 14:20
javascript вставки в vrml сцены. Передать событие из броузера Proletariy Javascript под браузер 0 10.05.2011 12:26
Передать обработчику событие + замкнутый аргумент poorking Общие вопросы Javascript 1 26.02.2011 04:29
Как в событие объекта передать свойство метода DVVID Events/DOM/Window 8 22.02.2010 12:30