zoukankan      html  css  js  c++  java
  • ajax和jsonp

    1.原生ajax请求服务端txt文件 

     1 <!DOCTYPE html>
     2 <html lang="en">
     3     <head>
     4         <meta charset="utf-8">
     5         <!-- <script src="myajax.js"></script> -->
     6         <script>
     7         window.onload= function(){
     8             var oBtn = document.getElementById("btn");
     9             oBtn.onclick = function(){
    10                 //创建ajax对象
    11                 var xhr = null;
    12                 if(window.XMLHttpRequest)
    13                 {
    14                     xhr = new XMLHttpRequest();// w3c标准
    15                 }
    16                 else
    17                 {
    18                     xhr = new ActiveXObject("Microsoft.XMLHTTP");// IE
    19                 }
    20                 // 连接服务器
    21                 xhr.open('Get','ha.txt',true);
    22                 // 发送请求
    23                 xhr.send();
    24                 // 接收返回
    25                 xhr.onreadystatechange = function(){ //onreadyStateChange事件是在readyState属性值发生改变时触发的
    26                     if(xhr.readyState == 4){ // readyState的值表示了当前请求的状态
    27                         if(xhr.status == 200){// Status存储了服务器端返回的Http请求响应代码
    28                             alert(xhr.responseText);
    29                         }
    30                         else{
    31                             alert('failed');
    32                         }
    33                     }
    34                 }
    35             }
    36         }
    37         </script>
    38     </head>
    39     <body>
    40     <input id="btn" type="button" value="read" />
    41     </body>
    42 </html>
    View Code
    属性描述
    onreadystatechange 存储函数(或函数名),每当 readyState 属性改变时,就会调用该函数。
    readyState

    存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。

    • 0: 请求未初始化
    • 1: 服务器连接已建立
    • 2: 请求已接收
    • 3: 请求处理中
    • 4: 请求已完成,且响应已就绪
    status

    200: "OK"

    404: 未找到页面

    2.jsonp

    • 什么是JSONP?

    要了解JSONP,不得不提一下JSON,那么什么是JSON ?

    JSON is a subset of the object literal notation of JavaScript. Since JSON is a subset of JavaScript, it can be used in the language with no muss or fuss.

    JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。

    • JSONP有什么用?

    由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。

    • 如何使用JSONP?

    在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数。

    • JSONP的简单实例

      html代码

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="utf-8">
            <script>
                function jsonpCallback(data) {
                    for(var i in data) {
                        alert(i+":"+data[i]);//循环输出
                    }
                }
            var JSONP=document.createElement("script");
            JSONP.src="service.php?callback=jsonpCallback";
            document.getElementsByTagName("head")[0].appendChild(JSONP);
            </script>
        </head>
        <body>
        </body>
    </html>
    View Code

      php代码

    <?php
    
        header('Content-Type:application/json;charset=utf-8');
        //服务端返回JSON数据
        $arr=array('a'=>1,'b'=>2,'c'=>3);
        $result=json_encode($arr);
        //动态执行回调函数
        $callback=$_GET['callback'];
        echo $callback."($result)";
    
    ?>
    View Code
    • JSONP的原理

    首先在客户端注册一个callback, 然后把callback的名字传给服务器。
    此时,服务器先生成 json 数据。
    然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp.
    最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
    客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动态执行回调函数)

    参考文档:http://justcoding.iteye.com/blog/1366102

  • 相关阅读:
    398. Random Pick Index
    382. Linked List Random Node
    645. Set Mismatch
    174. Dungeon Game
    264. Ugly Number II
    115. Distinct Subsequences
    372. Super Pow
    LeetCode 242 有效的字母异位词
    LeetCode 78 子集
    LeetCode 404 左叶子之和
  • 原文地址:https://www.cnblogs.com/ch-n/p/6822228.html
Copyright © 2011-2022 走看看