javascript 不用ajax 用 iframe 子域名下做到ajax post数据
最近在一个项目中遇到了ajax跨域的问题,情况如下。有三个域名分别是 a.xx.com b.xx.com c.xx.com 这三个域名都会用用ajax post方式相互读取数据。文笔不好, 不写了妈蛋。自己去看
//a.html
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title></title> 6 </head> 7 <body> 8 9 <script type="text/javascript" charset="utf-8"> 10 var Ajax = { 11 idf : "STONE", 12 frm:null, 13 ifm:null, 14 attribute:{ 15 url:null, 16 type:"post", 17 data:null, 18 success:'Ajax.defaultFunction', 19 beforeSend:null, 20 jsonp: "callbackparam" 21 }, 22 //跨域 23 init:function(){ 24 //创建iframe元素 25 this.ifm = this.createDOM("iframe",{ 26 name:"iframe"+this.idf, 27 id:"iframe"+this.idf, 28 style:"display:none", 29 width:1, 30 height:1 31 }); 32 //创建form元素 33 this.frm = this.createDOM("form",{ 34 action:this.attribute.url, 35 method:this.attribute.type, 36 id:"FORM"+this.idf, 37 name:"FORM"+this.idf, 38 target:"iframe"+this.idf 39 }); 40 document.body.appendChild(this.frm); 41 document.body.appendChild(this.ifm); 42 //回调 callbackparam 43 this.frm.appendChild( this.createDOM("input",{ 44 type:'hidden', 45 name:this.attribute.jsonp, 46 value:this.attribute.success 47 }) ); 48 //参数 input 49 this.initInput(); 50 51 this.frm.submit(); 52 //alert(1); 53 }, 54 //参数 55 initInput:function(data , inputname){ 56 57 //判断initIuput是否是第一次 58 if(typeof data != "object"){ 59 data = this.attribute.data; 60 } 61 for(i in data){ 62 var iname = inputname ? inputname + "["+i+"]" : i; 63 64 if(typeof data[i] == "object"){ 65 this.initInput(data[i], iname); 66 }else{ 67 this.frm.appendChild( this.createDOM("input",{ 68 type:'hidden', 69 name:iname, 70 value:data[i] 71 }) ); 72 } 73 } 74 75 }, 76 77 //创建DOM 78 createDOM:function(Element , data){ 79 var e = document.createElement(Element); 80 for(i in data){ 81 e.setAttribute(i,data[i]); 82 } 83 return e; 84 }, 85 //默认返回处理函数 86 defaultFunction:function(){ 87 console.log("不错!\n可以去搞基!"); 88 }, 89 //清除残留 90 del:function(){ 91 //document.body.removeAttribute(Ajax.frm); 92 //console.log(this); 93 //提交后的回调 94 }, 95 //合并对象 96 extend:function(o,n,override){ 97 for(var p in n){ 98 if(n.hasOwnProperty(p) && (!o.hasOwnProperty(p) || override)){ 99 o[p]=n[p]; 100 } 101 } 102 }, 103 call:function(option){ 104 //赋值 105 this.extend(this.attribute , option , true); 106 //提交 107 108 this.init(); 109 110 this.ifm.onload = this.del; 111 } 112 113 } 114 //使用 115 //如果是跨域请记得把 document.domain 设成一样 116 document.domain = "xx.com"; 117 Ajax.call({ 118 url:'iframe.html', 119 type:'post', 120 data:{ddd:"a",a:{b:2,c:{l:0}}} 121 }); 122 </script> 123 </body> 124 </html>
iframe.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <script type="text/javascript" charset="utf-8"> document.domain = "xx.com"; parent.Ajax.defaultFunction() </script> </body> </html>
现在只可以在子域名下跳跳,哪位大神有兴趣可以改成无限制跨域