js怎么解决跨域
1、下面的代码都用到了jquery,在控制台执行,没有jquery的页面参考这篇经验在控制台动态引入一下。
2、无法跨域直接请求ajax,者是浏览器为了安全对页面做出的限制,例如我们在经验页面写个ajax请求,请求百度首页的页面,控制台会报错
$.ajax({url:'//www.baidu.com'})


3、而在首页发同样的请求,则可以成功。


4、而使用jsonp的写法,则可以对不同域名的服务器发起ajax请求。
$.ajax({
url: '//mdfm.eastmoney.com/EM_UBG_MinuteApi/Js/Get',
data: {
dtype: 25,
style: 'tail',
check: 'st',
dtformat: 'HH:mm:ss',
id: '0006272',
num: 17
},
jsonp: "cb",
dataType: 'jsonp',
success: function(data) {
console.log(data);
}
});

5、而后台需要返回一个页面,把需要返回的数据写在页面上,例如java的spring框架可以这样写
@RequestMapping(value = { "/unPush.do" })public void test(HttpServletResponse response){ writeJSONPResponse(response, "success"); }private void writeJSONPResponse(HttpServletResponse response, Object data) { response.setContentType("text/plain"); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); JSONObject resultJSON = JSONObject.fromObject(data); // 根据需要拼装json String jsonpCallback = request.getParameter("callback");// jquery自带jsonp参数,包装数据的函数名 try (PrintWriter out = response.getWriter();) { out.println(jsonpCallback + "(" + resultJSON.toString(1, 1) + ")");// 返回jsonp格式数据 out.flush(); } catch (IOException e) { e.printStackTrace(); }}

1、首先要保证2个页面你都可以修改代码。如果是别人的页面,你不可能控制的,你能控制别人的页面说明浏览器安全出问题了。
html5增加了onmessage和postMessage方法,用于同一页面的父窗口和iframe之间通信。
在控制台的top中输入以下代码,监听iframe发给自己的消息
window.onmessage = function(e) {
console.log("收到iframe消息,iframe域名是:" + e.origin);
console.log("收到iframe消息,内容是:" + e.data);
}

2、将控制台输入框切换为页面中某个iframe的,然后运行以下代码
window.top.postMessage({
data: 'hello'
}, '*');
可以看到父窗口输出了内容。能够互相发送数据,就能跨域完成一切功能了。

3、这里只是简单介绍这个方法,具体细节搜索"postMessage api"去查看。
