> WordPress中文手册 > wordpress进阶教程(三十):ajax简单示例-ajax翻页

一般我们使用浏览器提交新请求或者数据,都会刷新页面,比如在WordPress博客中你要查看下一页的内容,需要刷新页面。ajax技术即可以实现异步提交数据,使用ajax,你可以不刷新页面也可以加载下一页的内容。当然本篇教程并不是讲解ajax技术的,如果你不会使用ajax技术,建议参考w3school的相关文档:Http://www.w3school.com.cn/ajax/。

ajax原理很简单,通过js提交请求,然后服务器上处理请求,再输出数据,浏览器接收数据,并显示。所以ajax在网页上需要js代码,我们一般使用jquery。在服务器上需要处理请求的代码(比如PHP程序)。

以ajax翻页,或者加载下一页内容为例,大概流程为:1、访客在网页上点击下一页(或者加载更多)的链接 /page/2,此时不刷新页面,而是通过jquery提交一个请求到服务器,然后服务器上处理这个请求,输出内容,即将/page/2的内容全部输出,然后浏览器接受数据,然后从接受的数据中挑出文章内容(因为输出内容包含整个网页的代码)并显示到相应的位置。

实现方法:

1、准备网页。

现在需要ajax翻页翻页的网页上准备好下一页的链接,如下是阿树的下一页代码,将链接放在一个div中,以便js选择。

<div class="post-read-more">       <?php next_posts_link('更多+','');//下一页的链接 ?>   </div>   <script src="<?php echo get_template_directory_uri();?>/js/jquery-1.7.2.min.js"></script>    <script src="<?php echo get_template_directory_uri();?>/js/ashu.js"></script>    /**    * by ashu.    * URI: http://www.dba.cn    */      jQuery(document).ready(function($) {    //点击下一页的链接(即那个a标签)    $('div.post-read-more a').click( function() {        $this = $(this);        $this.addClass('loading'); //给a标签加载一个loading的class属性,可以用来添加一些加载效果        var href = $this.attr("href"); //获取下一页的链接地址        if (href != undefined) { //如果地址存在            $.ajax( { //发起ajax请求                url: href, //请求的地址就是下一页的链接                type: "get", //请求类型是get               error: function(request) {                //如果发生错误怎么处理            },            success: function(data) { //请求成功                $this.removeClass('loading'); //移除loading属性                var $res = $(data).find(".post"); //从数据中挑出文章数据,请根据实际情况更改                $('.posts-loop').append($res); //将数据加载加进posts-loop的标签中。                var newhref = $(data).find(".post-read-more a").attr("href"); //找出新的下一页链接                if( newhref != undefined ){                    $(".post-read-more a").attr("href",newhref);                }else{                    $(".post-read-more").hide(); //如果没有下一页了,隐藏                }            }            });        }        return false;    });       });   <div class="posts-loop">        <div id="post-1" class="post"><!--第一篇文章--></div>        <div id="post-2" class="post"><!--第二篇文章--></div>        <div id="post-3" class="post"><!--第三篇文章--></div>        <div id="post-4" class="post"><!--第四篇文章--></div>    </div>  

2、准备js代码。

使用jquery非常方便,所以首先在网页头部加载jquery代码,我在主题底部文件footer.php中加载jqeury。我将jquery-1.7.2.min.js放在了主题文件夹的js文件夹里面,所以用get_template_directory_uri()函数来输出主题的url

<div class="post-read-more">       <?php next_posts_link('更多+','');//下一页的链接 ?>   </div>   <script src="<?php echo get_template_directory_uri();?>/js/jquery-1.7.2.min.js"></script>    <script src="<?php echo get_template_directory_uri();?>/js/ashu.js"></script>    /**    * by ashu.    * URI: http://www.dba.cn    */      jQuery(document).ready(function($) {    //点击下一页的链接(即那个a标签)    $('div.post-read-more a').click( function() {        $this = $(this);        $this.addClass('loading'); //给a标签加载一个loading的class属性,可以用来添加一些加载效果        var href = $this.attr("href"); //获取下一页的链接地址        if (href != undefined) { //如果地址存在            $.ajax( { //发起ajax请求                url: href, //请求的地址就是下一页的链接                type: "get", //请求类型是get               error: function(request) {                //如果发生错误怎么处理            },            success: function(data) { //请求成功                $this.removeClass('loading'); //移除loading属性                var $res = $(data).find(".post"); //从数据中挑出文章数据,请根据实际情况更改                $('.posts-loop').append($res); //将数据加载加进posts-loop的标签中。                var newhref = $(data).find(".post-read-more a").attr("href"); //找出新的下一页链接                if( newhref != undefined ){                    $(".post-read-more a").attr("href",newhref);                }else{                    $(".post-read-more").hide(); //如果没有下一页了,隐藏                }            }            });        }        return false;    });       });   <div class="posts-loop">        <div id="post-1" class="post"><!--第一篇文章--></div>        <div id="post-2" class="post"><!--第二篇文章--></div>        <div id="post-3" class="post"><!--第三篇文章--></div>        <div id="post-4" class="post"><!--第四篇文章--></div>    </div>  

然后我将发起ajax请求代码也放在了主题里面js文件夹中的ashu.js文件,所以再加上一个

<div class="post-read-more">       <?php next_posts_link('更多+','');//下一页的链接 ?>   </div>   <script src="<?php echo get_template_directory_uri();?>/js/jquery-1.7.2.min.js"></script>    <script src="<?php echo get_template_directory_uri();?>/js/ashu.js"></script>    /**    * by ashu.    * URI: http://www.dba.cn    */      jQuery(document).ready(function($) {    //点击下一页的链接(即那个a标签)    $('div.post-read-more a').click( function() {        $this = $(this);        $this.addClass('loading'); //给a标签加载一个loading的class属性,可以用来添加一些加载效果        var href = $this.attr("href"); //获取下一页的链接地址        if (href != undefined) { //如果地址存在            $.ajax( { //发起ajax请求                url: href, //请求的地址就是下一页的链接                type: "get", //请求类型是get               error: function(request) {                //如果发生错误怎么处理            },            success: function(data) { //请求成功                $this.removeClass('loading'); //移除loading属性                var $res = $(data).find(".post"); //从数据中挑出文章数据,请根据实际情况更改                $('.posts-loop').append($res); //将数据加载加进posts-loop的标签中。                var newhref = $(data).find(".post-read-more a").attr("href"); //找出新的下一页链接                if( newhref != undefined ){                    $(".post-read-more a").attr("href",newhref);                }else{                    $(".post-read-more").hide(); //如果没有下一页了,隐藏                }            }            });        }        return false;    });       });   <div class="posts-loop">        <div id="post-1" class="post"><!--第一篇文章--></div>        <div id="post-2" class="post"><!--第二篇文章--></div>        <div id="post-3" class="post"><!--第三篇文章--></div>        <div id="post-4" class="post"><!--第四篇文章--></div>    </div>  

然后是ashu.js中的代码:

<div class="post-read-more">       <?php next_posts_link('更多+','');//下一页的链接 ?>   </div>   <script src="<?php echo get_template_directory_uri();?>/js/jquery-1.7.2.min.js"></script>    <script src="<?php echo get_template_directory_uri();?>/js/ashu.js"></script>    /**    * by ashu.    * URI: http://www.dba.cn    */      jQuery(document).ready(function($) {    //点击下一页的链接(即那个a标签)    $('div.post-read-more a').click( function() {        $this = $(this);        $this.addClass('loading'); //给a标签加载一个loading的class属性,可以用来添加一些加载效果        var href = $this.attr("href"); //获取下一页的链接地址        if (href != undefined) { //如果地址存在            $.ajax( { //发起ajax请求                url: href, //请求的地址就是下一页的链接                type: "get", //请求类型是get               error: function(request) {                //如果发生错误怎么处理            },            success: function(data) { //请求成功                $this.removeClass('loading'); //移除loading属性                var $res = $(data).find(".post"); //从数据中挑出文章数据,请根据实际情况更改                $('.posts-loop').append($res); //将数据加载加进posts-loop的标签中。                var newhref = $(data).find(".post-read-more a").attr("href"); //找出新的下一页链接                if( newhref != undefined ){                    $(".post-read-more a").attr("href",newhref);                }else{                    $(".post-read-more").hide(); //如果没有下一页了,隐藏                }            }            });        }        return false;    });       });   <div class="posts-loop">        <div id="post-1" class="post"><!--第一篇文章--></div>        <div id="post-2" class="post"><!--第二篇文章--></div>        <div id="post-3" class="post"><!--第三篇文章--></div>        <div id="post-4" class="post"><!--第四篇文章--></div>    </div>  

敬告:上面代码中,请求成功之后,浏览器要处理接受的数据,请根据实际情况更改,我的文章列表结构大概如下,所以我将所有class为post的div选出来,然后加载.posts-loop中

<div class="post-read-more">       <?php next_posts_link('更多+','');//下一页的链接 ?>   </div>   <script src="<?php echo get_template_directory_uri();?>/js/jquery-1.7.2.min.js"></script>    <script src="<?php echo get_template_directory_uri();?>/js/ashu.js"></script>    /**    * by ashu.    * URI: http://www.dba.cn    */      jQuery(document).ready(function($) {    //点击下一页的链接(即那个a标签)    $('div.post-read-more a').click( function() {        $this = $(this);        $this.addClass('loading'); //给a标签加载一个loading的class属性,可以用来添加一些加载效果        var href = $this.attr("href"); //获取下一页的链接地址        if (href != undefined) { //如果地址存在            $.ajax( { //发起ajax请求                url: href, //请求的地址就是下一页的链接                type: "get", //请求类型是get               error: function(request) {                //如果发生错误怎么处理            },            success: function(data) { //请求成功                $this.removeClass('loading'); //移除loading属性                var $res = $(data).find(".post"); //从数据中挑出文章数据,请根据实际情况更改                $('.posts-loop').append($res); //将数据加载加进posts-loop的标签中。                var newhref = $(data).find(".post-read-more a").attr("href"); //找出新的下一页链接                if( newhref != undefined ){                    $(".post-read-more a").attr("href",newhref);                }else{                    $(".post-read-more").hide(); //如果没有下一页了,隐藏                }            }            });        }        return false;    });       });   <div class="posts-loop">        <div id="post-1" class="post"><!--第一篇文章--></div>        <div id="post-2" class="post"><!--第二篇文章--></div>        <div id="post-3" class="post"><!--第三篇文章--></div>        <div id="post-4" class="post"><!--第四篇文章--></div>    </div>  

3、浏览器对请求的处理

本例子中,并没有单独写代码处理请求,因为我们的请求地址都是 www.dba.cn/page/2之类的,这类请求wp默认就能处理,也会输出相应的内容,所以不需要另外写处理文件。

当然,这种请求输出的内容是整个网页,跟普通的翻页相比,使用ajax也并无速度之类的优势,在接下来的教程中,我们将写单独特殊的ajax请求。