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 ?>

 

posted @ 2019-05-16 10:07  进击的三三  阅读(197)  评论(0编辑  收藏  举报