JSONP
定义(前后端交互只能是字符)
利用src标签,引入我们即将要跨域的资源,利用回调函数来拿到原本跨域的数据
1.
在jsonp1.txt中
1 <script src="http://localhost/1903/jsonp/data/myjsonp1.txt"></script> 2 <script> 3 //jsonp 通过scr标签引入资源 4 fn() 5 </script>
在json1.html中
1 <script src="http://127.0.0.1/1903/jsonp/data/jsonp1.txt"></script> 2 <script> 3 // jsonp是通过script标签引入资源 4 5 fn()//hello 6 </script>
2.
在jsonp2.html中
1 <?php 2 3 // echo "console.log('hello')";
//由于echo后面输出的是字符,所以需要加 ''
4 echo "function fn(){ 5 console.log('HELLO') 6 }"; 7 8 ?>
在json2.html中
1 <script src="http://127.0.0.1/1903/jsonp/data/jsonp2.php"></script> 2 <script> 3 // jsonp是通过script标签引入资源 4 fn() 5 6 // 发现: 7 // 只要是被script标签引入的文件,都会先解析,解析之后,将输出的字符,按照js代码执行,--->在HTML中写函数,在PHP中执行 8 </script>
3.
在js中定义函数,在php中执行函数。在php执行函数传参-->在HTML中的函数中接收-->php文件通过script的src引入进来,把php中echo的出来的东西当做js代码来执行,执行函数时候就把PHP中的数据带了过来。这时候实现跨域(HTML的地址和src的地址不一致)
在jsonp3.html中
1 <script> 2 // jsonp是通过script标签引入资源 3 4 // 发现: 5 // 只要是被script标签引入的文件,都会先解析,解析之后,将输出的字符,按照js代码执行 6 function fn(res){ 7 console.log(res) 8 } 9 </script> 10 <script src="http://127.0.0.1/1903/jsonp/data/jsonp3.php"></script>
1 <?php 2 $data="hello"; 3 //echo "fn(123)"; 4 5 echo "fn(".$data")";// hello is not defined 6 //等同于 "fn(hello)" //hello是字符,外面的""是PHP,里面的是js的 7 8 echo "fn('".$data."')"; //hello 9 10 ?>
4.
1 <script> 2 var oaaa=document.getElementById("aaa") 3 var obbb=document.getElementById("bbb") 4 var obtn=document.getElementById("btn") 5 obtn.onclick=function(){ 6 var url="http://127.0.0.1/1903/jsonp/data/jsonp4.php"; 7 var oa=oaaa.value; 8 var ob=obbb.value; 9 jsonp(url,function(res){ 10 console.log(res) 11 },{ 12 user:oa, 13 pass:ob, 14 }); 15 } 16 function jsonp(url,callback,data){ 17 data=data?data:{};//data为参数,不需要声明 18 let str=""; 19 for( let i in data){ 20 str=str+i+"="+data[i]+"&"; 21 } 22 url=url+"?"+str.slice(0,str.length-1); 23 24 //1.script标签 25 var script=document.createElement("script"); 26 script.src=url; 27 document.body.appendChild(script); 28 //2.函数 29 window.fn=function (res){ 30 callback(res);//hello php,这是接收到的数据:--- 31 } 32 } 33 </script>
1 <?php 2 3 $u = @$_GET["user"]; 4 $p = @$_GET["pass"]; 5 6 $data = "hello php,这是接收到的数据:".$u."---".$p; 7 8 echo "fn('". $data ."')";//字符串拼接 9 10 ?>
5.
1 <script> 2 var oaaa=document.getElementById("aaa") 3 var obbb=document.getElementById("bbb") 4 var obtn=document.getElementById("btn") 5 obtn.onclick=function(){ 6 var url="http://127.0.0.1/1903/jsonp/data/jsonp5.php"; 7 var oa=oaaa.value; 8 var ob=obbb.value; 9 jsonp(url,function(res){ 10 console.log(res) 11 },{ 12 user:oa, 13 pass:ob, 14 // "cb表示后端规定的函数名所在的字段名" 15 cb:"asmjdgajksd", 16 // cloumnName表示前端的函数如何正确找到函数名;cloumnName和后台没关系,自己定义 17 cloumnName:"cb" 18 }); 19 20 } 21 function jsonp(url,callback,data){ 22 data=data?data:{};//data为参数,不需要声明 23 let str=""; 24 for( let i in data){ 25 str=str+i+"="+data[i]+"&"; 26 } 27 url=url+"?"+str.slice(0,str.length-1); 28 29 //1.script标签 30 var script=document.createElement("script"); 31 script.src=url; 32 document.body.appendChild(script); 33 //2.函数 34 //data.cloumnName找到的是"fnName",但是这个单子本身不是我们要找的,
上面的对//应的属性"cb"才是我们需要的。所以需要再解析一层data[data.cloumnName] 35 // 最后cloumnName与后台完全没关系, 36 // window[data["callback"]] = function(res){ 37 // window["asmjdgajksd"] = function(res){ 38 // window.asmjdgajksd = function(res){ 39 window[data[data.cloumnName]]=function (res){ 40 callback(res);//hello php,这是接收到的数据:--- 41 } 42 43 } 44 </script>
1 <?php 2 3 $u = @$_GET["user"]; 4 $p = @$_GET["pass"]; 5 $fnName = @$_GET["cb"]; 6 7 $data = "hello php,这是接收到的数据:".$u."---".$p; 8 9 10 echo $fnName."('". $data ."')"; 11 12 ?>