1.写一个类封装jsonp:

  jsonp(url, params, success, funName)

      参数url:请求地址

      参数params:请求数据,可以是json对象,或形如"name=zs&age=10"的字符串,或null

      参数success:jsonp请求成功回调函数

      参数funName:指定服务端响应数据包裹json对象的函数名,也可以不传该参数

/*
* jsonp必须是get请求
* 参数:
* url:请求地址,
* params:请求体,
* success:回调函数
* funName: 函数名,jsonp返回数据会调用该函数
*/
function jsonp(url, params, success, funName) {
  // 如果params是json对象,转换成字符串,格式为"name=张三&age=10"
if(params && typeof params == 'object') {
var tempArray = [];
for(var key in params) {
var value = params[key];
tempArray.push(key + "=" + value);
}
// tempArray ==> [ 'key1=value1', 'key2=value2']
// params ==> 'key1=value1&key2=value2'
params = tempArray.join("&");
//alert("params:" + params); // params:name=张三&age=10
} var script = document.createElement("script"); if(!funName) {
// 定义一个随机的函数名
var funName = 'callback_' + Date.now() + Math.random().toString().substr(2, 5);
} // 函数定义,jsonp返回数据会调用该函数
window[funName] = function(data) {
success(data);
delete window[funName];
document.body.removeChild(script);
} //script.src = "http://localhost/Demo01/jsonResult?jsonp=funName";
url = url + "?" + "jsonp=" + funName;
if(params) {
url += "&" + params;
} script.src = url;
document.body.appendChild(script); // 发送跨域请求,服务器返回数据:funName({"name":"李四","age":20})
}

2.测试

  调用自己封装的函数:jsonp(url, params, success, funName),服务端响应:fun1({"name":"李四","age":20})

<script type="text/javascript">
window.onload = function() {
var btn = document.getElementById("btn");
btn.onclick = function() {
jsonp("http://localhost/Demo01/jsonResult", null, function(data) {
var fontEle = document.getElementById("font");
fontEle.innerHTML = data.name + "-" + data.age;
}, "fun1");
};
};
</script>
<input type="button" id="btn" value="点击发送Ajax请求"/>
<h1><font color="red" id="font"></font></h1>

3.服务端controller:

@Controller
public class JsonResultController {
@RequestMapping("/jsonResult")
@ResponseBody
public String fun1(String jsonp) {
if(jsonp.length() > 0) { // jsonp请求
return jsonp + "(" + "{\"name\":\"李四\",\"age\":20}" + ")";
} else {
return "{\"name\":\"李四\",\"age\":20}";
}
}
}

最新文章

  1. [LeetCode] Rotate Function 旋转函数
  2. [翻译] ORMLite document -- How to Use Part (二)
  3. WPF系列 Path表示语法详解(Path之Data属性语法)
  4. 已解决:ECSHOP安装出现date_default_timezone_get()问题
  5. C# 内嵌其他程序到自己程序
  6. CentOS7 服务器 JDK+TOMCAT+MYSQL+redis 安装日志
  7. header()相关
  8. CentOS评估磁盘I/O性能读写极限测试
  9. lightoj 1032 二进制的dp
  10. c#中使用数据读取器读取查询结果
  11. windows7 iis安装与配置
  12. Android离线缓存
  13. ERP中通过自定义单打开流程图
  14. 链接错误:multiple definition of &#39;xxx&#39; 问题解决及其原理
  15. 在Ubuntu 18.04中安装pyenv(Python多版本管理工具)
  16. spring cloud(学习笔记)微服务启动错误(1)
  17. 常用的Markdown语法
  18. UML和模式应用3:迭代和进化式分析和设计案例研究
  19. ES6-循环
  20. 无用之flask

热门文章

  1. oracle 之 基础操作
  2. BZOJ2956: 模积和
  3. DownAlbum:Chrome的pinterest批量下载插件
  4. Netty 核心组件笔记
  5. SQL语句执行的顺序机制
  6. Windows Service application 初步探索
  7. facebook api之Business Manager API
  8. Robot Framework+AutoItLibrary使用
  9. Mysql视图、触发器、事务、储存过程、函数
  10. 牛客练习赛7 E 珂朵莉的数列(树状数组+爆long long解决方法)