Использование моего собственного обратного вызова с объектом HttpRequest - PullRequest
1 голос
/ 13 октября 2009

Я пишу запрос Http без использования библиотеки (другой скрипт имел конфликты ...)

Но у меня проблемы с объемом моего объекта. Ниже приведен вызывающий скрипт, затем следует объект Ajax_Request.

function loadCard(e) {
var element = e.target;
if($('overlay')) {
    return false; //something is already over the layout
}

var card    =   '/card/'+element.id;
var option  = {method:'post', parameters:'test', async:true}

loadOverlay();
var ajax = new Ajax_Request(card, option);

}

// Ajax_Request

function Ajax_Request(url, options) {

if(typeof url !== 'undefined') {
    this.url = url;
}

if(typeof options.method !== 'undefined') {
    this.method = options.method;
} else {
    this.method = 'get';
}

if(typeof options.parameters !== 'undefined') {
    this.parameters = options.parameters;
}

if(typeof options.async !== 'undefined') {
    this.async = true;
} else {
    this.async = false;
}

if(window.XMLHttpRequest) {
    this.request = new XMLHttpRequest();
} //check for MS browser

this.makeRequest = function() {
    try {
        this.request.onreadystatechange = this.checkReadyState;
        this.request.open(this.method, this.url, this.async);
        if(this.method == 'post') {
            this.request.send(this.parameters);
        } else {
            this.request.send(null);
        }
    } catch(err) {
        alert(err);
    }
}

this.setResponse = function(r) {
    alert(r)
    this.response = r;
}

this.getResponse = function() {
    return this.responseText;
}


this.checkReadyState = function(r) {
    switch(this.readyState) {
        case 4:
        //Represents a "loaded" state in which the response has been completely received.
        if(this.status == 200) {
            this.setResponse(this.responseText)
        }

        ...

    }

  }
}

Я пытаюсь установить ответ для свойства, чтобы мой вызывающий объект мог работать с ним. Но когда я пытаюсь вызвать this.setResponse (), я получаю сообщение об ошибке, которое не определено. Как правильно привязать обратный вызов onreadystatechange к моей программе?

Сценарий в противном случае возвращает данные должным образом, и я мог бы просто вывести их прямо здесь, но мне нужно больше гибкости.

Спасибо Рич

Ответы [ 3 ]

1 голос
/ 13 октября 2009

Это происходит с вами, потому что внутри checkReadyState функция this фактически представляет экземпляр XMLHttPRequest, а не объект Ajax_Request, поэтому this.setResponse не определено. Чтобы ссылаться на метод вашего объекта, вы должны использовать небольшую хитрость: var that = this.

function Ajax_Request(url, options) {
    var that = this;

    ...

    this.checkReadyState = function (r) {
        switch(this.readyState) {
            case 4:
            if(this.status == 200) {
                    // "this" refers to the XMLHttpRequest, 
                    // but "that" refers your custom  Ajax object
                    that.setResponse(this.responseText)
            }

        ...
        }
    }
}
0 голосов
/ 13 октября 2009

В this.checkReadyState попробуйте изменить this.setResponse(this.responseText) на this.setResponse(this.request.responseText);.

0 голосов
/ 13 октября 2009

Я не уверен, что это проблема, но вы не должны ссылаться на Ajax_Request в конструкторе. Вместо этого используйте this. (this относится к фактическому экземпляру объекта - Ajax_Request относится к конструктору объекта.)

this.makeRequest = function() {
        try {
                this.request.onreadystatechange = this.checkReadyState;
                this.request.open(this.method, this.url, this.async);
                if(this.method == 'post') {
                        this.request.send(this.parameters);
                } else {
                        this.request.send(null);
                }
        } catch(err) {
                alert(err);
        }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...