Ajax 未定义并引发运行时异常


    ajax.postJson(
                "/foo/GetFoo",
                { fooName: fooName },
                function (data) {
                },
                function (error) {  });
        };
My Rest api call is GetAsync()

它抛出ajax是未定义的:JavaScript运行时错误:无法获取未定义或空引用的属性"exceptionStart"。进行 ajax 调用的自定义代码如下。API 调用 Getfoo 是使用属性 HttpGet 的 GetAsync 方法。有人可以指出我失败的原因吗

var ajax = {
    defaultAjaxTimeout: 600000,
    exceptionStart: '<!--',
    exceptionEnd: '-->',
    postJson: function (url, data, success, error) {
        $.ajax(
            {
                type: "POST",
                dateType: "json",
                url: url,
                data: data,
                timeout: ajax.defaultAjaxTimeout,
                success: function (result) {
                    if (success) success(result);
                },
                error: function (jqXhr, textStatus, errorThrown) {
                    if (error && jqXhr) {
                        var responseText = jqXhr.responseText;
                        var index = responseText.indexOf(ajax.exceptionStart);
                        if (index > 0) {
                            var exception = responseText.substr(index + ajax.exceptionStart.length + 1);
                            index = exception.lastIndexOf(ajax.exceptionEnd);
                            if (index > 0) {
                                exception = exception.substr(0, index);
                            }
                            error(exception);
                        } else {
                            error(errorThrown);
                        }
                    }
                }
            });
    },
}

您在这里遇到的问题是,您尝试在创建变量之前从闭包访问变量ajax

var myVariable = {
    myProperty: "Hello",
    myFunction: function () {
        //... access myVariable.myProperty -> error
    }
};

这里有两种选择。更干净的一个,我会使用的那个是这样的:

var ajaxOptions = {
    defaultAjaxTimeout: 600000,
    exceptionStart: '<!--',
    exceptionEnd: '-->'
};
var ajax = {
    postJson: function (url, data, success, error) {
        ... ajaxOptions.exceptionStart.length
    }
};

这样做的原因是因为ajaxOptions已经存在于您声明函数的作用域中ajax.postJson因此它能够从其闭包中正确引用它。

此选项的变体是这样的:

var ajax = {
    defaultAjaxTimeout: 600000,
    exceptionStart: '<!--',
    exceptionEnd: '-->'
};
ajax.postJson = function (url, data, success, error) {
    ... ajax.exceptionStart.length
};

这样做的原因是因为ajax已经声明,并且只是附加到函数的闭包上。

第二个不太干净的选项是将ajax变量作为window对象的子变量:

window.ajax = {
    defaultAjaxTimeout: 600000,
    exceptionStart: '<!--',
    exceptionEnd: '-->',
    postJson: function (url, data, success, error) {
        ... window.ajax.exceptionStart.length
    }
};

这样做的原因是window始终存在于所有词汇范围内,因此引用它没有问题。它不太干净的原因是因为它污染了窗口对象,页面上任何位置的任何 JavaScript 都可以访问和更改它,这可能会导致未知行为。我不推荐它,我只是提供它作为一个例子。

以下步骤帮助我解决了类似的问题,我使用了IE11IE 11 中的解决方案可以是:

  1. 在互联网设置下,选择"兼容性视图设置",
  2. 在"添加
  3. 此网站"中,输入您网站的服务器名称(例如:本地主机(,单击"添加"btn。
  4. 勾选"在兼容性视图中显示内联网步骤"框。

最新更新