0

複数の入れ子関数から変数(lib)を取得しようとしています。

var nme='name',lib;

$('script').each(function(){

    var src=$(this).attr('src');

    if(typeof(src)==='undefined'){src='';}

if(src.indexOf(nme)!==-1){

    $.get($(this).attr('src').match(/\w([^ ]+)spbin/)[0]+'/conf/ptmedia.plist',
        function(c){
            $(c).find('key').each(function(){
                if($(this).html()==='MediaLib'){lib=$(this).next().html();}
            });
        }
    );

}
});

if(lib==='some lib'){DO STUFF}
4

2 に答える 2

4

問題はスコーピングではなく、非同期のAJAX呼び出しがあることです。代わりに、HTMLの変更を.nullコールバック関数内に配置する必要があります。

$.get($(this).attr('src').match(/\w([^ ]+)spbin/)[0]+'/conf/ptmedia.plist',
        function(c){
            $(c).find('key').each(function(){
                if($(this).html()==='MediaLib'){lib=$(this).next().html();}

                $('.null').html(lib);
            });
        }
});

JavaScriptでは、多くの場合、IOは非同期です。これは、AJAX呼び出しを行うときに、すぐには発生せず、HTTP要求から値が返されるのを待ってから、コールバックを呼び出すことを意味します。あなたの場合function(c)、それはコールバックであり、AJAX呼び出しの値が到着したときに実行されます。

つまり、実際には、更新前の値を取得したため、のHTMLコンテンツ.nullを未定義にlib更新していました。

于 2013-03-25T18:49:58.037 に答える
0

私はこの問題を次のように解決しました:

var nme='name';

    $('script').each(function(){

    var src=$(this).attr('src');

        if(typeof(src)==='undefined'){src='';}

        if(src.indexOf(nme)!==-1){media=$(this).attr('src').match(/\w([^ ]+)spbin/)[0];}

    });


    function ffn(){
    $($.ajax({url:media+'/conf/ptmedia.plist',async:false}).responseText).find('key').each(function(){
        if($(this).html()==='string'){value=$(this).next().html();}
    });

    return value;
    }

    if(ffn()==='some lib'){DO STUFF}

たくさんのご参加と良いアイデアをありがとうございました!

于 2013-03-25T20:34:30.663 に答える