Appending multiple parameters/arguments to a jsonp callback function

前端 未结 3 2171
一向
一向 2020-12-18 14:03

How do I specify more arguments to be passed to a jsonp callback function?

For example, I\'m trying to grab youtube video data:

http://gdata.youtube.         


        
相关标签:
3条回答
  • 2020-12-18 14:29

    You can't add arguments to the callback function like that. However, you can generate a wrapper function. The JSONP callback function just was to be a function in the default namespace, that means that you just need to add a generated function with a known name to the global window object. Step one is to make up a name:

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

    In the real world you'd want to wrap that in a loop and check that window[callback_name] isn't already taken; you could use window.hasOwnProperty(callback_name) to check. Once you have a name, you can build a function:

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

    You'd want to that up a little bit more though:

    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;
    }
    

    Once you have something like that wired up, you could just call:

    jsonp = jsonp_one_arg(youtubeFeedCallback, divId);
    

    And then use the value of jsonp as the callback value in the YouTube URL.

    You could build more functions like this to handle longer arguments lists too. Or you could build a general purpose one with arguments and apply.

    0 讨论(0)
  • 2020-12-18 14:36

    better way is specify an associated array of divId and videoId like this

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

    and in callback function get your divId by videoId

    function youtubFeedCallback(data)
    {
        var divId = arr[data.entry.media$group.yt$videoid.$t];
    }
    
    0 讨论(0)
  • 2020-12-18 14:39

    When creating a "script" object, you can add attributes to it, and reference them later with document.currentScript. This worked for me but other people may need something more elegant.

    function blah(stuff,extraarg){
        cs=document.currentScript;
        console.log(stuff); // stuff is your json output
        console.log(cs.extraarg); // cs.extraarg is your extra arg
    }
    
    function thing(extraarg){
        var url='https://....&json_callback=blah';
        var s=document.createElement('script');
        s.src=url;
        s.extraarg=extraarg;
        document.body.appendChild(s);
    }
    
    0 讨论(0)
提交回复
热议问题