2011-07-02 14 views
2

jsonpコールバック関数に渡す引数をさらに指定する方法を教えてください。jsonpコールバック関数に複数のパラメータ/引数を追加する

例えば、私はユーチューブのビデオデータをつかむしようとしている:

http://gdata.youtube.com/feeds/api/videos/gzDS-Kfd5XQ?v=2&alt=json-in-script&callback=youtubeFeedCallback 

が呼び出されるjavascriptのコールバック関数はyoutubeFeedCallbackあると呼び出されたときには、引数を1つしか含まれています。

機能はこのようなものになるだろう今のところ、私が行うことができるようにしたいと思い何

function youtubFeedCallback(response) { 
... 
} 

はこのような第二引数を渡すで、

function youtubeFeedCallback(response, divId) { 
... 
} 

がにこれが可能です行う。私はどこでもオンラインで探してみましたが、何も見つかりませんでした。 ありがとう!

+0

してdivIdはを取得し、この

var arr = { 'gzDS-Kfd5XQ': 'divId_1', 'gwWS-Gasfdw': 'divId_2' }; 

ようdivIdはとVIDEOIDの連想配列を指定し、コールバック関数でありますタグ。私は複数のビデオエントリ呼び出しを行い、divIdを渡す必要があるので、返されるjsonビデオデータを入れるdiv要素を知っています。私は本当にyoutube URLが呼び出されているときdivIdに渡したいと思います。 – Jenn

答えて

5

このようなコールバック関数に引数を追加することはできません。ただし、ラッパー関数を生成することはできます。 JSONPコールバック関数は、デフォルトの名前空間の関数に過ぎませんでした。つまり、既知の名前の生成関数をグローバルwindowオブジェクトに追加するだけです。ステップ1は、名前補うためにある:あなたがループ内でそれをラップし、window[callback_name]が既に取られていないことを確認したいと思います現実の世界では

var callback_name = 'youtubeFeedCallback_' + Math.floor(Math.random() * 100000); 

を。あなたはwindow.hasOwnProperty(callback_name)を使って確認することができます。あなたが名前を持っていたら、機能を構築することができます:

window[callback_name] = function(response) { 
    youtubeFeedCallback(response, divId); 
}; 

あなたはそれにかかわらず、もう少しアップしたいと思います:あなたがアップ有線そのような何かを持っていたらあなたは、

function jsonp_one_arg(real_callback, arg) { 
    // Looping and name collision avoidance is left as an exercise 
    // for the reader. 
    var callback_name = 'jsonp_callback_' + Math.floor(Math.random() * 100000); 
    window[callback_name] = function(response) { 
     real_callback(response, arg); 
     delete window[callback_name]; // Clean up after ourselves. 
    }; 
    return callback_name; 
} 

をでき

jsonp = jsonp_one_arg(youtubeFeedCallback, divId); 

をそしてYouTubeのURLでcallback値としてjsonpの値を使用します。ちょうど呼び出します。

さらに長い引数リストを処理するために、このような関数をさらに構築することができます。または、argumentsapplyで汎用目的のビルドを作成することもできます。

+0

YouTubeのURLが呼び出された時点で、2番目の引数をどのように渡すことができますか?私は、インラインスクリプトタグのsrc属性としてYouTube URLを配置しています。そのため、ページがロードされ、必要なビデオデータがjsonc形式で取得されるときに実行されます。私は2番目の議論をどのdiv要素を私がそのデータを配置するのか把握する必要があります。ありがとう! – Jenn

+0

@Jenn:onloadハンドラを使用して 'src'属性を設定できますか? 'data-src'属性の' http://gdata.youtube.com/... 'URLでページを開始すると、onloadハンドラは' data-src'属性を 'src'に転送できます'jsonp_one_arg'を呼び出して、' src'を設定する前に 'callback'パラメータを修正しています。 –

+1

+1:「jsonp_1」 '、' 'jsonp_2" '、...と言う簡単なカウンタの代わりにrandomを使う理由は? – 6502

0

より良い方法は、YouTubeのURL呼び出しがインラインスクリプトで行われているVIDEOID

function youtubFeedCallback(data) 
{ 
    var divId = arr[data.entry.media$group.yt$videoid.$t]; 
} 
+0

これはほぼ例外なく動作します。同じvideoidの配列キーが複数あった場合は、正しいdivIdを取得します。例えば。 var arr = {"gfefe-eee": 'divId_1'、 "gfefe-eee": 'divId_2'};私は別のdivに表示される同じビデオデータについて心配する必要があります。しかし、ありがとう。 – Jenn

関連する問題