BG Development


  Reply to this topicStart new topicStart Poll

> JS: onclick на елемент да вика метод на обект, дръвчета
doubleexcell
Публикувано на: 26-08-2008, 15:18
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 495
Регистриран на: 09.08.05



CODE
function createCb(node)
     {
           var theCb = document.createElement('INPUT');
           theCb.type = 'checkbox';
           theCb.setAttribute('onclick', function() {node.select();});
           theCb.value = node.value;
           theCb.id = this.generateCbName(node);
           return theCb;
     }


Така... това е member function на един клас. Класът ще се изпозлва за показване на категории в йерархичен вид. До всяка категорийка ще има и един чекбокс, за да се маркира дадената категория.

Логиката за маркиране е малко по-сложна, затова тя е изведена във функция на същия този обект.

Горната функция приема като параметър обект от тип self (т.е. същият обект). Целта ми е, когато се кликне върху чекбокса, да се извика .select() метода на съответния node, който е генерирал чекбокса. Нещо не ми връзва, обаче. Този ред:

CODE
theCb.setAttribute('onclick', function() {node.select();});


го пробвах също и така

CODE
theCb.setAttribute('onclick', function() {this.select();});

и така
CODE
theCb.setAttribute('onclick', function(node) {node.select();});

и така
CODE
theCb.onclick = function() {node.select();}

и така
CODE
theCb.onclick = function(node) {node.select();}

и така
CODE
theCb.onclick = function() {this.select();}

и така
CODE
theCb.onclick = function() {alert('na maika ti ...');}


и е.а ли му майката как още, но все не връзва. Нищо не се извиква, Firebug не показва никакви грешки

За първи път в живота си пиша обекти на JavaScript, затова моля да ме извините за тъпия въпрос, но наистина забих icon_sad.gif

Как да го подкарам да работи това нещо?

Това мнение е било редактирано от doubleexcell на 26-08-2008, 15:26


--------------------
PMEmail PosterUsers WebsiteICQ
Top
TNT
Публикувано на: 26-08-2008, 21:47
Quote Post



Име:
Група: Изгонен
Ранг: Почетен член

Мнения: 1870
Регистриран на: 06.01.08



select() е запазена дума за метод на друг обект който се потдържа от JS.
опитаи да си дефинираш метод с подобно име например _select()
PMEmail PosterUsers Website
Top
doubleexcell
Публикувано на: 27-08-2008, 00:13
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 495
Регистриран на: 09.08.05



Не стана icon_sad.gif Ето и URL

checkbox bug

Мисля, че някъде в "OOP-то" ми омазвам някакви поинтери, но не знам защо icon_sad.gif


--------------------
PMEmail PosterUsers WebsiteICQ
Top
doubleexcell
Публикувано на: 27-08-2008, 01:09
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 495
Регистриран на: 09.08.05



мисля, че решението е в binding, но не мога да го нацеля точно icon_sad.gif


--------------------
PMEmail PosterUsers WebsiteICQ
Top
Nick
Публикувано на: 27-08-2008, 09:48
Quote Post


Group Icon
Име: Никола Павлов
Група: Администратор
Ранг: Почетен член

Мнения: 2082
Регистриран на: 30.01.04



Батка, innerHTML ти бърка нещата. Тъпо, а icon_wink.gif

CODE
this.innerHTML = '';

това го замени с:
CODE
while(this.firstChild) { this.removeChild(this.firstChild); }



CODE
theLi.innerHTML += ' ' + this.name + ' ' + this.value;

а това ако държиш на него го направи:
CODE
theLi.appendChild( document.createTextNode(' '+this.name+' '+this.value) );


--------------------
PMEmail PosterUsers WebsiteICQ
Top
doubleexcell
Публикувано на: 27-08-2008, 11:31
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 495
Регистриран на: 09.08.05



Тъкмо се справих, майна. Другаде беше проблема. Тия add(), append() и т.н. си губеха binding-a и се омазваха атрибутите навсякъде. Затова започнах отначало from scratch с Prototype.js и направих на всяка такава динамична функция по един експлицитен bind и всичко заспа.

Проблемът се изразявал в това, че в JavaScript всичко е local scope и като викаш local func from local func когато се изпълни външната функция, тя си pop-ва стака после и се губят references към обектите. Тогава this става window и всичко се закача на него. По този начин нещата така се омазват, че самия език не разбира, че е в грешка icon_sad.gif

Ей така сработи
CODE
var func = funtion () {this.select();}
theCb.onclick = func.bind(this);


същото нещо рекурсивно назад за add(), append() etc. и нямаше сбозване на references

Това мнение е било редактирано от doubleexcell на 27-08-2008, 11:33


--------------------
PMEmail PosterUsers WebsiteICQ
Top
doubleexcell
Публикувано на: 27-08-2008, 12:10
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 495
Регистриран на: 09.08.05



и ти си бил доста прав, обаче icon_razz.gif


--------------------
PMEmail PosterUsers WebsiteICQ
Top
nullman
Публикувано на: 19-10-2008, 21:43
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 42
Регистриран на: 29.11.04



InnerHtml е доста по тромав. Втория вариант е много по елегантен


--------------------
PMEmail Poster
Top
0 потребители преглеждат тази тема в момента (0 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2019 | BG Development | All Rights Reserved
RSS 2.0