【问题标题】:jQuery.ajax converter not calledjQuery.ajax 转换器未调用
【发布时间】:2012-03-10 18:34:17
【问题描述】:

我在使用 jQuery.ajax 转换器时遇到问题 - 我无法调用我的转换器。

我有这个 jQuery AJAX 代码(简化了问题):

    $.ajax({
    url: "http://myurl/myservice",
    dataType: "JSONP",
    cache: false,
    success: function (data, textStatus, jqXHR) { /* do stuff */ },
    error: function (jqXHR, textStatus, errorThrown) { /* do stuff */ },
    timeout: 5000,
    converters: { "JSONP": myConversionFunction }
});

当我使用这段代码时,转换器函数 myConversionFunction 没有被调用。我想使用转换器转换响应中的日期,如其他 SO 问题中所示,但无法触发。

我使用 fiddler 检查了响应,它是 JSONP,内容类型为“application/x-javascript”。

任何想法我做错了什么?

谢谢, 克里斯。

【问题讨论】:

    标签: javascript json jquery jsonp


    【解决方案1】:

    我认为您不能覆盖 jQuery 的默认转换器,例如 json。改为引入您自己的转换器(并在说明符中包含 text,因为在这种情况下,它是从文本到输出的转换):

    $.ajax({
        url: "http://myurl/myservice",
        dataType: "jsonp myConversion",
        cache: false,
        success: function (data, textStatus, jqXHR) { /* do stuff */ },
        error: function (jqXHR, textStatus, errorThrown) { /* do stuff */ },
        timeout: 5000,
        converters: {
            "text myConversion": function(value) {
                console.log("pre-processing...");
                /* do stuff */
                return value;
            }
        }
    });
    

    【讨论】:

    • (删除了之前的评论 - 我误读了解决方案)。谢谢朱利安,你让我走上了正确的道路。添加我自己的转换确保我得到函数调用。
    • 我正在尝试上述解决方案,但它对我不起作用。我想预处理返回 HTML 并将其视为 JSONP 的内容。我什至将“text myConversion”更改为“* myConversion”。只需将 URL 指向返回 HTML 的任何内容(例如 www.google.com)。我在 IE/Chrome 中遇到语法错误,但在 FF 中会静默失败。
    • JSONP 期望返回的原始内容是有效的 JavaScript:它实际上是对给定位置的 <script> 调用。因此,如果不在服务器端进行额外处理(包装在函数调用中),就不可能使用 JSONP 传输任意数据,例如 HTML 页面。当浏览器尝试将接收到的数据解释为 JavaScript 时,尝试这样做通常会引发语法错误。此外,由于浏览器的跨域策略,您无法访问传输的数据本身。
    • 明白。我有点想可能是这样。所以我想通过 Ajax 处理跨域 HTML,我必须在我的域上创建一个服务器来调用它在后台调用远程域并预处理 HTML。谢谢。
    【解决方案2】:

    我使用这样的代码来管理asp.net的'd'数据:

    $.ajaxSetup({
        data: "{}",
        dataType: "jsonp",
        type: "POST",
        contentType: "application/json",
        converters:
            {
                "json jsonp": function(msg)
                {
                    return msg.hasOwnProperty('d') ? msg.d : msg;
                }
            },
        error: function(xhr, textStatus, errorThrown)
        {
            var errorMessage = "Ajax error: " + this.url + " : " + textStatus + " : " + errorThrown + " : " + xhr.statusText +
                    " : " + xhr.status;
            if (xhr.status != "0" || errorThrown != "abort")
            {
                alert(errorMessage);
            }
        }
    });
    

    也许你需要把它变成小写,比如:

    converters:
        {
            "json jsonp": function(msg)
            {
                return yourfunction(msg);
             }
        }
    

    【讨论】:

    • 感谢您的回答,但没有运气。我尝试将数据类型更改为“jsonp”,然后尝试了各种转换器键匹配,例如“json jsonp”、“json”、“jsonp”,但没有调用该函数。
    • 你试过把 contentType 放进去吗? contentType: "application/json",
    • 我没有做jsonp,但是你可以像这样覆盖json:
    • @ChristopherDavies:请修复
    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 2020-10-15
    • 2015-06-13
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-12
    相关资源
    最近更新 更多