【问题标题】:jQuery deprecated function for cross domain responsejQuery 弃用了跨域响应的函数
【发布时间】:2026-02-19 08:25:02
【问题描述】:

基本上我一直在使用这个函数来实现跨域 JSONP 但部分函数_success.call(this, { responseText: data.results[0].replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')}, 'success'); 失败并响应Uncaught TypeError: Object #<Object> has no method 'isResolved'

现在我知道 .isResolved() http://api.jquery.com/deferred.isResolved/ 已被弃用,所以我想知道如何让它与已接管的 deffered.state() http://api.jquery.com/deferred.state/ 一起工作。

任何帮助将不胜感激。回到以前版本的 jQuery 真的不是一个选择。

下面的完整功能。

jQuery.ajax = (function(_ajax){

    var protocol = location.protocol,
        hostname = location.hostname,
        exRegex = RegExp(protocol + '//' + hostname),
        YQL = 'http' + (/^https/.test(protocol)?'s':'') + '://query.yahooapis.com/v1/public/yql?callback=?',
        query = 'select * from html where url="{URL}" and xpath="*"';

    function isExternal(url) {
        return !exRegex.test(url) && /:\/\//.test(url);
    }

    return function(o) {

        var url = o.url;

        if ( /get/i.test(o.type) && !/json/i.test(o.dataType) && isExternal(url) ) {

            // Manipulate options so that JSONP-x request is made to YQL

            o.url = YQL;
            o.dataType = 'json';

            o.data = {
                q: query.replace(
                    '{URL}',
                    url + (o.data ?
                        (/\?/.test(url) ? '&' : '?') + jQuery.param(o.data)
                    : '')
                ),
                format: 'xml'
            };

            // Since it's a JSONP request
            // complete === success
            if (!o.success && o.complete) {
                o.success = o.complete;
                delete o.complete;
            }

            o.success = (function(_success){
                return function(data) {
                    if (_success) {
                        // Fake XHR callback.
                        _success.call(this, {
                            responseText: data.results[0]
                                // YQL screws with <script>s
                                // Get rid of them
                                .replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')
                        }, 'success');
                    }

                };
            })(o.success);

        }

        return _ajax.apply(this, arguments);

    };

})(jQuery.ajax);

【问题讨论】:

    标签: jquery html cross-domain deprecated


    【解决方案1】:

    我遇到了和你一样的问题并找到了解决方案。事件虽然是不久前的问题,但我决定发布我的解决方案,如果其他人应该像我一样遇到这个问题。

    jquery.xdomainajax.js 转到62 行并更改

    if (_success) {
        // Fake XHR callback.
        _success.call(this, {
            responseText: (data.results[0] || '')
                // YQL screws with <script>s
                // Get rid of them
                .replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')
        }, 'success');
    }
    

    if (_success) {
        // Fake XHR callback.
        var obj = {
            responseText: (data.results[0] || '')
                // YQL screws with <script>s
                // Get rid of them
                .replace(/<script[^>]+?\/>|<script(.|\s)*?\/script>/gi, '')
        };  
        $.extend(obj,{
            isResolved: function() { return true; },
            done: function() { return true; }
        });
    
        _success.call(this, obj, 'success');
    }
    

    【讨论】:

    • 谢谢哥们。我用这个时间太晚了,但希望人们会发现这很有用。再次干杯