15天学会jQuery编程与实战(视频教学版) (Web前端技术丛书)
上QQ阅读APP看书,第一时间看更新

3.12 实战2:利用Ajax实现微博的实时更新

微博是当前年轻人使用频率非常高的网络服务,它有多种客户端,如电脑、手机、平板等。微博有一个非常显著的特点,就是信息实时更新,这是如何办到的呢?其实,微博的实现原理依然要归功于Ajax技术。

无论是在手机上,还是在电脑屏幕上,浏览微博信息都不需要手动获取数据,微博信息会主动推送到客户端,把最新的数据呈现在微博列表的第一条。这需要依赖两个比较核心的技术:定时器和Ajax技术。

根据HTTP协议的规定,每一次HTTP连接都是单向的,而且不可逆。因此,信息的主动推送不能依赖这项网络协议,客户端只能使用定时器技术定期主动从服务器端获取数据。在JavaScript技术中,最常见的定时器莫过于setInterval和setTimeout函数,这两个函数都用于实现定时功能,前者是多次定时,后者是单次定时。一般来说,采用setInterval函数更常见一些,因为它在支持多次定时时效率相对较高,而且可以通过与之对应的clearInterval函数控制定时器。

微博数据的刷新肯定不会依赖网页的刷新。因此,Ajax是一项必用的技术,它是不刷新网页而获取数据的首选。如果读者看过微博网页的源代码,就不难发现,微博采用的正是本章学习的jQuery的Ajax技术。

技术的选择确定以后,就需要分析其他设计了,如数据类型、信息展示、是否需要动画效果等。一般来说,JSON格式是这类大数据传输应用的首选,因为它的解析工作比较轻松,而且数据量不大。如果读者使用过微博,就会发现当有新的数据需要呈现在顶部时,它会以一种渐进的动画效果出现,这会显得更友好一些。

根据以上分析,完全可以复制微博实时刷新功能。以下是详细的代码实现(jq_weibo.html):

        01    <html>
        02         <head>
        03             <title>我的微博</title>
        04               <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
        05               <script type="text/javascript" src="../jquery-3.1.1.js"></script>
        06               <script type="text/javascript">
        07                 $(document).ready(function(){       //加载执行
        08                      var url = 'weibo.php';           //服务器端地址,往往是动态的
        09                      //开始定时器
        10                          window.setInterval(function(){
        11                           $.get(url,                     //目标URL
        12                                function(data){          //成功回调函数
        13                                           var json = eval('('+data+')');
        14                                    var title = json['title'];      //title数据
        15                                    //content数据
        16                                           var content = json['content'];
        17                                    var time = new Date();  //当前时间
        18                                     var year = time.getYear(); //年度
        19                                     var month = time.getMonth(); //月份
        20                                     var date = time.getDate(); //日
    21                                    var hh = time.getHours(); //时
    22                                    var mm = time.getMinutes(); //分
    23                                     var ss = time.getSeconds(); //秒
    24                                    //拼凑事件格式的字符
    25                                           time = year+'-'+month+'-'+date+'
                                      '+hh+':'+mm+':'+ss;
    26                                    var str = '<div class="info">';//定义数据变量
    27                                    str += '<h3>'+title+'</h3>';    //标题
    28                                           str += '<p class="content">
                                    '+content+'</p>'; //内容
    29                                    str += '<p class="time">发布
                                      于:'+time+'</p>'; //时间
    30                                           str += '</div>';
    31                                    $(".container").prepend(str);   //插入到顶部
    32                                     });
    33                      }, 10*1000);                                 //间隔为10秒
    34                    });
    35               </script>
    36               <style>
    37                 .container{                                  /*容器的样式*/
    38                          width: 300px;
    39                          margin: 5px auto;
    40                          padding: 5px;
    41                          border: 1px solid black;
    42                    }
    43                 .info{                                             /*信息的样式*/
    44                          padding: 10px;
    45                          border-bottom: 1px dotted black;
    46                          font-size: 12px;
    47                    }
    48                 .info h3{                                         /*标题的样式*/
    49                          text-align: left;
    50                          font-size: 14px;
    51                          font-weight:600;
    52                    }
    53                 .info .content{                                  /*内容的样式*/
    54                          text-align: left;
    55                          font-size: 12px;
    56                    }
    57                 .info .time{                                      /*时间的样式*/
    58                          text-align: right;
    59                          padding-right:10px;
    60                          margin: 5px 0 0 0;
    61                          color:gray;
    62                    }
    63               </style>
    64         </head>
    65         <body>
    66               <div class="container">
    67                    <div class="info">
    68                      <h3>这是一条微博</h3>
    69                      <p class="content">这是一条微博信息,内容是。。。</p>
    70                      <p class="time">发布于:2014-06-08 12:00:00</p>
    71                    </div>
    72               </div>
        73         </body>
        74    </html>

服务器端的PHP代码如下:

        <? php
      echo "{";
      echo "'title':'I am Title', ";
      echo "'content':'I am content, this is a good day.'";
      echo "}";
        ?>

本示例的效果如图3.17所示。

图3.17 微博举例

不难看出,Ajax和定时器是本案例的核心技术。案例的PHP代码相对简单,而在实际开发中,PHP代码在拼接数据时,一般取的是数据库里最新的数据,这个过程会复杂得多。