Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача экземпляра класса в атрибут ноды (JavaScript)

27K
14 мая 2007 года
Chesn0k
9 / / 14.05.2007
в IE работает, как передать сцылку на экземпляр класса в созданную ноду а потом получить по ней этот экземпляр в обработчике в других броузерах (кроме IE) ?
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");
1.8K
14 мая 2007 года
civ3
68 / / 21.07.2003
для "горбатого" img.attachEvent
для остальных: img.addEventListener
7.9K
14 мая 2007 года
vasa_c
191 / / 05.04.2007
Цитата:
img.attachEvent("onmouseover",mouseover);


Конечно, только в IE.
Читай про addEventListener

Цитата:
function mouseover(){
var obj=event.toElement.obj;
alert(obj.message);
}


event это тоже IE-Only. В Gecko он передается в первом аргументе ссылки.
Вытаскивать его нужно так:

 
Код:
function mouseover(e) {
  e = e || window.event; // Теперь e точно объект события
}


Цитата:
img.setAttribute("obj",this);


Есть большие сомнения, что такие финты будут проходить везде.
Лучше так:

 
Код:
...
var img=document.createElement("IMG");
img.src="image.gif";
var _this = this;
img.onmouseover = (function(e) {
  alert(_this.message);  
});
12
14 мая 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: vasa_c
Конечно, только в IE.
event это тоже IE-Only.


Опера тоже понимает этот объект.

27K
14 мая 2007 года
Chesn0k
9 / / 14.05.2007
Люди, вы не уловили саму фичу вопроса....
интересует НЕ как вызвать обработчик или получить event
а как в ноду записать сцылку на экземпляр класса
и потом в обработчике её получить?
p.s. неважно через event я её получаю или нет...

кстати такая вот фичка не прокатит...:
 
Код:
...
var img=document.createElement("IMG");
img.src="image.gif";
var _this = this;
img.onmouseover = (function(e) {
  alert(_this.message);  
});

потому что _this - должна находится в нутри класса... а не быть глобальной переменной, причем нужно сделать нормальный класс а не пародию на него, так что на всякий случай - использовать имена класса тоже нельзя...
7.9K
14 мая 2007 года
vasa_c
191 / / 05.04.2007
Цитата:
а не быть глобальной переменной


Она не глобальная переменная. Она локальная в конкретном контексте вызова функции и доступна из определенного в нем обработчика черз замыкание. Каждый обработчик будет разделять свою отдельную переменную.

Цитата:
нужно сделать нормальный класс


JS — прототипоориентированный язык, в нем нет нормальных классов.

Цитата:
а как в ноду записать сцылку на экземпляр класса
и потом в обработчике её получить?


Ты ее успешно и записал, и оно работало в IE. А в FF и Опере нет. Почему, тебя было указано.
Но объекты соотвествующие DOM-элементам, вещь вообще капризная. Лучше туда ничего лишнего не записывать.

27K
14 мая 2007 года
Chesn0k
9 / / 14.05.2007
vasa_c: что происходит в этой строчке ?
 
Код:
....
this.img.setAttribute("obj",this);
....


Цитата:

Она не глобальная переменная. Она локальная в конкретном контексте вызова функции и доступна из определенного в нем обработчика черз замыкание. Каждый обработчик будет разделять свою отдельную переменную.


В том то и дело... он будет разделять, и в итоге броузер даст ошибку потому что для ноды созданного экземпляра прототипного класса, переменных созданных в нутри конструктора, не существует, он недаст ошибку если я укажу переменную лежащую в глобальной области страницы либо полную ссылку на свойство прототипного класса.

Цитата:
Ты ее успешно и записал, и оно работало в IE. А в FF и Опере нет. Почему, тебя было указано.


Вот уже пятый раз перечитываю колонку, не могу найти почему же оно в FF и Opera не пишется...

7.9K
14 мая 2007 года
vasa_c
191 / / 05.04.2007
Цитата:
vasa_c: что происходит в этой строчке ?


В этой строчке происходит лажа.
Ты устанавливаешь совершенно непонятный атрибут для объекта.
Из-за известного глюка в IE это прокатывает, как установка свойства. А в FF нет.

Цитата:
В том то и дело... он будет разделять, и в итоге броузер даст ошибку потому что для ноды созданного экземпляра прототипного класса, переменных созданных в нутри конструктора, не существует, он недаст ошибку если я укажу переменную лежащую в глобальной области страницы либо полную ссылку на свойство прототипного класса.


чего?

Цитата:
Вот уже пятый раз перечитываю колонку, не могу найти почему же оно в FF и Opera не пишется...


Потому что используется attachEvent
Потому что неверно определяется event
Потому что используется setAttribute

27K
15 мая 2007 года
Chesn0k
9 / / 14.05.2007
Работает в IE:
Код:
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");
var pic=new picture("message 2");


Работает в FF и Opera:
Код:
picture = function(message){
    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 !!!");


надеюсь теперь тема закрыта... всем спасибо за внимание и потдержку... ;-)
1.8K
15 мая 2007 года
civ3
68 / / 21.07.2003
Цитата: Chesn0k
лучшеб поменяли стандарты DOM...


Вам в микрософт идти работать надо с таким подходом ;)

Цитата: Chesn0k
например img.className='myclass' или img.src='aaaa' или img.style.cursor='hand'


Пардон, какой браузер не умеет этого делать?

27K
15 мая 2007 года
Chesn0k
9 / / 14.05.2007
на щет DOM это я погарячился... каюсь... :o

а про className и прочее... просто прочитал статейку и понял что они в примерах пытались изменить стандартные атрибуты через setAttribute... у миня в книжке (авт. Пол Мак-Федрис) написано по другому про стандартные и нестандартные атрибуты... от суда то наверна и ошибка... моя, прав был Vasa_c что я путаю атрибуты и свойства...

исправлюсь... :rolleyes:
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог