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


Автор: Ashen 18.2.2008, 15:55
Есть класс (рисует текстовое поле и при вводе делает запрос на сервер за ближайшими совпадениями), соответственно надо опрашивать текстовое поле на изменение значения, для нтого попытался затолкать вызов метода класса в функцию 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


Что сделал неправильно?

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

Автор: Ashen 18.2.2008, 17:50
ссылка 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();
}

Автор: Sardar 18.2.2008, 19:25
Цитата(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); };

Автор: Ashen 18.2.2008, 20:57
танкс, сам почему то не додумался, до вроде бы очевидного решения  smile 

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