当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP下ajax跨域的解决方案之window.name实例分析详解

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-21 20:55:27 浏览: 评论:0 

本文实例讲述了PHP下ajax跨域的解决方案之window.name。分享给大家供大家参考,具体如下:

原理核心:window对象的name属性是一个很特别的属性,当该window的location变化,然后重新加载,它的name属性可以依然保持不变。

依此原理,我们可以在页面A中用iframe加载其他域的页面B,而页面B中用JavaScript把需要传递的数据赋值给 window.name,页面A的iframe加载完成之后,页面A修改iframe的地址,将其变成同域的一个地址,然后就可以读出window.name的值了。

例:有两个网站www.a.com和www.b.com,我们要在www.a.com/a.html下获取www.b.com/data.html数据。

我们需要三个文件:

www.a.com 下的 a.html 获取数据并显示

www.b.com 下的data.html 提供数据

www.a.com 下的proxy.html 代理文件,与a.html同一域下,一般为空html文件。

www.b.com下的data.html如下:

  1. <!DOCTYPE html> 
  2.  
  3. <html> 
  4.  
  5. <head> 
  6.  
  7.   <meta charset="UTF-8"> 
  8.  
  9.   <title>Insert title here</title> 
  10.  
  11. </head> 
  12.  
  13. <body> 
  14.  
  15.   <script type="text/javascript"> 
  16.  
  17.     //添加需要传递的数据,大小一般为2M,IE和firefox下可以大至32M左右 
  18.  
  19.     window.name = '[{"name":"test1"},{"name":"test2"}]'
  20.  
  21.   </script> 
  22.  
  23. </body> 
  24.  
  25. </html> 

www.a.com下的proxy.html如下:

  1. <!DOCTYPE html> 
  2.  
  3. <html> 
  4.  
  5. <head> 
  6.  
  7.   <meta charset="UTF-8"> 
  8.  
  9.   <title>Insert title here</title> 
  10.  
  11. </head> 
  12.  
  13. <body> 
  14.  
  15.   <!-- 空的html文件 --> 
  16.  
  17. </body> 
  18.  
  19. </html> 

www.a.com下的a.html如下:

  1. <!DOCTYPE html> 
  2.  
  3. <html> 
  4.  
  5. <head> 
  6.  
  7.   <meta charset="UTF-8"> 
  8.  
  9.   <title>Insert title here</title> 
  10.  
  11. </head> 
  12.  
  13. <body> 
  14.  
  15.    
  16.  
  17. <!-- 用于引用www.b.com/data.html文件 --> 
  18.  
  19. <iframe id="iframe" src=""></iframe> 
  20.  
  21.    
  22.  
  23. <!-- 显示获取到的数据 --> 
  24.  
  25. <p id="data"></p> 
  26.  
  27.    
  28.  
  29. <script type="text/javascript" src="./jquery.js"></script> 
  30.  
  31. <script type="text/javascript"> 
  32.  
  33. var ifr = document.getElementById("iframe"); 
  34.  
  35. ifr.src = "http://www.b.com/data.html"
  36.  
  37. if (ifr.attachEvent) { 
  38.  
  39.   ifr.attachEvent("onload", loadfunc); 
  40.  
  41. } else { 
  42.  
  43.   ifr.onload = loadfunc
  44.  
  45.  
  46.    
  47.  
  48. var state = 0
  49.  
  50. function loadfunc() { 
  51.  
  52.   if(state == 0) { 
  53.  
  54.     state = 1
  55.  
  56.     ifr.contentWindow.location = "http://www.a.com/proxy.html"
  57.  
  58.   } else { 
  59.  
  60.     var data = ifr.contentWindow.name; 
  61.  
  62.     $.each($.parseJSON(data), function(i, v) { 
  63.  
  64.       $("#data").append(v.name); 
  65.  
  66.     }); 
  67.  
  68.        
  69.  
  70.     //销毁iframe,保证安全 
  71.  
  72.     ifr.contentWindow.document.write(""); 
  73.  
  74.     ifr.contentWindow.close(); 
  75.  
  76.     document.body.removeChild(ifr); 
  77.  
  78.   } 
  79.  
  80.  
  81. </script> 
  82.  
  83. </body> 
  84.  
  85. </html>

Tags: window.name

分享到: