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

Ваш аккаунт

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

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

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

присвоение событию функции класса и обратный вызов[JS]

312
16 сентября 2008 года
dead_star
392 / / 26.11.2006
проблема в следующем
например:
window.onload = function1;
function1() будет выполнятся по завершению загруски страници
тоесть по наступлению события onload объекта window
если мы напишем так:
window.onload = function1();
то событию присвоится результат работы этой функции
можно определить функцию при присвоении событию
window.onload = function(){
...
};
это мы все знаем

с классами похожая тема
window.onload = this.function1;
присвоение событию функции текущего класса
пример:
Код:
var class = {
 var:'test message',
 test:function(){
  window.onload = this.function1;
 },
 function1:function(){
  alert(this.var);
 }
}
// по окончанию загруски возвращает - undefined
class.test();

при обращении к this мы получаем ссылку на элемент над которым было произведенно событие, а не на класс
и мне неочень понятно как из вызываемой функции(в нашем случае это function1()) получить доступ к элементам текущего класса
я решил проблему так:
Код:
var class = {
 var:'test message',
 test:function(){
  var obj = this;
  window.onload = function(){ obj.function1() };
 },
 function1:function(){
  alert(this.var);
 }
}
// по окончанию загруски возвращает - test message
class.test();

вполне работает
в учебнике по ajax я нашел такой вариант:
Код:
var class = {
 var:'test message',
 test:function(){
  window.obj = this;
  window.onload = this.function1;
 },
 function1:function(){
  alert(this.obj.var);
 }
}
// по окончанию загруски возвращает - test message
class.test();

последний вариант помойму наиболее подходящий для рещения этой проблемы
353
16 сентября 2008 года
Nixus
840 / / 04.01.2007
Для начала ключевые слова лучше не использовать в качестве имен пременных.
Во-вторых, сам вопрос лучше помещать в конце.
В-третьих, все решается намного проще.

Код:
function bind(obj, method) {
    if(typeof method != 'function')
        method = obj[method];

    return function () {
        return method.apply(obj, this);
    };
}

var obj = {
    msg: 'Test',
    test: function (el) {
        alert(this.msg);
    }
};

window.onload = bind(obj, obj.test); // Так
window.onload = bind(obj, 'test'); // Или так
312
16 сентября 2008 года
dead_star
392 / / 26.11.2006
Цитата: Nixus
Для начала ключевые слова лучше не использовать в качестве имен пременных.


я называл функции и переменные таким оброзом лиш для примера
в моем случае все савсем по другому
я не настолько туп чтобы называть функции function или переменные var

Цитата: Nixus
Во-вторых, сам вопрос лучше помещать в конце.


согласен, мой баг
хотя как таквого вопроса уже особо нет

Цитата: Nixus
В-третьих, все решается намного проще.


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

ты со мной несогласен?

353
16 сентября 2008 года
Nixus
840 / / 04.01.2007
Цитата: dead_star

такой вариант тоже интересен
но в моем случае это совершенно неподходит
создавать дополнительную функцию для присваивания событий
когда это можно и нужно сделать в теле класса, это както нетак
поясняю: я создаю класс для работы с ajax и выполнение события onreadystatechange в отдельной функйии ну совсем неудобно
ты со мной несогласен?


В твоем случае этот код совершенно подходит. Если ты не в состоянии понять чтоже делает этот код и для чего нужна функция bind, то тебе нужно подучить JS, потому как программировать с такими знаниями ну совсем неудобно.
Ты со мной не согласен?

312
17 сентября 2008 года
dead_star
392 / / 26.11.2006
Цитата: Nixus
В твоем случае этот код совершенно подходит. Если ты не в состоянии понять чтоже делает этот код и для чего нужна функция bind, то тебе нужно подучить JS, потому как программировать с такими знаниями ну совсем неудобно.
Ты со мной не согласен?



я с тобой согласен, отчасти
я согласен с тем, что мне стоит подучить JS, чем я собственно и занимаюсь.
работу и предназначение приведенной тобой функции bind я понял сразу.
после длительных размышлений я пришел к выводу, что использование функции bind все-таки имеет смысл и более выгодно, чем приведенные мною варианты.
единственное но
приведенной тобой функции фактически может, рассматривается как отдельная, совершенно независимая библиотечная функция и класс для ajax, который я написал, тоже мог бы рассматривается как отдельная библиотека.
я согласен, что связывание этих двух библиотек выгодно и удобно, но я при разработки библиотек как на JS, так и на PHP стремлюсь к реализации обособленности библиотек от других элементов программы, в том числе других библиотек и, исходя из этих целей использование функции bind не является наиболее верным решением

353
17 сентября 2008 года
Nixus
840 / / 04.01.2007
Что тебе мешает определить функцию bind внутри "класса"?
312
17 сентября 2008 года
dead_star
392 / / 26.11.2006
гы. сборище интеллигентов
сразу баш вспоминается
312
17 сентября 2008 года
dead_star
392 / / 26.11.2006
Цитата: Nixus
Что тебе мешает определить функцию bind внутри "класса"?


у меня тоже была эта мысль
теперь старательно пытаюсь вспомнить, почему я от нее отказался

312
17 сентября 2008 года
dead_star
392 / / 26.11.2006
сейчас потестил
в opera все работает нормально
в ie неработает
в fox работает, но матерится
нашел в чем была проблема
ты забыл про то что второй аргумент функции apply() должен быть массив
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог