Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > Добавление события с помощью класса


Автор: fclmfan 26.10.2009, 07:55
Всем привет!!!

Вобщем имеется такой код!

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<title>JS class</title>
<script>
    with(Test=new Function){
        
        //Объявляем методы
        prototype.message=function(){
            alert("zzz");
        }

        prototype.constructor=function(_form_obj){
            _form_obj.elements[0].style.backgroundColor="red";
            _form_obj.elements[0].attachEvent("onclick", function (){this.message()});
        }    
    }

    var t=new Test();

    function initDocument(){
        var doc=document;
        var formobj=doc.myform;
        t.constructor(formobj);
    }
</script>
</head>

<body onload="initDocument()">
<form name="myform">
    <input type="text" name="input1"/>
</form>
</body>
</html>


я хочу динамически при загрузке инициализировать input1:
изменить стиль получилось 
Код
_form_obj.elements[0].style.backgroundColor="red";
,
а вот при добавлении события 
Код
_form_obj.elements[0].attachEvent("onclick", function (){this.message()});
 ясный перец вылазит ошибка... а хочу чтобы на событие исполнялась функция класса. Как это реализовать?
PS и ещё, мне это нужно только для IE, поэтому использую attachEvent...

Автор: bars80080 26.10.2009, 10:31
а как-то так?

Код

_form_obj.elements[0].onclick = function (){this.message()};

Автор: fclmfan 26.10.2009, 11:56
нее, не проканало... вы проверяйте у себя сначала, будет работать или нет, потом выкладывайте код... smile 

Автор: brother79 26.10.2009, 12:20
Ну а что значит "не проканало?" Ошибка где? Попробуй что-то типа 


Код

_form_obj.elements[0].attachEvent("onclick", function (){ alert(this.message()); });


Посмотри в чём вообще проблема? Может this не к тому классу относится. Поидее вообще можно не писать  function (){this.message()},  а написать сразу this.message без скобок, только надо смотреть куда ссылается this В твоём случае как раз мало шансов, что работать будет, т.к. твой обработчик вызовется скорее всего от имени другого объекта и this будет ссылаться именно на него. Если ты из ф-ии хочешь вызвать какой-то метод, передавай класс замыканием, например:

Код

var e = this
_form_obj.elements[0].attachEvent("onclick", function (){ e.message(); });


Автор: Kevin 26.10.2009, 12:51
У вас:
Код
function (){this.message()}

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

Т. е. нужно сделать так:
Код
function (){t.message()}



UPD: Упс, модератор, удалите мое сообщение, я повторился, 
автор выше все, что надо уже сказал, а я и не заметил...

Автор: fclmfan 26.10.2009, 13:31
в таком варианте ошибка вылазила
Код

_form_obj.elements[0].onclick = function (){this.message()};
,

попробовал ваш вариант, получилось... вроде нормально работает... спасибо за объяснение brother79 и Kevin  smile 

Автор: IDVsbruck 26.10.2009, 19:43
Или так:
Код

with (Test = new Function) {
    prototype.message = function() {
        alert("zzz");
    }
    prototype.constructor = function(_form_obj) {
        _form_obj.elements[0].style.backgroundColor = "red";
        _form_obj.elements[0].onclick = function() {prototype.message()};
    }    
}

Автор: brother79 27.10.2009, 06:25
.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)