Ajax设置'context'不会影响'数据的位置

时间:2013-07-31 07:27:22

标签: javascript ajax syntax

以下Ajax工作

function Retrieve(el) {
    var table = this;
    this.el = el;
    this.fetchInfo = function () {
        $.ajax('data.html', {
            context: table,
            <!-- QUESTION HERE -->
            data: {
                location: table.data('location')
            },
            success: function (response) {
                this.el.find('.info').html(response).fadeIn();
            },
        }
        }

但我想知道为什么我无法在所表示的行上用table.data替换this.data。由于我将上下文设置为table变量,this现在应该设置为table所指的任何内容?这适用于Ajax对象的其他成员(包括success)的上下文,但不适用于data的成员。为什么会这样?

data('name')从属性为data-name

的代码中提取值

2 个答案:

答案 0 :(得分:1)

您提供的context变量仅适用于success回调,并且不会更改传递给$.ajax的任何其他参数的任何内容。

因此,答案取决于您实际调用 fetchInfo的方式。 data:变量将在fetchInfo具有的任何上下文中得到解决。鉴于您遇到问题,这表示您使用Retrieve对象作为其上下文调用该函数。

编辑这一行是你的问题:

this.el.on('click', 'button', this.fetchInfo);

仅仅因为您已经引用了this.fetchInfo,在随后调用上下文时不会使this成为上下文。试试这个:

this.el.on('click', 'button', $.proxy(this.fetchInfo, this));

答案 1 :(得分:0)

查看$.ajax()的{​​{3}},我发现context设置为callbackContext变量。这可以使用successerrorbeforeSendcomplete,但不能使用data选项。

AJAX选项被分配给名为s的变量:

s = jQuery.ajaxSetup({}, options),

数据选项转换为字符串,但未使用callBackContext

// Convert data if not already a string
if (s.data && s.processData && typeof s.data !== "string") {
    s.data = jQuery.param(s.data, s.traditional);
}

因此,有必要使用data以外的变量设置this的元素。