Объекты JavaScript?

 
0
 
JavaScript
ava
guest | 25.09.2003, 13:03
Когда вызываю в скрипте свойство созданного объекта, чтобы его изменить, он это свойство не видит!
Где ошибка? Вот, например, код:

function knopik(id,src,nadpis){
this.id=id;
this.src=src;
this.nadpis=nadpis;
//метод
this.naezd=naezd;

this.structure="<table background='"+this.src+"' style='color:white;background-repeat : no-repeat;"+
"background-position : center;font-size: 12px;' onmouseover='naezd()'"+
" border='2' height='75' width='197'><tr><td id='"+this.id+"' align='center'><b>"+this.nadpis+"<br>"+
"</b></td></tr></table>";

}

function naezd(){
alert(this.nadpis);

}

myKnop = new knopik("kk1","kartinka.gif","новая кнопка!");

document.write(myKnop.structure);


</BODY>

Спасибо заранее!
Ответы (15)
ava
[email protected] | 25.09.2003, 13:57 #
Вот, ты забыл одну вещь сделать:

<BODY bgcolor="#FFFFFF">
<script>
function knopik(id,src,nadpis){
this.id=id;
this.src=src;
this.nadpis=nadpis;
//метод
this.naezd=naezd;

this.structure="<table background='"+this.src+"' style='color:white;background-repeat : no-repeat;"+
"background-position : center;font-size: 12px;' onmouseover='[b]myKnop.naezd();[/b]'"+
" border='2' height='75' width='197'><tr><td id='"+this.id+"' align='center'><b>"+this.nadpis+"<br>"+
"</b></td></tr></table>";

}

function naezd(){
alert(this.nadpis);

}

myKnop = new knopik("kk1","kartinka.gif","новая кнопка!");

document.write(myKnop.structure);
</script>

</BODY>
ava
guest | 25.09.2003, 14:45 #
Так это не то... Фокус-то в том, чтобы ЛЮБОЙ объект, созданный по этому конструктору, позволял манипулировать со своим свойством nadpis. Я пытался вызывать метод this.naezd() - ругается, что "объект не поддерживает метод"...
ava
[email protected] | 25.09.2003, 17:05 #
Я че то не пойму ... ты поьзуешся методами конструктора из других функций вызывая их из объекта, тогда все получается:

myObject = new constr_func(parameter1,parameter2,parameter3);

А потом можешь определенными в них переменными пользоваться из другой функции вызывая ее из myObject - myObject.other_func();
...
По другому ни как ... вроде ...


Или может я чего не так понял ???
ava
[email protected] | 26.09.2003, 09:29 #
<HTML>
<BODY bgcolor="#FFFFFF">
<script>
function knopik(id,nadpis){
this.id=id;
this.nadpis=nadpis;
this.fn_naezd = function my_naezd() { alert(id+'@'+nadpis); };

var tbl = document.createElement('TABLE');
tbl.parent = this;
tbl.id = 'tbl_'+this.id
tbl.border = 1;
tbl.attachEvent('onclick', this.fn_naezd);

var row = tbl.insertRow();
var col = row.insertCell();
col.innerHTML = this.id + '_' + this.nadpis;

document.body.appendChild(tbl);
}

myKnop = new knopik("kk1","test");
myKnop = new knopik("kk2","test");
myKnop = new knopik("kk3","test");
myKnop = new knopik("kk4","test");
myKnop = new knopik("kk5","test");

</SCRIPT>
</BODY>
</HTML>
ava
nikolin | 26.09.2003, 11:12 #
Метод надо предварително дефинират , впереди конструктора или как тебыа сказали
this.fn_naezd = function my_naezd() { alert(id+'@'+nadpis); };
ava
guest | 26.09.2003, 12:02 #
Спасибо, Максим, это буквально то, что надо, прямо в точку! smile))
Успехов!
ava
guest | 26.09.2003, 12:06 #
И тебе спасибо, nikolin, тоже интересно. smile только, правда, все равно не работает... smile
ava
nikolin | 27.09.2003, 09:32 #
Если хочешь узнат более а том как писать <table> динамично в документ ето книга для тебя "Mastering of JavaScript , Perl and CGI"

А что не работает , код Максима ??? я попробал , все в порядке . Если не рабоатет у тебя взгляд какие браузера попробал код . IE - ok , NS - ???
ava
borber | 28.09.2003, 14:45 #
nikolin, я имел в виду, что не работает мой код, независимо от того, где определяешь метод - до конструктора, после или внутри. Я так и не понимаю, почему нельзя обратиться к свойству объекта через его метод с помощью слова this. Или я совсем чего-то не понимаю?
ava
[email protected] | 29.09.2003, 11:01 #
borber, событие onmouseover в твоём коде возникает при наведении мышиного курсора на ячейку, затем поднимается до таблицы и дальше вверх по модели до уровня document.body. Объект myKnop находится вне DOM и поэтому там не возникает это событие. То есть, в твоей функции naezd, объект this - это не myKnop, а именно ячейка таблицы.

В своём коде я аттачу обработчик события на таблицу, используя его внутри объекта, предварительно объявив его как метод объекта this.fn_naezd = function my_naezd()
ava
borber | 01.10.2003, 11:07 #
[email protected], так все-таки как твой код внедрить в нужное место уже имеющейся html-страницы? Чтобы конструктор один раз писался, а объекты потом где надо существовали? Вот это вот: document.body.appendChild(tbl); как изменить?
ava
[email protected] | 01.10.2003, 14:07 #
borber, можно использовать методы insertBefore, insertAdjacentElement, appendChild, appendElement - это для IE. Например, передавать в конструктор параметром ссылку на объект, внутри, после или перед которым нужно вставить новый объект. Далее просто вызываешь в нужном месте конструктор.

Я не могу дать тебе более точного ответа, потому что не знаю, для чего ты собрался применять этот код.
Всё зависит от реализации, как ни банально это звучит...
ava
borber | 01.10.2003, 15:20 #
идея была совершенно простенькая: кнопки навигации на сайте сделать одинаковыми изображениями (всего 2 - _on и _off), различающимися только надписями, и тем самым облегчить страницы (сейчас - каждая кнопка - своя картинка, различается только надписью). Твой код сам по себе работает именно так как надо, но вставить его столько раз, сколько хочу, в те места, куда хочу - не получается у меня. А реализация - да вот на, например, такая страница (чего тут мудрствовать):

<html>
<head>
</head>
<body>
КАКОЙ-ТО ТЕКСТ И КАРТИНКИ
<table cellspacing="2" cellpadding="2" border="1">
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
</table>
ЕЩЕ ТЕКСТ И КАРТИНКИ
<table cellspacing="2" cellpadding="2" border="1">
<tr>
<td>ф</td>
<td>ы</td>
<td>в</td>
</tr>
<tr>
<tdа>м</td>
<td>к</td>
<td>п</td>
</tr>
</table>
</BODY>
</html>

Ну, в ячейках таблицы что-то есть...
вот как вставить по 1 кнопке в каждую вторую, например, ячейку?
ava
[email protected] | 02.10.2003, 10:09 #
<html>
<head>
</head>
<body>

<script>
function knopik(parent,id,nadpis){
this.id=id;
this.nadpis=nadpis;
this.fn_naezd = function my_naezd() { alert(id+'@'+nadpis); };

var tbl = document.createElement('TABLE');
tbl.parent = this;
tbl.id = 'tbl_'+this.id
tbl.border = 1;
tbl.attachEvent('onclick', this.fn_naezd);

var row = tbl.insertRow();
var col = row.insertCell();
col.innerHTML = this.id + '_' + this.nadpis;

parent.innerHTML = '';
parent.appendChild(tbl);
}
</script>

<table cellspacing="2" cellpadding="2" border="1">
<tr>
<td width="20">&nbsp;</td>
<td id="td1">&nbsp;</td>
<td width="20">&nbsp;</td>
</tr>
<tr>
<td width="20">&nbsp;</td>
<td id="td2">&nbsp;</td>
<td width="20">&nbsp;</td>
</tr>
</table>
<br>
<table cellspacing="2" cellpadding="2" border="1">
<tr>
<td width="20">&nbsp;</td>
<td id="td3">&nbsp;</td>
<td width="20">&nbsp;</td>
</tr>
<tr>
<td width="20">&nbsp;</td>
<td id="td4">&nbsp;</td>
<td width="20">&nbsp;</td>
</tr>
</table>

<script>
myKnop = new knopik(document.all.td1,"kk3","test1");
myKnop = new knopik(document.all.td2,"kk3","test2");
myKnop = new knopik(document.all.td3,"kk3","test3");
myKnop = new knopik(document.all.td4,"kk4","test4");
</script>

</BODY>
</html>
ava
borber | 02.10.2003, 11:08 #
Круто, [email protected] ! Уважаю! smile Теперь даже мне понятно. smile)) Спасибо.
Зарегистрируйтесь или войдите, чтобы написать.
Фирма дня
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Участники
advanced
Отправить