1
function chat() {
    this.waittime = 6000;
    this.intUpdate = null;

    this.sendChatUpdate = function (msg) {
        var Chatmsg = '0';
        if (msg > 0) {
            Chatmsg = $('#chatmsg');
            var m = Chatmsg.val();
            Chatmsg.val('');
        }

        var s = $("#chatnick").val();
        var r = $("#chatto").val();

        $.ajax({
            type: 'POST',
            url: 'Chat/ajax/Chat.php',
            data: {
                S: s,
                R: r,
                M: m
            },
            success: function (data) {
                this.ProcessChatReturn(data);
            },
            error: function (data) {
                this.ProcessChatReturn(data);
            }
        });
    }

    this.getUnreadChat = function (mr) {
        var s = $("#chatnick").val();
        $.ajax({
            type: 'POST',
            url: 'Chat/ajax/Chat.php',
            data: {
                S: s,
                UR: 1,
                MR: mr
            },
            success: function (data) {
                this.ProcessChatReturn(data);
            },
            error: function (data) {
                this.ProcessChatReturn(data);
            }
        });

        //clearTimeout(intUpdate);
        $('#chatbox').show();
    }
}

var chat = new chat();
chat.getUnreadChat();

我收到错误“Uncaught TypeError: Object # has no method 'ProcessChatReturn'”

我认为这是因为如果在 jquery ajax 调用内部使用“this”。我想引用我的“聊天”对象,但我认为由于将它包含在 jquery ajax 函数中,它不是。

任何建议如何在该位置引用我的聊天对象?

4

1 回答 1

2

您不能这样做,因为ajax succes 回调中的this指向 jqXHR 对象,而不是您的对象上下文。您可以改为将对象缓存到另一个变量并使用它。还有许多其他方法。

this.sendChatUpdate = function (msg) {
    var Chatmsg = '0';
    if (msg > 0) {
        Chatmsg = $('#chatmsg');
        var m = Chatmsg.val();
        Chatmsg.val('');
    }

    var s = $("#chatnick").val();
    var r = $("#chatto").val(), self = this; //Cache this to self.

    $.ajax({
        type: 'POST',
        url: 'Chat/ajax/Chat.php',
        data: {
            S: s,
            R: r,
            M: m
        },
        success: function (data) {
            self.ProcessChatReturn(data); //Invoke it with self
        },
        error: function (data) {
            self.ProcessChatReturn(data); //Invoke it with self
        }
    });
}

您还可以利用contextajax 设置的属性。

前任:

   $.ajax({
        type: 'POST',
        url: 'Chat/ajax/Chat.php',
        data: {
            S: s,
            R: r,
            M: m
        },
        context:this, //set the context here
        success: function (data) {
            this.ProcessChatReturn(data); //Invoke it with this
        },
        error: function (data) {
            this.ProcessChatReturn(data); //Invoke it with this
        }
    });

还有其他方法,例如使用 Ecmascript5 function.bind$.proxy绑定回调函数引用,但在您的情况下,您可以避免使用这些方法。

请注意,函数内部的上下文是指调用者的上下文,或者换句话说,函数是从哪里调用的(最后一个语句中提到的绑定函数除外)。在您的情况下,您将回调作为匿名 func 引用提供给 ajax,并且它从 jquery ajax 对象调用,因此默认情况下上下文指向该对象

于 2013-10-12T01:11:16.347 回答