Показать сообщение отдельно
  #5 (permalink)  
Старый 25.12.2012, 09:18
Интересующийся
Отправить личное сообщение для SegaMega Посмотреть профиль Найти все сообщения от SegaMega
 
Регистрация: 20.09.2012
Сообщений: 16

Сорри Всем ))
Уважаемые Господа!!! Вынужден признать свою грубую ошибку, публично покаяться и как-то попытаться реабилитироваться в глазах всех, кто читал моё первое сообщение... К тому же надеюсь, данная тема поможет тем кто плавает ещё в JavaScript - обязательно меня поправьте, если что!!! Итак пойдём вместе логичным путём с самого начала:
  1. Есть ссылка с id="respect"
    <a href="http://javascript.ru" id="respect">Ссылка</a>
    
  2. Нужно на событие клика по ней повесить функцию RightMessage, показывающую алертом какой-нить атрибут ссылки... и соответственно DOM-объект этой ссылки должен быть доступен в теле функции.

Назначаем функцию одним из способов:
из HTML (инлайновый способ типа):
<a href="http://javascript.ru" id="respect" onclick="RightMessage();return false;">Ссылка</a>

или из JS после готовности DOM документа
var resp=document.getElementById("respect");
resp.attachEvent( "onclick" , RightMessage); // только для IE или Opera. В теле функции this будет указывать на глобальный объект window (!)

или
resp.addEventListener( "click" , RightMessage, false) // только для браузеров, поддерживающих стандарт W3C. В теле функции this будет указывать на исходный объект, т.е. resp (!)

или
resp.onclick=RightMessage; // кросс-браузерно и this 100% указывает на resp!!!

или
resp.onclick=RightMessage.call(this); //  Вот с этим честно признаюсь - пока не разобрался, но здесь ошибка 100% !!! т.к. идёт не присвоение функции событию клика, а ВЫЗОВ функции...

Вот грамотные ссылки по теме:
http://javascript.ru/tutorial/events/ - назначение событий
http://habrahabr.ru/post/119841/ - вызовы функции

Итак теперь переходим к самой функции RightMessage
function RightMessage(event) {
event = event || window.event; // event или window.event (для IE) = объект "событие"

// попутный вопрос №1: можно и грамотно ли писать так, раз работает?!
// var aobj=this || event.srcElement;

var aobj=event.target || event.srcElement; // event.target/srcElement - означает исходный элемент, на котором произошло событие.

alert(aobj.id); // выводим атрибут ID ссылки (aobj=resp) 

return false; // отмена перехода по дефолтной ссылке 
}


Сразу разберём мои ошибки:
1) var aobj=this || event.srcElement;
так ни в коем случае писать нельзя, для получения исходного объекта!!! во всяком случае при назначении событий через attachEvent (для IE). Почему?! Да потому что this = window в IE, а event.srcElement - исходный элемент (т.е. resp) В итоге получим: aobj=window или resp (!!!) - значит, aobj мы присвом глобальный объект window ((( А это не гуд ((

Вот для resp.addEventListener(...) или для resp.onclick=RightMessage; в теле функции this будет указывать на resp 100%

2) Дальше... какого фига я вообще использую event.target || event.srcElement; для получения (!) объекта в теле функции, которая весит на этом же объекте?! Эту тему грамотно использовать при делегировании например (http://learn.javascript.ru/event-delegation).

В общем... хотел-то всего-навсего просто в теле функции, повешенной на ссылку через attachEvent или addEventListener, получить быстрый доступ к объекту этой ссылки... а получилось каши....

Объясните мне ещё раз плз несколько моментов:
1) как использовать конструкцию вида RightMessage.call(this), чтобы 100% this в теле функции указывал на исходный объект?! - если это вообще правильный вопрос... насколько я понял (http://javascript.ru/Function/call) - это именно ВЫЗОВ ф-ии...
2) как грамотно повесить событие через attachEvent, чтобы опять же в теле ф-ии this указывал на исходный объект? вариант resp.onclick=RigthMessage; - не вариант ))
3) как передавать АРГУМЕНТЫ в функцию при её назначении событию?! т.е. что-то типа:
var arg="hello";
resp.onclick=RigthMessage(arg); // неправильно
resp.addEventListener('click', RigthMessage(arg), false);  // неправильно


Заранее спасибо за помощь всем...
Ответить с цитированием