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


Автор: thefree 22.5.2008, 19:04
Код

<script language="Javascript">
function miniAjax() {
  this.xmlhttp = function() {
    return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
    }
  
  this.send = function(u, f, m, a) {
    this.xmlhttp.open(m,u,true);
        this.xmlhttp.onreadystatechange = function() {
            if (this.xmlhttp.readyState == 4) {
                if (this.xmlhttp.status == 200) {
                    f(this.xmlhttp.responseText);
                }
            }
        }
        if (m == 'POST') {
            this.xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        }
        this.xmlhttp.send(a)
    }
    
  this.get = function(u,f,m,a) {
        this.send(u,f,m,a);
  }
}

var obj = new miniAjax();
function bubu(g) {
    alert(g);
}
</script>
<span onclick="obj.get('bu.html', bubu,'GET', null);">test</span>
 Почемуто ругается на  this.xmlhttp.open is not a function 

Автор: smartov 22.5.2008, 19:40
Ругается потому что this.xmlhttp это ссылка на функцию, а не ее результат. Чтобы получить ее результат нужно написать this.xmlhttp() и соответственно this.xmlhttp().open,... но так нельзя smile потому что каждый раз при ее вызове у вас будет создаваться новый объект, а вам это не нужно.
Поэтому для начала я бы заменил
Код

  this.xmlhttp = function() {
    return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
    }

на
Код

this.xmlhttp = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();


Дальше ошибка произойдет во время срабатывания callback функции (onreadystatechange). 
Когда эта функция отработает в ее контексте не будет никакого this.xmlhttp, потому что this будет ссылаться уже на эту функцию, а не на miniAjax (Про контексты это отдельная тема, советую почитать http://forum.vingrad.ru/forum/topic-50738.html по этому поводу. Уйдет много вопросов)

Поэтому можно сделать например так
Код

...
    var _this = this;
    this.xmlhttp.onreadystatechange = function() {
        if (_this.xmlhttp.readyState == 4) {
            if (_this.xmlhttp.status == 200) {
                alert(_this.xmlhttp.responseText);
...


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