Передача экземпляра класса в атрибут ноды (JavaScript)
p.s. мой мозг уже разрушен... памагите если кто сталкивался с данной проблемой, плиииз... :D
picture=function(message){
this.message=message;
var root=document.getElementById("root");
var img=document.createElement("IMG");
img.src="image.gif";
img.setAttribute("obj",this);
img.attachEvent("onmouseover",mouseover);
root.appendChild(img);
}
function mouseover(){
var obj=event.toElement.obj;
alert(obj.message);
}
var pic=new picture("message 1");
для остальных: img.addEventListener
Конечно, только в IE.
Читай про addEventListener
var obj=event.toElement.obj;
alert(obj.message);
}
event это тоже IE-Only. В Gecko он передается в первом аргументе ссылки.
Вытаскивать его нужно так:
e = e || window.event; // Теперь e точно объект события
}
Есть большие сомнения, что такие финты будут проходить везде.
Лучше так:
var img=document.createElement("IMG");
img.src="image.gif";
var _this = this;
img.onmouseover = (function(e) {
alert(_this.message);
});
event это тоже IE-Only.
Опера тоже понимает этот объект.
интересует НЕ как вызвать обработчик или получить event
а как в ноду записать сцылку на экземпляр класса
и потом в обработчике её получить?
p.s. неважно через event я её получаю или нет...
кстати такая вот фичка не прокатит...:
var img=document.createElement("IMG");
img.src="image.gif";
var _this = this;
img.onmouseover = (function(e) {
alert(_this.message);
});
потому что _this - должна находится в нутри класса... а не быть глобальной переменной, причем нужно сделать нормальный класс а не пародию на него, так что на всякий случай - использовать имена класса тоже нельзя...
Она не глобальная переменная. Она локальная в конкретном контексте вызова функции и доступна из определенного в нем обработчика черз замыкание. Каждый обработчик будет разделять свою отдельную переменную.
JS — прототипоориентированный язык, в нем нет нормальных классов.
и потом в обработчике её получить?
Ты ее успешно и записал, и оно работало в IE. А в FF и Опере нет. Почему, тебя было указано.
Но объекты соотвествующие DOM-элементам, вещь вообще капризная. Лучше туда ничего лишнего не записывать.
this.img.setAttribute("obj",this);
....
Она не глобальная переменная. Она локальная в конкретном контексте вызова функции и доступна из определенного в нем обработчика черз замыкание. Каждый обработчик будет разделять свою отдельную переменную.
В том то и дело... он будет разделять, и в итоге броузер даст ошибку потому что для ноды созданного экземпляра прототипного класса, переменных созданных в нутри конструктора, не существует, он недаст ошибку если я укажу переменную лежащую в глобальной области страницы либо полную ссылку на свойство прототипного класса.
Вот уже пятый раз перечитываю колонку, не могу найти почему же оно в FF и Opera не пишется...
В этой строчке происходит лажа.
Ты устанавливаешь совершенно непонятный атрибут для объекта.
Из-за известного глюка в IE это прокатывает, как установка свойства. А в FF нет.
чего?
Потому что используется attachEvent
Потому что неверно определяется event
Потому что используется setAttribute
this.message=message;
var root=document.getElementById("root");
var img=document.createElement("IMG");
img.src="image.gif";
img.setAttribute("obj",this);
img.attachEvent("onmouseover",mouseover);
root.appendChild(img);
}
function mouseover(){
var obj=event.toElement.obj;
alert(obj.message);
}
var pic=new picture("message 1");
var pic=new picture("message 2");
Работает в FF и Opera:
this.message=message;
this.img = document.createElement("IMG");
this.img.src="image.gif";
this.img.onmouseover=mouseover;
this.img.obj=this;
var root=document.getElementById("root");
root.appendChild(this.img);
}
function mouseover(){
alert(this.obj.message);
}
var a1=new picture("Preved medved");
var a2=new picture("Paka medved !!!");
надеюсь теперь тема закрыта... всем спасибо за внимание и потдержку... ;-)
а про className и прочее... просто прочитал статейку и понял что они в примерах пытались изменить стандартные атрибуты через setAttribute... у миня в книжке (авт. Пол Мак-Федрис) написано по другому про стандартные и нестандартные атрибуты... от суда то наверна и ошибка... моя, прав был Vasa_c что я путаю атрибуты и свойства...
исправлюсь... :rolleyes: