Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.01.2011, 20:45
Интересующийся
Отправить личное сообщение для DimonCry Посмотреть профиль Найти все сообщения от DimonCry
 
Регистрация: 04.01.2011
Сообщений: 23

Как сделать функцию, которая могла бы возврщать объект по клику на нем
Другими словами, есть документ, в нем есть несколько дивов (которые находятся не сразу в body), а в другом родительском диве. Необходима функция, которая возвращала тот объект по которому кликнули в этом родительском диве.
Нужна функция, ну или какие-нибудь идеи...
Ответить с цитированием
  #2 (permalink)  
Старый 14.01.2011, 21:04
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

Просто навешиваете обработчики события "click" на нужные дивы, а информация о кликнутом в данный момент диве приходит в обработчик как аргумент в виде атрибута target или srcElement объекта Event.

Более того, ключевое слово this в обработчике указывает на объект, вызвавший событие.

Последний раз редактировалось Amphiluke, 14.01.2011 в 21:08.
Ответить с цитированием
  #3 (permalink)  
Старый 14.01.2011, 21:09
Интересующийся
Отправить личное сообщение для DimonCry Посмотреть профиль Найти все сообщения от DimonCry
 
Регистрация: 04.01.2011
Сообщений: 23

Amphiluke, эти дивы создаются динамически. А как им можно в таком случае навешать обработчики?
их количество заранее не известно
Ответить с цитированием
  #4 (permalink)  
Старый 14.01.2011, 21:13
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

А создаются кем? Вы их создаете? Если да, то при создании и задавайте им в атрибуте onclick ссылку на обработчик.
Ответить с цитированием
  #5 (permalink)  
Старый 14.01.2011, 21:15
Интересующийся
Отправить личное сообщение для DimonCry Посмотреть профиль Найти все сообщения от DimonCry
 
Регистрация: 04.01.2011
Сообщений: 23

ааа... блин, точно! Спасибо!
Ответить с цитированием
  #6 (permalink)  
Старый 14.01.2011, 21:16
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Сообщение от DimonCry
не сразу в body), а в другом родительском диве
что за бред, излагайте свои мысли конкретней!
Обход дочерних элементов:
<script type="text/javascript">
window.onload = function(){
    var element = document.getElementById('div'), children = element.childNodes,  i = children.length;
    if(element.hasChildNodes()){
        while(i--){
            children[i].onclick = (function(i){
                return function(){
                    children[i].nodeType == 1 && alert(this.tagName + ':' + i);
                    return false;
                };
            }(i));
        }
    }
};
</script>

<div id="div">
    <a href="#">click1</a>
    <a href="#">click2</a>
</div>

Более упрощенный вариант:
<script type="text/javascript">
window.onload = function(){
    var children = document.getElementById('div').childNodes,  i = children.length;
    while(i--){
        children[i].onclick = (function(i){
            return function(){
                this.nodeType == 1  && alert(this.tagName + ':' + i);
                return false;
            };
        }(i));
    }
};
</script>

<div id="div">
    <a href="#">click1</a>
    <a href="#">click2</a>
</div>

Обход определенных дочерних элементов (упорядоченный nodeList):
<script type="text/javascript">
window.onload = function(){
    var children = document.getElementById('div').getElementsByTagName('a'),  i = children.length;
    while(i--){
        children[i].onclick = (function(i){
            return function(){
                alert(this.tagName + ':' + i);
                return false;
            };
         }(i));
    }
};
</script>

<div id="div">
    <a href="#">click1</a>
    <a href="#">click2</a>
</div>

Более упрощенный вариант обхода определенных дочерних элементов без возвращение индекса:
<script type="text/javascript">
window.onload = function(){
    var children = document.getElementById('div').getElementsByTagName('a'),  i = children.length;
    while(i--){
        children[i].onclick = function(){
            this.style.color = this.style.color != 'red' ? 'red' : '';
            return false;
         };
    }
};
</script>

<div id="div">
    <a href="#">click1</a>
    <a href="#">click2</a>
</div>

Или же выбрать элемент на котором произошло событие:
<script type="text/javascript">
window.onload = function(){
    var children = document.getElementById('div').getElementsByTagName('a'),  i = children.length;
    while(i--){
        children[i].onclick = function(event){
            var event = event || event.window, element = (event.target) ? event.target : event.srcElement;
            element.style.color = element.style.color != 'red' ? 'red' : '';
            return false;
        };
    }
};
</script>

<div id="div">
    <a href="#">click1</a>
    <a href="#">click2</a>
</div>

Последний раз редактировалось monolithed, 14.01.2011 в 21:39.
Ответить с цитированием
  #7 (permalink)  
Старый 14.01.2011, 21:21
Аватар для Amphiluke
   ☽
Отправить личное сообщение для Amphiluke Посмотреть профиль Найти все сообщения от Amphiluke
 
Регистрация: 07.01.2011
Сообщений: 254

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

<div id="adiv"></div>
<script type="text/javascript">
	function foo(e) {
		if (!e) e = event;
		var sender = (e.target) ? e.target : e.srcElement;
		alert(sender.innerHTML);
	}
	var adiv = document.getElementById("adiv");
	if (adiv.addEventListener) {
		adiv.addEventListener("click", foo, false);
	} else {
		adiv.attachEvent("onclick", foo);
	}
	adiv.innerHTML = "<div>ololo</div><div>I'm a div</div><div>O_o</div>";
</script>
Ответить с цитированием
  #8 (permalink)  
Старый 14.01.2011, 21:39
Интересующийся
Отправить личное сообщение для DimonCry Посмотреть профиль Найти все сообщения от DimonCry
 
Регистрация: 04.01.2011
Сообщений: 23

Сообщение от monolithed
излагайте свои мысли конкретней!
я имел ввиду: не сразу в боди, они находятся, а через несколько уровней его потомков.(хотя это было не так важно)
спасибо за ответ, сейчас буду разбираться в нем...
Ответить с цитированием
  #9 (permalink)  
Старый 14.01.2011, 21:46
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

Amphilukehttp, точно, есть же еще и такой вариант, а то запамятовал (тоже добавил выше)
кстати, если еще не знаете как запускать код на форуме, прочтите тут

Сообщение от DimonCry
я имел ввиду: не сразу в боди
Сообщение от DimonCry
а через несколько уровней его потомков
одно другому противоречит. поясните или лучше покажите код?

Последний раз редактировалось monolithed, 14.01.2011 в 21:53.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать объект не изменяемым? Major_Krieg Серверные языки и технологии 1 07.11.2009 02:54
Как сделать ссылку картинку, которая изменяется при наводе курсора на неё? Кирилл Общие вопросы Javascript 2 10.03.2009 15:14
как сделать гиперсылку на объект javascript??? kos_walker Общие вопросы Javascript 3 30.09.2008 06:58
Как сделать функцию типа toDataUrl для рисунка в ie6 ? Олег Общие вопросы Javascript 2 14.09.2008 00:06