国强极客
有问题请加微信:guoqiang7585
国强极客

13、jQuery第2天 事件 Ajax 无刷新分页

13、jQuery第2天 事件 Ajax 无刷新分页

二、今日目标

1、能够知道jQuery是如何释放$符号的
2、能够将jQuery对象和DOM对象相互转化,以及为什么要相互转化
3、能够掌握jQuery普通事件的绑定方法
4、能够掌握jQuery高级事件的使用方法
5、能够掌握jQuery中封装的发送Ajax的get方法
6、能够掌握jQuery中封装的发送Ajax的post方法
7、能够掌握jQuery中封装的发送Ajax的ajax方法

三、杂项

1、释放$

1、什么是释放$

$表示jQuery对象,或者说它表示jQuery函数。使用jQuery必须要使用$符号。释放$,也就是在使用jQuery的时候,不用$符号。

2、为什么要释放$

为了避免冲突,所以要释放\(.
有些时候,可能项目中用到的js框架不止一个,其他框架有可能也用\).
有些时候,我们自己定义一个函数,函数名就是$. 这些情况都会和jQuery中的$产生冲突。

3、如何释放$

如何不使用$,还能用jQuery

    //释放$,方法一
       var a = jQuery.noConflict();//后面的jQuery实用a代替
        a(document).ready(function(){
            a('body').css('background-color', '#ccc');
        });
    //释放$,方法二
       jQuery(document).ready(function () {
            jQuery('body').css('background-color', '#ccffcc');
        });
    //释放$,方法三
        !function($){
            //函数内部,变量$是一个局部变量,它不会影响到外部$。使用$表示jQuery
            $(document).ready(function(){
                $('body').css('background-color', 'green');
            });
        }(jQuery)//实参 立即调用模式;

2、ready事件的简写形式

原来的形式

 //原来的形式
       $(document).ready(function(){
            alert(123);
        });

省略document的写法

        //省略document的写法
     $().ready(function(){
            alert(456);
        });  

最简形式

  //最简形式,一个$()函数调用,参数为页面加载完毕要执行的函数
        $(function(){
            alert(789);
        });

3、ready事件和onload事件的区别

区别1:执行时机不同

ready事件在页面的dom节点加载完毕就会执行,无需下载图片等资源。
onload事件在页面完全加载完毕才会执行,需要页面中所有的资源都下载完毕才会执行。

区别2:执行次数不同

使用事件监听的方式,会执行多个onload事件
 //直接用onload事件,只会执行一个 
  window.onload = function () {
            alert(123);
        };
window.onload = function () {
            alert(456);
        };//只会执行最后一个
使用事件监听的方式,会执行多个onload事件
 //使用事件监听的方式,会执行多个onload事件
       window.addEventListener('load', function () {
            alert(123);
        });
        window.addEventListener('load', function () {
            alert(456);
        });
ready事件,写几个,执行几个
        //jQuery中的ready事件,写几个能够执行几个
        $(function(){
            alert('abc');
        });

        $(function () {
            alert('bcd');
        });

4、DOM对象和jQuery对象的区别

1、什么是DOM对象?什么是jQuery对象?

DOM对象就是通过纯JS的方式,比如document.getEle…..得到的对象就是DOM对象。
jQuery对象就是通过jQuery方法 $(‘li’); 得到的对象。

2、DOM对象和jQuery对象的区别

DOM对象能够调用DOM方法,而不能调用jQuery方法;
jQuery对象能够调用jQuery方法,而不能调用DOM方法;

$(function () {
$('body').append('<input />');
$('body').appendChild('<input />'); //报错,说明jQuery对象不能调用DOM方法

var input = document.createElement('input');
document.body.appendChild(input);
input.appendTo(document.body); //报错,说明DOM对象不能调用jQuery方法。

console.log($('li').length); //这是可以的,因为jQuery中也封装自己的length

3、DOM对象和jQuery对象互换

加下标的方式,将jQuery对象转换成DOM对象

 $(function(){
            var input = document.createElement('input');
            //加下标的方式,将jQuery对象转换成DOM对象 DOM对象都是数组,需要加下标 
            $('body')[0].appendChild(input);
        });

调用get方法,将jQuery对象转换成DOM对象

       $(function(){
            var input = document.createElement('input');
            //调用get方法,将jQuery对象转换成DOM对象
            $('body').get(0).appendChild(input);
        });

用$() 函数处理dom对象,就可以得到jQuery对象

        $(function(){
            var input = document.createElement('input');
         //用$() 函数处理dom对象,就可以得到jQuery对象
            $(input).appendTo(document.body);
        });

5、each方法

人性化的遍历

语法一:

需要遍历的对象.each(function(i, val){
    //每遍历一次,执行一次该函数
    //形参i,就是每次遍历时对象的下标
    //形参val,就是每次遍历的dom对象
});

语法二:

$.each(需要遍历的对象, function(i, val){
    //每遍历一次执行一次该函数。形参i和val和上面的语法中的一样
});

each用于遍历对象或数组,可以理解为for或for…in循环,但是比for和for…in要强大。
演示each的两个用法:

 $(function(){
            var lis = $('li'); //选择的三个li
            //console.log(lis);
            lis.each(function(i, val){
                console.log(i, val);
            });
        
          });

建议使用

 $(function(){
            var lis = $('li'); //选择的三个li
            //console.log(lis);
        $.each(lis, function (i, val) {
                console.log(i, val);
            });          
          });

each和事件配合,能够得到每个li的下标。

$.each(lis, function (i, val) {

//eq形式
lis.eq(i).click(function(){
console.log(i);
 });
 
//形参val是每次遍历的dom对象,所以要转为jq对象
$(val).click(function(){
console.log(i); //单击li的时候,i表示li的下标
});
});

四、jQuery中的事件

1、普通事件

普通事件,比如有click、mouseenter、change、blur…等
语法: click([data], fn);

1、事件方法没有参数,可用于传递事件

        $(function(){
            /*$('input[type="button"]').click(function(){
                //点击button的时候,希望file被点击
                $('input[type="file"]').click();
                //昨天写的可编辑的表格中,用到input.focus(); ,仅仅是希望input获取焦点而已
            });*/


            $('input[type="button"]').click({name:'lisi', age:20}, function(evt){
                console.log(evt.data); //{name: "lisi", age: 20}
                console.log(evt.data.name); //lisi
            });
        });
<form action="">
  <input type="file" name="file" style="display: none;">
    <!-- 文件域在不同的浏览器显示样式不同 -->
    <input type="button" value="请选择文件"><!-- 所以创建一个统一样式的按钮 -->
</form>

2、给事件传入的数据,可通过事件对象的data属性获取

2、on事件

1、给未来的元素绑定事件(事件委托)

语法:

$(父级元素).on(事件类型, 子元素, 处理函数);
普通的click事件,只能给页面中已经存在的元素绑定事件
   //点击页面中的p,能够在body中再添加一个p
        $(function(){
            //普通的click事件,只能给页面中已经存在的元素绑定事件
            $('p').click(function(){
                $('body').append('<p>hello.....</p>');
            });
            //点击页面中的<p>hello.....</p>,无法在新增出<p>hello.....</p>
         });
使用on,可以给未来的元素绑定事件
   //点击页面中的p,能够在body中再添加一个p
        $(function(){
           
            //使用on,可以给未来的元素绑定事件
            //语法:$(父级元素).on(事件类型, 子元素, 处理函数);
            $(document).on('click', 'p', function () {
                $('body').append('<p>后来的</p>');
            });//点击新增的<p>后来的</p>,仍然可以新增<p>后来的</p>
        });

给未来的元素绑定事件(事件委托)常用于给Ajax返回的数据添加事件。
PS:1.7版本及之后,可使用on来完成事件委托;1.7之前的版本可以使用live或bind来完成事件委托

2、给一个元素绑定多个同类型的事件

不同on也可以完成这个功能:
$(function(){
            //给p添加一个mouseover事件和一个click事件
            $('p').mouseover(function(){
                console.log(111);
            });
            $('p').click(function () {
                console.log(222);
            });
            //链式的写法
            $('p').mouseover(function(){
                console.log(111);
            }).click(function () {
                console.log(222);
            });
            
        });
不用on,也可以为一个元素绑定多个同类型的事件:
 //给p添加两个click事件
            //正常绑定,可以
            $('p').click(function () {
                console.log(111);
            });
            $('p').click(function () {
                console.log(222);
            });
用on给一个元素绑定两个不同的事件:
           $('p').on({
                //对象的每个成员,都是一个事件
                click:function(){
                    console.log(333);
                },
                mouseover:function () {
                    console.log(444);
                }
            });
用on为一个元素绑定多个同类型的事件:
//使用on来绑定,也可以
            $(document).on('click', 'p', function () {
                console.log(111);
            });
            $(document).on('click', 'p', function () {
                console.log(222);
            });

3、off事件

用于取消元素的某个事件。
实际开发中,这个东西很有用,有些时候是需要先取消掉一个元素的所有事件,然后在绑定你要绑定的事件,可以解决一些bug。
PS:off和on一组的,都是3.0版本后存在,3.0版本之前,可以使用unbind事件来完成事件的取消工作。

4、one事件

给元素绑定的事件,只执行一次。

 $(function () {
            //语法一:
            $('p').one('click', function () {
                console.log(1234);
            });

            //语法二:
            $(document).one('click', 'p', function () {
                console.log('abcd');
            });

            //语法三:两个事件都会执行一次
            $('p').one({
                click:function () {
                    console.log('222');
                },
                mouseover:function () {
                    console.log(333);
                }
            });
        })

五、jQuery封装的Ajax

1、$.get方法

语法:

$.get(url, data, function(e){
//e就是服务器返回的数据
}, dataType);

四个参数:

url:
data:发送给服务器的数据,字符串的形式或对象的形式
fn:用于处理服务器返回的数据,形参e就是服务器返回的数据
dataType:表示服务器返回数据的类型(text/json/html/script/_default)

      $(function(){
            $('input').click(function(){
                //点击button的时候,发送Ajax请求
                //$.get(url, 发送给服务器的数据, 函数, 服务器返回数据类型);
                $.get('12get.php', {name:'zhangsan', age:20, t:Math.random()}, function (e) {
                    //形参e表示服务器返回的数据
                    $('span').text(e);
                }, 'text');
            });
        });

php 页面:
如果希望IE浏览器不缓存,也可以使用加随机数的方式解决:

2、$.post方法

$.post(url, data, function(e){
//e就是服务器返回的数据
}, dataType);

四个参数:

url:
data:发送给服务器的数据,字符串的形式或对象的形式
fn:用于处理服务器返回的数据,形参e就是服务器返回的数据
dataType:表示服务器返回数据的类型(text/json/html/script/_default)

 $(function(){
            $('input').click(function(){
                //单击button的时候,发送post请求到服务器
                $.post('13post.php', {sex:'男', height:'183cm'}, function(e){
                    //$('span').text(e);
                    console.log(e); //post方法的第4个参数为json,e就是JS的数组或对象。不用在使用JSON.parse();转换了
                }, 'json');
            });
        });

PHP代码:

//接收传递过来的数据
file_put_contents('post.txt', print_r($_POST, true));
//返回个JS一个值
echo 4556;

服务器返回JSON格式的数据

JS代码,需要修改get或post方法的第4个参数为json,修改之后,接收到的数据,jQuery会自动将其转换为JS能够识别的数组或对象。

$(function(){
            $('input').click(function(){
                //单击button的时候,发送post请求到服务器
                $.post('13post.php', {sex:'男', height:'183cm'}, function(e){
                    //$('span').text(e);
                    console.log(e); //post方法的第4个参数为json,e就是JS的数组或对象。不用在使用JSON.parse();转换了
                }, 'json');//返回json格式
            });
        });

PHP代码:

//接收传递过来的数据
file_put_contents('post.txt', print_r($_POST, true));
//返回个JS一个值
//echo 4556;
//返回JSON格式的数据
$arr = [
    ['id'=>1, 'name'=>'曹操'],
    ['id'=>2, 'name'=>'袁绍'],
    ['id'=>3, 'name'=>'刘备']
];
echo json_encode($arr);

3、$.ajax()方法

使用语法:

$.ajax({
type:'get', //或者post
url:'',
data:{}, //发送给服务器的数据
dataType:'json', //服务器返回数据的类型
success:function(e){
        //形参e仍然是服务器返回的数据
},
error:function(){
    //ajax执行出错,在这里处理
},
async:false, //表示同步请求,默认为true表示异步请求
});
   $(function(){
            $('input').click(function(){
                $.ajax({
                    type:'post',
                    url:'14ajax.php',
                    data:{name:'zhangsan', age:20},
                    dataType:'json',
                    success:function(e){
                        console.log(e);
                    }//对象
                });
            });
        });

PHP代码:

file_put_contents('ajax.txt', print_r($_POST, true));
//返回JSON格式的数据
$arr = [
    ['id'=>1, 'name'=>'曹操'],
    ['id'=>2, 'name'=>'袁绍'],
    ['id'=>3, 'name'=>'刘备']
];
echo json_encode($arr);

4、收集表单信息方法

使用方法:

$(表单).serialize();  //返回一个经过编码的字符串
$(表单).serializeArray(); //返回一个JS数组

二者收集到的数据都可以直接用于Ajax。

 $(function(){
            $('input[type="button"]').click(function(){
                //收集表单的信息
                //var d = $('form').serialize();
                //console.log(d); //返回字符串
                var d = $('form').serializeArray();//收集的表单信息赋值给d
                //console.log(d);  //返回数组
                //发现ajax请求
                $.ajax({
                    type:'post',
                    url:'15serialize.php',
                    data: d,//发送给服务器的数据
                    dataType:'text',
                    success:function(e){
                        console.log(e);
                    }
                });
            });
        });

PHP页面:

file_put_contents('serialize.txt', print_r($_POST, true));
echo 44444;

5、Ajax提示方法

ajaxStart():在ajax开始之后,会执行
ajaxStop():在ajax结束时执行。

ps:低版本的写法是手册上的写法,高版本的jQuery写法如下:

  $(function(){
            $('input').click(function(){
                $.get('16ajaxStartAndajaxStop.php',{}, function(e){
                    console.log(123);
                }, 'text');
            });

            //发送ajax开始,给一个提示
            $(document).ajaxStart(function(){
                $('#loading').show();
            });
            //发送结束开始,给一个提示
            $(document).ajaxStop(function(){
                $('#loading').hide();
            });
        });
<input type="button" value="发送请求">
<div id="loading" style="display: none;">玩命加载中...</div><!-- 加载中提示 -->

PHP代码:

sleep(2);

六、案例 — 无刷新的分页

1、分页原理

//查询所有数据
select * from sheng;
//假设每页显示3条数据,用变量\(pageSize表示,即\)pageSize=3;
//第一页:select * from sheng limit 0,3;
//第二页:select * from sheng limit 3,3;
//第三页:select * from sheng limit 6,3;
//当前的页码从地址栏获取,如果地址栏存在p参数,就获取它,如果不存在p参数,默认是第1页
第$p页:

select * from sheng limit ($p-1)*$pageSize, $pageSize;

2、实现分页数据查询

$pdo = new PDO('mysql:host=localhost; dbname=test; charset=utf8', 'root', '123');

//必须自己定义的变量
$pageSize = 3; //表示每页显示3条数据
$p = $_GET['p'] ?? 1; //表示当前的页码 php7以上支持

//写SQL,查询每页的数据
$sql = "select * from sheng limit " . ($p-1)*$pageSize . ',' . $pageSize;
$stmt = $pdo->prepare($sql);
$stmt->execute();
$data = $stmt->fetchAll(PDO::FETCH_ASSOC);
//echo '<pre>';
//print_r($data);

浏览器直接访问这个page.php页面,如果能够看到第1页的数据,可以手动在地址栏添加p参数,看一下是否能够获取到下一页的数据:

3、输出数据并实现页码功能

制作页码:

//上一页
if($p<=1){
    $prev = "<a href='javascript:void(0);' pp='1'>上一页</a>";
}else{
    $prev = "<a href='javascript:void(0);' pp='".($p-1)."'>上一页</a>";
}
//下一页
//判断下一页,必须知道一共有多少页,必须知道有多少条数据
$sql_count = "select count(*) from sheng";
$stmt = $pdo->prepare($sql_count);
$stmt->execute();
$count = $stmt->fetchColumn(); //总记录数
//echo $count;
$maxPage = ceil($count/$pageSize); //最大页
if($p<$maxPage){
    $next = "<a href='javascript:void(0);' pp='".($p+1)."'>下一页</a>";
}else{
    $next = "<a href='javascript:void(0);' pp='$maxPage'>下一页</a>";
}
$page = $prev . $next;

把得到的$page放到页面中即可:

4、无刷新分页,获取第一页数据

首先将原page.php中的HTML部分剪切出来,放到page.html的文件中。
page.html中,写JS,当页面加载完毕,发送ajax请求到page.php。请求第一页的数据和分页页码:
page.php中将数据data和分页page合并到一起,然后转换成json返回:
page.html中,处理服务器返回的数据:

$(function(){
            //页面加载完毕,发送ajax请求到page.php。获取第1页的数据和分页标签
            $.get('page.php', {p:1}, function(e){
                //e 就是服务器返回的数据
                //console.log(e);
                var data = e[0]; //每页数据
                var page = e[1]; //分页页码
                //处理数据
                //console.log(data);
                var str = '';
                $.each(data, function(i, val){
                    str += '<tr>';
                    str += '<td>'+val.PID+'</td>';
                    str += '<td>'+val.Pcode+'</td>';
                    str += '<td>'+val.Pname+'</td>';
                    str += '</tr>';
                });
                $('tbody').html(str);
                //处理分页页码
                //console.log(page);
                $('p').html(page);
            }, 'json');
        });

这样,访问page.html,就可以看到第一页的数据了。

5、实现无刷新的分页

要实现无刷新的分页,必须让a标签不能跳转才可以。所以将a标签的href属性值都写成javascript:void(0);
又因为,点击a标签的时候,必须知道你要请求哪一页的数据,所以在a标签上还必须体现出请求的页码。
所以修改php代码:
检测一下,刷新page.html,通过浏览器工具,就可以看到a标签的样子如下:
下一步,点击页面中的a标签,发送ajax请求就可以了:
请求完数据,处理方式和第一页相同,可以复制处理数据的代码,也可以封装成一个函数:

赞赏
对内容有疑问,请加我微信:guoqiang7585
# # #
首页      全栈教程      JavaScript      13、jQuery第2天 事件 Ajax 无刷新分页

国强极客

文章作者

博客站长,有问题请加微信【guoqiang7585】。

国强极客

13、jQuery第2天 事件 Ajax 无刷新分页
二、今日目标 1、能够知道jQuery是如何释放$符号的 2、能够将jQuery对象和DOM对象相互转化,以及为什么要相互转化 3、能够掌握jQuery普通事件的绑定方法 4、能够掌握jQuery高级事件的使用…
扫描二维码继续阅读
2019-12-18