<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title></title><script type="text/javascript" src="http://remoteserver.com/remote.js"></script> </head> <body></body> </html>毫无疑问,页面将会弹出一个提示窗体,显示跨域调用成功。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title></title><script type="text/javascript">var localHandler = function(data){ alert("我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:" + data.result);};</script><script type="text/javascript" src="http://remoteserver.com/remote.js"></script> </head> <body></body> </html> remote.js文件代码如下:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><title></title><script type="text/javascript">// 得到航班信息查询结果后的回调函数var flightHandler = function(data){ alert("你查询的航班结果是:票价 " + data.price + " 元," + "余票 " + data.tickets + " 张。");};// 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)var url = "http://flightQuery.com/jsonp/flightResult.aspx?code=CA1998&callback=flightHandler";// 创建script标签,设置其属性var script = document.createElement("script");script.setAttribute("src", url);// 把script标签加入head,此时调用开始document.getElementsByTagName("head")[0].appendChild(script);</script> </head> <body></body> </html> 这次的代码变化比较大,不再直接把远程js文件写死,而是编码实现动态查询,而这也正是jsonp客户端实现的核心部分,本例中的重点也就在于如何完成jsonp调用的全过程。flightHandler({"code": "CA1998","price": 1780,"tickets": 5 }); 传递给flightHandler函数的是一个json,它描述了航班的基本信息。运行一下页面,成功弹出提示窗口,jsonp的执行全过程顺利完成!header("Access-Comtrol-Allow-Origin:*");<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>其中*表示允许任何域向我们的服务端提交请求。也可以设置指定的域名,代码如下:
header("Access-Control-Allow-Origin:http://www.test2.com");设置好头信息之后,其他域就可以进行请求了。
<!DOCTYPE html> <html><head> <meta charset="utf-8"> <title></title></head> <script type="text/javascript">function sendIt(){ document.getElementById("otherPage").contentWindow .postMessage(//向子窗口发出请求document.getElementById("message").value,//值"http://127.0.0.1:8020"//目标域 )} </script><body> <iframe src="http://127.0.0.1:8020/test2/JS/jstest/Cross-document-messaging/other.html" id="otherPage" width="" height=""></iframe> <br /><br /> <input type="text" name="message" id="message" value="" /> <input type="button" name="" id="" value="发送跨域消息" onclick="sendIt();" /></body> </html> 窗口所引用页面other.html代码如下:<!DOCTYPE html> <html><head> <meta charset="utf-8"> <title></title> <script type="text/javascript">window.addEventListener("message",function(event){//通过onmessage监听 //将从父窗口传来的数据展现出来 document.getElementById("content").innerHTML+=event.data+"<br>";},false); </script></head><body> 信息来自于另外一个域 <div id="content"> </div></body> </html>试验结果如下:
可以看到在81端口服务器中的index.html和8020端口的服务器中的other.html进行的通信。
完整代码如下:
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title> </head><script type="text/javascript"> function sendIt(){ document.getElementById("otherPage").contentWindow .postMessage(//向子窗口发出请求 document.getElementById("message").value,//值 "http://127.0.0.1:8020"//目标域 ) }</script> <body> <iframe src="http://127.0.0.1:8020/test2/JS/jstest/Cross-document-messaging/other.html" id="otherPage" width="" height=""></iframe> <br /><br /> <input type="text" name="message" id="message" value="" /> <input type="button" name="" id="" value="发送跨域消息" onclick="sendIt();" /> </body></html>CrossDocumentMessaging_index.html<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title></title><script type="text/javascript"> window.addEventListener("message",function(event){//通过onmessage监听 //将从父窗口传来的数据展现出来 document.getElementById("content").innerHTML+=event.data+"<br>"; },false);</script> </head> <body> 信息来自于另外一个域 <div id="content"></div> </body></html>以上就是本文的全部内容,希望对大家了解熟悉常见的javascript跨域通信方法有所帮助。