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

时间:2014-08-28 22:25:51

标签: javascript ajax json rest

    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);
                        }
                    }
                }
            });
    },
}

2 个答案:

答案 0 :(得分:0)

您在这里遇到的问题是您在创建之前尝试从闭包中访问变量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都可以访问和更改它,从而可能导致未知行为。我不推荐它,我只是提供它作为一个例子。

答案 1 :(得分:0)

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

  1. 在互联网设置下选择“兼容性视图设置”,
  2. 在“添加此网站”中输入您网站的服务器名称(例如:localhost),点击“添加”btn。
  3. 勾选'在兼容性视图中显示内部网步骤'框。