Jsonp + Javascript(nojquery)没有返回任何方法错误

时间:2013-12-24 19:29:18

标签: javascript json jsonp

好的,所以我试图通过jsonp使用纯js(没有jquery / ajax)来获取数据。我不得不承认它已经有一段时间了,因为我已经走了纯粹的js路线所以我需要一些帮助。到目前为止,这是我的代码:

 <div id = 'inforoll'></div>
    <script type="text/javascript">
    function blah(data){
        var copy = '';
        var len = data.length;
        for(var i=0;i<len;i++){
            nLine = data[i];
              copy += '<li id="' + nLine.render_client + '">' + nLine['copy'] + '</li>' 
        }
        document.getElementById('inforoll').innerHTML = copy;
    }
    </script>
    <script type="text/javascript" src="http://example.com/example.js"></script>

尝试获取的jsonp数据示例:

blah.render_client({
  "color": "blue",
  "name": "bob"
}

抛出错误:

Uncaught TypeError:Object function Blah(data){
var copy='',
var len = data.length;
for(var i=0;i<len;i++){
            nLine = data[i];
              copy += '<li id="' + nLine.render_client + '">' + nLine['copy'] + '</li>' 
        }
        document.getElementById('inforoll').innerHTML = copy;
    }has no method 'render-client'

好的我明白了,我需要创建一个方法:

    function blah(data){
        this.render_client = This is where my brain stops working and I can't think of what to do next.

        var copy = '';
        var len = data.length;
        for(var i=0;i<len;i++){
            nLine = data[i];
              copy += '<li id="' + nLine.render_client + '">' + nLine['copy'] + '</li>' 
        }
        document.getElementById('inforoll').innerHTML = copy;
    }

我只需要一些合乎逻辑的启示,所以我都是耳朵。谢谢所有人!

1 个答案:

答案 0 :(得分:0)

JSONP中加载一个脚本标记,该标记返回一个带有JSON对象作为参数的函数调用。期望是该功能已在页面上定义。原因是绕过通常阻止使用AJAX从其他域访问数据的Same Origin Policy,但允许您包含来自其他域的脚本标记。

好的,足够的说明,基于您的JSONP数据示例,您需要定义具有方法blah的对象render_client。一个非常基本的例子是:

<script type="text/javascript">
    var blah = {
        render_client: function(data) {
            // data is the JSON object itself
            var copy = '';
            for(var prop in data){
                copy += '<li id="' + prop + '">' + data[prop] + '</li>' 
            }
            document.getElementById('inforoll').innerHTML = copy;
        }
    };
</script>

注意,在示例代码中,我将for更改为for..in,因为您正在迭代对象。为简单起见,我排除了hasOwnProperty check,以排除您不关心的继承属性。