日期:2014-05-16  浏览次数:20533 次

关于一个JSONP简单示例程序(ASP版)的问题
------------------------------清单6-19.html-------------------------------
<script src="jquery.min.js"></script>
<script>
 function do_jsonp() {
  $.getJSON("http://ec.hynu.cn/test-2.asp?callback=?");
}
function demo(data){ //该函数名必须与JSONP代码中的函数名一致
  $('#result').val('My name is: ' + data.name);
}
</script>
<a href="javascript:do_jsonp();">Click me</a><br />
<textarea id="result" cols="40" rows="3"></textarea>
----------------------------清单http://ec.hynu.cn//test-2.asp ---------------------------
<% Response.Charset = "gb2312" 
  strTest = "demo({name:""alonely"", age:24,email:[""ycplxl1314@163.com"", ""ycplxl1314@gmail.com""], family:{parents:[""父亲"",""母亲""],toString:function(){return ""家庭成员"";}}})"
  Response.Write(strTest) '输出JSONP格式代码
%>
我有如下几个问题,望好心人能帮忙解答:

① 我记得JSONP要在客户端页面动态创建script标记,为什么在6-19.html没有动态创建script标记的代码呢,难道$.getJSON方法在内部会自动创建script标记来跨域访问test-2.asp 。

② 使用JSONP格式时,应该在请求的URL之后添加“?callback=?”,其中callback将作为回调函数。这样$.getJSON()方法才会用JSONP方式去访问服务,将用户在客户端定义的回调函数的函数名(demo)传送给服务端,服务端则会返回用户定义的回调函数名的方法,将获取的json数据传入这个方法完成回调。
我就觉得糊涂了,do_jsonp函数和demo函数没有任何联系,怎么可能把demo函数传送给服务器端呢。

③ ?callback=?中的callback能改成其他的名字吗。

④ ?callback=?改成?callback=demo,则浏览器提示无权限,为什么这样指定回调函数名不行呢。

------解决方案--------------------
1.JQuery帮你做了
2.不是demo,JQuery内部实现了JSONP,原生JS用JSONP需要自己创建一个callback函数,JQ不需要,JQcallback=?,在发出请求的时候随机构造一个函数,你可以用firebug看一下
3.可以,与服务器对应就可以,不过改成其他名字可能callback=?不会被JQ自动识别为JSONP,可以手动$.Post指定方式为JSONP
4.还是第二,你把JQ和原生的混着写了。