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