0

我尝试创建一个加载多个提要 rss 的 jquery 插件(它们很灵活,可以是 1 个或 2 个或 3 个等),用于创建一个显示已加载新闻提要的 html。我的目标是有可能加载多个 rss 提要 (xml) 并通过 html 显示它们。当我尝试似乎回调被覆盖时,我收到了 2 个结果但相等。

例子:

(function($){
    $.fn.getFeed = function(Obj){
        var
            arrOpt = Obj.arrayOptions,
            arrOptLng = arrOpt.length;

        for(var i = 0; i < arrOptLng; i++){
            var 
                index = i,
                Opt = arrOpt[i],
                feedUrl = Opt.feed,
                sucFnc = Opt.callback,
                $cnt = this;

            console.log(index);
            // here:
            // 0
            // 1

            $.ajax({
                url:feedUrl,
                dataType: "jsonp",
                success:function(data){
                    sucFnc(data,$cnt,Opt,index);
                },
                error:function(){
                    $cnt.html('error');
                }
            });
        }
    }
})(jQuery);

function feedManipulation(){
    console.log(index)
    // here:
    // 1
    // 1
}

/* DOM LOADED */
$(function(){
    $('.news').getFeed({ // Activation getFeed
        arrayOptions:[{
            feed:'http://feed', 
            callback:feedManipulation,
            imgDefault:'http://img',
            nArtc:1
        },{
            feed:'http://feed', 
            callback:feedManipulation,
            imgDefault:'http://img',
            nArtc:1
        }]
    });
});
4

1 回答 1

0

Ciao,我写了这个问题并创建了解决方案,所以我会解释一下。在这段代码中,我删除了 cyclo for 并创建了一个包含 ajax 调用的函数。第一次触发 ajax 函数时,我将一个参数传递给 ajax 函数,其中包含一个用于设置插件(锁定在底部)的对象,而我的 ajax 函数本身就是调用,然后将相同的对象发送到 ajax功能我更改了一些信息,例如“Opt.index”,以这种方式创建了一个 ajax 循环。它真的有用吗;) 使用它。

(function($){
        $.fn.getFeed = function(Obj){

            // Options object
            Opt = new Object();
            Opt.index = 0;
            Opt.$cnt = this;
            Opt.arrOpts = Obj.arrayOptions;
            Opt.arrOptLng = Opt.arrOpts.length;
            Opt.arrOpt = Opt.arrOpts[Opt.index];
            Opt.feedUrl = Opt.arrOpts[Opt.index].feedUrl;

            // ajax call
            cycloAjax(Opt);
        }

        /* ajax cyclo */
        function cycloAjax(Obj){
            $.ajax({
                url: Obj.feedUrl,
                dataType: "jsonp",
                success:function(data){
                    feedManipulation(data,Obj.$cnt,Obj);

                    if(Obj.index < Obj.arrOptLng - 1){
                        Obj.index++;
                        Obj.arrOpt = Obj.arrOpts[Obj.index];
                        Obj.feedUrl = Obj.arrOpts[Obj.index].feedUrl;
                        cycloAjax(Obj);
                    }
                    else{
                        completeLoadFeeds(Obj.$cnt,Obj);
                    }
                },
                error:function(){
                    Obj.$cnt.html('<p>error</p>');
                }
            });
        }

        .
        .
        .

    })(jQuery);

    /* DOM LOADED */
    $(function(){
        $('.news').getFeed({ // Activation getFeed
            arrayOptions:[{
                feed:'http://feed', 
                callback:feedManipulation,
                imgDefault:'http://img',
                nArtc:1
            },{
                feed:'http://feed', 
                callback:feedManipulation,
                imgDefault:'http://img',
                nArtc:1
            }]
        });
    });
于 2013-01-16T17:44:50.123 回答