Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов метода класса в setTimeout, метод "выпадает" из контекста объекта 
V
    Опции темы
Ashen
  Дата 18.2.2008, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 1.9.2006

Репутация: нет
Всего: нет



Есть класс (рисует текстовое поле и при вводе делает запрос на сервер за ближайшими совпадениями), соответственно надо опрашивать текстовое поле на изменение значения, для нтого попытался затолкать вызов метода класса в функцию setTimeout таким образом:
Код

function DDList(obj_value, obj_name, obj_id, obj_class) {
  // ---------------------------------------------------------------------------
  // тут еще методы
  // ---------------------------------------------------------------------------
  this.get_value = function() {
    selfa = this;
    setTimeout(
        function(){ selfa.get_value();}, 1000
    );
    if (this.old_value != document.getElementById(this.obj_id).value) {
      this.old_value = document.getElementById(this.obj_id).value;
      this.get_suggest();
    }
  }
  // ---------------------------------------------------------------------------
  // тут тоже
  // ---------------------------------------------------------------------------
}


в итоге получаю (сообщение об ошибке в исполнении FireBug'а):
Код

this.show_popup is not a function


Что сделал неправильно?
--------------------
Хочешь помочь новичку - делай вместе с ним;Хочешь помочь старику - сделай за него;Хочешь помочь мастеру - отойди в сторону;Хочешь помочь дураку - сам дурак...
PM MAIL   Вверх
Sardar
Дата 18.2.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Приведи 10 строк до и после проблемной строки, т.к. вырезка выше вообще "не при делах".
Лучше дай ссылку.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ashen
Дата 18.2.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 1.9.2006

Репутация: нет
Всего: нет



ссылка http://127.0.0.7  думаю мало поможет делу  smile ... а код ниже (отрезаны вспомогательные функции)

Код

var req;
// Конструктор.
function DDList(obj_value, obj_name, obj_id, obj_class) {
  this.obj_value = obj_value;
  this.obj_name  = obj_name;
  this.obj_id    = obj_id;
  this.obj_class = obj_class;
  this.popup = "none";

  // для "родного" XMLHttpRequest
  if (window.XMLHttpRequest) {
      req = new XMLHttpRequest();   
  // для версии с ActiveX
  } else if (window.ActiveXObject) {
      var aVersions = ["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHttp"];                    
      for (var i = 0; i < aVersions.length; i++) {
          try {
              req = new ActiveXObject(aVersions[i]);
          } catch (oError) {
               if (i == aVersions.length) throw new Error("Ваш броузер не поддерживает объект XMLHttp!");
          } 
      }
  }
  this.old_value = (this.obj_value!=null?this.obj_value:"");
  // ---------------------------------------------------------------------------
  this.get_suggest = function() {
    this.get_data("/ddlist.php?suggest=" + document.getElementById(this.obj_id).value);
  }
  // ---------------------------------------------------------------------------
  this.get_value = function() {
    selfa = this; // ЗАВОДИМ ТАЙМЕР
    setTimeout(
        function(){ selfa.get_value();}, 1000
    );

    if (this.old_value != document.getElementById(this.obj_id).value) {
      this.old_value = document.getElementById(this.obj_id).value;
      this.get_suggest();
    }
  }
  // ---------------------------------------------------------------------------
  this.show_popup = function(value) {
    document.getElementById('DDList_Popup_' + this.obj_id).innerHTML = "value";
    document.getElementById('DDList_Popup_' + this.obj_id).style.display="block";
  }
  // ---------------------------------------------------------------------------
  this.get_data = function(url) {
    req.onreadystatechange = this.have_data; // М... ВОТ ЗДЕСЬ ПОХОЖЕ И ПРОБЛЕМА...(НАДО ПЕРЕДАТЬ НЕ ТОЛЬКО ФУНКЦИЮ, НО И ОБЪЕКТ?)
    req.open("GET", url, true);
    req.send(null);
  } 
  // ---------------------------------------------------------------------------                  
  this.have_data = function() {
    if (req.readyState == 4) {
        if (req.status == 200) {
            //eval(req.responseText);
            this.show_popup(req.responseText); // ЗДЕСЬ ОШИБКА!!!
        } else {
            alert("Не удалось получить данные:\n" + req.statusText);
        }
    }
  }
  // ---------------------------------------------------------------------------
  // ---------------------------------------------------------------------------
  document.write('<div class="DDList_Popup" style="display:' + this.popup + '" id="DDList_Popup_' + this.obj_id + '"></div><input type="text" ' + (this.obj_value!=null?('value="' + this.obj_value + '" '):' ') + (this.obj_name!=null?(' name="' + this.obj_name + '" '):' ') + (this.obj_id!=null?(' id="' + this.obj_id + '" '):' ') + (this.obj_class!=null?('class="' + this.obj_class + '" '):' ') + '/>');
  this.get_value();
}

--------------------
Хочешь помочь новичку - делай вместе с ним;Хочешь помочь старику - сделай за него;Хочешь помочь мастеру - отойди в сторону;Хочешь помочь дураку - сам дурак...
PM MAIL   Вверх
Sardar
Дата 18.2.2008, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



Цитата(Ashen @  18.2.2008,  16:50 Найти цитируемый пост)
ссылка http://127.0.0.7

Браво smile 

Код
//req.onreadystatechange = this.have_data;

//приемняем приём с 31 строки
var selfa = this;
req.onreadystatechange = function() { have_data.apply(selfa, arguments); };



--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ashen
Дата 18.2.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 1.9.2006

Репутация: нет
Всего: нет



танкс, сам почему то не додумался, до вроде бы очевидного решения  smile 
--------------------
Хочешь помочь новичку - делай вместе с ним;Хочешь помочь старику - сделай за него;Хочешь помочь мастеру - отойди в сторону;Хочешь помочь дураку - сам дурак...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0735 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.