0

ロードされたニュースフィードを表示するhtmlを作成するために、複数のフィードrssをロードするjqueryプラグインを作成しようとしました(これらは1、2、または3などの柔軟性があります...)。私のターゲットは、複数の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

チャオ、私はこの質問を書き、解決策を作成したので説明します。このコードでは、サイクロ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 に答える