JQuery使用及基础原理解析相关笔记(三)

11 篇文章 0 订阅

1.jQuery的核心–所有版本:https://code.jquery.com/jquery/


2.jQuery属性操作:

◆设置属性:当前节点.attr(属性名,属性值);
◆获取属性:当前节点.attr(属性名);
◆移除属性:当前节点.removeAttr(属性名);
◆设置属性:当前节点.prop(属性名,属性值);
◆获取属性:当前节点.prop(属性名);

◆移除属性:当前节点.removeProp(属性名);

★使用attr对象对bool类型值得属性赋值时,其实并不会赋值true或者false,如果赋值为false则是undefined,如果是true则是非udefined,所以这样不好,可能会出现多次赋值后失灵无效,因为这种方式不适合操作bool类型值的属性的,于是一个新的专门针对true和false改进的方法诞生,是prop,操作方式和attr一模一样,但是是针对bool类型值得属性赋值的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery操作属性(attr和prop)</title>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {

            //对于特殊的属性 只能够使用一次   对于特殊的属性 不适合用
            $("button:eq(0)").click(function () {
                $(":checkbox").attr("checked",true);
                $(":text").attr("value",$(":checkbox").attr("checked"));
            });

            //对于特殊的属性 可以使用多次  这是对那些特殊点的属性专用的方法
            $("button:eq(1)").click(function () {
                $(":checkbox").prop("checked",true);
                $(":text").prop("value",$(":checkbox").prop("checked"));
            });
        })


    </script>
</head>
<body>
<button>attr绑定</button>
<button>prop绑定</button>
<input type="text">
<input type="checkbox">
</body>
</html>

★使用jQuery属性操作DIY:表格的全选与反选、文本框光标闪动

    ☆表格的全选与反选

<!DOCTYPE html>
<html>

<head lang="en">
    <meta charset="UTF-8">
    <title>jQuery使用prop实现表格全选反选</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .wrap {
            width: 300px;
            margin: 100px auto 0;
        }

        table {
            border-collapse: collapse;
            border-spacing: 0;
            border: 1px solid #c0c0c0;
        }

        th,
        td {
            border: 1px solid #d0d0d0;
            color: #404060;
            padding: 10px;
        }

        th {
            background-color: #09c;
            font: bold 16px "微软雅黑";
            color: #fff;
        }

        td {
            font: 14px "微软雅黑";
        }

        tbody tr {
            background-color: #f0f0f0;
        }

        tbody tr:hover {
            cursor: pointer;
            background-color: #fafafa;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        //需求1:选中头部的复选框后,身体部分的复选框也会被选中,
        //      取消选中头部的复选框后,身体部分的复选框也会被取消
        //需求2:当身体部分的复选框全部选中时,头部的复选框也会被选中,
        //      身体部分的复选框有一个没有被选中,头部的复选框就不会被选中

        //思路1:给头部复选框设置点击事件,让身体部分的复选框与头部的复选框的checked值同步
        //思路2:给身体部分的复选框设置单击事件,自己也是选中的,
        //      那么就让头部的复选框被选中,就判断被选中的复选框个数是否与身体部分的复选框个数一致,
        //      如果一致就选中头部的复选框,
        //      如果自己没有选中,就取消头部的复选框。

        //步骤:

        $(function () {
            //给头部复选框设置点击事件
            $("#j_cbAll").click(function () {
                //让身体部分的复选框与头部的复选框的checked值同步
                $("#j_tb :checkbox").prop("checked", $(this).prop("checked"));
            });

            $("#j_tb :checkbox").click(function () {
//                //如果自己也是选中的话
//                if ($(this).prop("checked")) {
//                    //判断被选中的复选框个数是否与身体部分的复选框个数一致
//                    if ($("#j_tb :checked").length === $("#j_tb :checkbox").length) {
//                        //如果一致就选中头部的复选框
//                        $("#j_cbAll").prop("checked", true);
//                    } else {//否则不选中
//                        $("#j_cbAll").prop("checked", false);
//                    }
//                } else {//如果自己没有选中 就取消头部的复选框
//                    $("#j_cbAll").prop("checked", $(this).prop("checked"));
//                }


                //优化上面的代码
                //如果自己被选中
                if (true === $(this).prop("checked")) {
                    //判断身体部分所有复选框都被选中了
                    if ($("#j_tb :checked").length !==
                            $("#j_tb :checkbox").length) {
                        $("#j_cbAll").prop("checked", false);

                        return;
                    }
                }
                //自己没有被选中 那头部的复选框也不会被选中,
                // 如果代码执行到这里了,自己也被选中了,那么说明所有的复选框都被选中了
                $("#j_cbAll").prop("checked", $(this).prop("checked"));

            });

        })


    </script>
</head>

<body>
<div class="wrap">
    <table>
        <thead>
        <tr>
            <th>
                <input type="checkbox" id="j_cbAll"/>
            </th>
            <th>语言名称</th>
            <th>所属对象</th>
        </tr>
        </thead>
        <tbody id="j_tb">
        <tr>
            <td>
                <input type="checkbox"/>
            </td>
            <td>JavaScript</td>
            <td>水晶女孩</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox"/>
            </td>
            <td>css</td>
            <td>水晶女孩</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox"/>
            </td>
            <td>html</td>
            <td>水晶女孩</td>
        </tr>
        <tr>
            <td>
                <input type="checkbox"/>
            </td>
            <td>jQuery</td>
            <td>水晶女孩</td>
        </tr>
        </tbody>
    </table>
</div>
</body>
</html>

    ☆文本框光标闪动

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>使用jQuery制作动态输入文本的光标一闪一闪的动画</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        @keyframes blink {
            0%,
            100% {
                opacity: 1
            }
            50% {
                opacity: 0
            }
        }

        @-webkit-keyframes blink {
            0%,
            100% {
                opacity: 1
            }
            50% {
                opacity: 0
            }
        }

        @-moz-keyframes blink {
            0%,
            100% {
                opacity: 1
            }
            50% {
                opacity: 0
            }
        }

        .wrap {
            width: 1000px;
            text-align: center;
            margin: 100px auto 0;
        }

        .wrap h1 {
            font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
            font-weight: 300;
        }

        .word {
            font-weight: 700;
        }

        .typed-cursor {
            opacity: 1;
            -webkit-animation: blink .7s infinite;
            -moz-animation: blink .7s infinite;
            animation: blink .7s infinite;
            display: none;
        }

        .saySection {
            margin-top: 50px;
        }

        .saySection input {
            font-size: 30px;
        }

        .saySection .txtSay {
            padding-left: 10px;
        }

        .saySection .btnSay {
            display: inline-block;
            padding: 0 20px;
            cursor: pointer;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>

        //需求:在文本框中输入文本后点击确定按钮,立即展示文字动态输入的效果
        //思路:将文本框中的字符串通过循环的方式追加到 .word中
        //步骤:
        $(function () {
            var value = $("#inValue");
            var text = $(".word");
            var cursor = $(".typed-cursor");
            $("#btnSay").click(function () {


                //使用定时器之前先清除定时器
                clearInterval($("#btnSay").get(0).timer);
                var str = "";
                var txt = value.val();
                var i = 0;
                //激活动态光标
                cursor.show(500);
                $("#btnSay").get(0).timer = setInterval(function () {
                    str += txt[i];
                    text.text(str);
                    i++;
                    if (i === txt.length) {
                        clearInterval($("#btnSay").get(0).timer);

                        cursor.hide(500);
                    }
                }, 200);
            });
        })
    </script>
</head>
<body>
<div class="wrap">
    <h1>
        You want to say : <span class="word"></span><span class="typed-cursor">|</span> !
    </h1>
    <div class="saySection">
        <input type="text" id="inValue" class="txtSay"/>
        <input type="button" value="确定" id="btnSay" class="btnSay"/>
    </div>
</div>
</body>
</html>


3.表单选择器与表单对象属性选择器
◆表单选择器

:input //input标签
:text //文本框
:password  //密码框
:radio  //单选按钮
:checkbox //复选框
:submit //提交按钮
:image  //图片提交按钮
:reset //重置按钮
:button //按钮
:file //上传文件按钮
:hidden //隐藏文本域
◆表单对象属性选择器
:enabled //已经启用
:disabled //可以显示
:checked //已经选中
:selected  //已经选择


4.三种获取设置值的方法 val()、text()、html()
◆val():主要是用来获取 标签中允许拥有value的属性的值,几乎所有表单标签都有value属性值。
◆text():主要用来获取标签对中的文本内容,其实就是原生js中的innerText和textContent的兼容。
◆html():主要用来获取标签对中的文本内容或html标签文本,很像是原生js中的innerHTML。

★方法中不写参数就是获取值,方法中写参数就是设置值。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery的val、text、html方法</title>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {

            var input=$("input");
            var div=$("div");
            var span=$("span");

            input.val("使用了value方法");
            span.text("<button>只能显示纯文本</button>")
            div.html("<button>我是一个按钮</button>")

            console.log(input.val());
            console.log(span.text());
            console.log(div.html());

        });

    </script>
</head>
<body>
<input type="text">
<div></div>
<span></span>
</body>
</html>


5.获取和设置宽高的方法 height()和width()
◆height():只是单纯的获取css样式中的height属性值,与padding和border以及margin无关。
◆width():只是单纯的获取css样式中的width属性值,与padding和border以及margin无关。

★方法中不写参数就是获取值(获取的值为纯数字),方法中写参数就是设置值,设置值的方式可以是纯数字,参数为纯数字时默认像素为单位,参数也可以是字符串。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery的height()与width()</title>
    <style type="text/css">
        .box {
            width: 150px;
            height: 150px;
            background-color: #a05;
            padding:20px;
            margin:100px;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>

        $(function () {
            $(".box").html(
                    "<h4>width():"+($(".box").width())+"</h4>" +
                    "<h4>height():"+($(".box").height())+"</h4>"+
                            "<h4>只是获取css样式中width属性值与height属性值</h4>"
            )
        })

    </script>
</head>
<body>
<div class="box"></div>
</body>
</html>


6.获取定位的距离

offset().top

表示距离浏览器起始点(0,0)点的y轴的距离,和无论有没有定位(maring的属性值也算),并且offset().top获取的都是针对浏览器起始点,与js原生属性offsetTop不一样,由于无论有没有定位都是针对浏览器的起始点。

offset().left

表示距离浏览器起始点(0,0)点的x轴的距离,和无论有没有定位(maring的属性值也算),并且offset().left获取的都是针对浏览器起始点,与js原生属性offsetLeft不一样。

★offset()还可以赋值,如

offset({left:200,top:200})

,赋值的时候其实就是设置定位时的left和top属性值;,但是实际上它会和当前的位置上的坐标值进行计算(和margin的属性值进行减法运算),从而得到真正的定位坐标属性left和top值,然后再进行设置。

position().top

表示距离父级非静态定位的盒子的y轴距离,这个方法其实就是获取定位时设置的top属性值而已与其它属性值无关。

position().left

表示距离父级非静态定位的盒子的x轴距离,这个方法其实就是获取定位时设置的left属性值而已与其它属性值无关,可能会与父容器的margin-left值相关联。

scrollTop()

表示距离元素被卷去的距离,用法$(document).scrollTop(),相当于之前封装的scroll方法一样scroll().scrollTop(),如果你像获取元素被卷去的距离,可以让元素产生滚动条,这样就能够获取了,使用overflow:auto;获取overflow:scroll;来产生滚动条,前提条件是,子容器要大于父容器。

scrollLeft()

表示距离元素被卷去的距离,用法$(document).scrollLeft(),相当于之前封装的scroll方法一样scroll().scrollLeft(),如果你像获取元素被卷去的距离,可以让元素产生滚动条,这样就能够获取了,使用overflow:auto;获取overflow:scroll;来产生滚动条,前提条件是,子容器要大于父容器。

★scrollTop()方法与scrollLeft()方法其实不光可以获取并且还可以设置,内部调用了window.moveTo(x,y)的方法,不光可以$(document).scrollLeft(),也可以是$(window).scrollLeft(),是一样的,因为自己封装scroll()时就是这样子的
function scroll(){
return {
            scollLeft: window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft,
            scollTop: window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop
        }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery的offset()、position()、scrollTop()、scrollLeft()</title>
    <style>
        body {
            margin:20px;
            height: 5000px;
        }
        div {
            width: 150px;
            height: 150px;
            margin: 100px;
            background-color: #a05;

        }

    </style>
    <script src="jquery-1.11.1.js"></script>

    <script>
        $(function () {
            //获取定位的距离

            // offset().top:表示距离浏览器起始点(0,0)点的y轴的距离,
            // 和无论有没有定位(maring的属性值也算),
            // 并且offset().top获取的都是针对浏览器起始点,
            // 与js原生属性offsetTop不一样。
            console.log('$("div").offset().top:' + ($("div").offset().top));


            //offset().left:表示距离浏览器起始点(0,0)点的x轴的距离,
            // 和无论有没有定位(maring的属性值也算),
            // 并且offset().left获取的都是针对浏览器起始点,
            // 与js原生属性offsetLeft不一样。
            console.log('$("div").offset().left:' + ($("div").offset().left));


            //offset()还可以赋值,如offset({left:200,top:200}),
            // 赋值的时候其实就是设置定位时的left和top属性值;
            //,但是实际上它会和当前的位置上的坐标值进行计算(和margin的属性值进行减法运算),
            // 从而得到真正的定位坐标属性left和top值,然后再进行设置。

            $("div").offset({left: 300, top: 300});

            //position().top:表示距离父级非静态定位的盒子的y轴距离,
            // 这个方法其实就是获取定位时设置的top属性值而已与其它属性值无关。
            console.log($("div").position().top);

            //position().left:表示距离父级非静态定位的盒子的x轴距离,
            // 这个方法其实就是获取定位时设置的left属性值而已与其它属性值无关,
            // 可能会与父容器的margin-left值相关联。
            console.log($("div").position().left);


            //scrollTop():表示距离元素被卷去的距离,
            // 用法$(document).scrollTop(),
            // 相当于之前封装的scroll方法一样scroll().scrollTop(),
            // 如果你像获取元素被卷去的距离,可以让元素产生滚动条,
            // 这样就能够获取了,使用overflow:auto;获取overflow:scroll;
            // 来产生滚动条,前提条件是,子容器要大于父容器。

            //scrollLeft():表示距离元素被卷去的距离,
            // 用法$(document).scrollLeft(),
            // 相当于之前封装的scroll方法一样scroll().scrollLeft(),
            // 如果你像获取元素被卷去的距离,可以让元素产生滚动条,
            // 这样就能够获取了,使用overflow:auto;获取overflow:scroll;来产生滚动条,
            // 前提条件是,子容器要大于父容器。
            //scrollTop()方法与scrollLeft()方法其实不光可以获取并且还可以设置,
            // 内部调用了window.moveTo(x,y)的方法,不光可以$(document).scrollLeft(),
            // 也可以是$(window).scrollLeft(),是一样的,因为自己封装scroll()时就是这样子的【
//        function scroll(){
//            return {
//                scollLeft: window.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft,
//                scollTop: window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop
//            }
//        }

            //设置页面被卷去的距离时,前提是 页面要有滚动条
            $("button").click(function () {

                $(document).scrollTop(1000);
            });
        })
    </script>
</head>
<body>
<button>scrollTop(1000)</button>
<div></div>
</body>
</html>
7.jQuery事件机制
◆jQuery的事件机制,指的是:jQuery对javascript操作dom事件的封装,包括了:事件绑定、事件解绑、事件触发。

◆jQuery事件的发展历程:简单事件绑定-->bind事件绑定-->delegate事件绑定-->on事件绑定(on最优秀,因为bind、delegate内部就是使用的on,所以on是最好的)


8..事件绑定的四种方式(其实只有两种方式  一种非事件委托的方式、一种事件委托的方式  )
◆简单事件绑定

$(".box").click(function(){}); //这种放式最为简单了,可以多次绑定,不会被后面绑定的相同的事件层叠掉,一次只能够绑定一个事件,并且无法以指定父容器的方式给子元素绑定事件,也就是说不会进行事件委托了。
◆bind事件绑定
$(".box").bind("click dbclick",function(){});//这种方式要比简单事件绑定复杂一点,但是在jQuery1.7版本后不再使用了,不仅有简单事件绑定的所有优点,并且至此多事件绑定,但是依旧不能进行事件委托,因为事件委托的方式仅仅是需要依赖父容器的。
◆delegate事件绑定

◇非事件委托的方式

$(".box").delegate(null,"click dbclick",function(){});//这种方式与bind事件绑定一样的,实际上无论是bind还是delegate内部使用的都是on事件绑定。

◇事件委托的方式绑定事件

$(document).delegate(".box","click dbclick",function(){});//这种方式属于事件委托的方式绑定事件
◆on事件绑定 

◇非事件委托的方式

$(".box").on("click dbclick",{age:20},function(){});//非事件委托的方式绑定事件,bind与delegate还有on都是一样的,只不过参数有点区别而已。
◇事件委托的方式绑定事件
$(document).on("click dbclick",".box",{age:20},function(){});//事件委托的方式绑定事件,推荐使用这种,最好用了,{age:20}表示事件绑定时传递一个数据进去,然后事件触发后,可以在内部获取这个数据,但是绑定的时候function(event){},方法的参数里面要加一个event或者其它形参,然后在方法内部可以使用 event.data的方式获取你传递进去的数据。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery的事件绑定四种方式</title>
    <style type="text/css">

        div {
            width: 300px;
            height: 300px;
            background-color: #a05;
            margin: 50px;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>

        $(function () {
            /*
             * 事件绑定的四种方式(其实只有两种方式  一种非事件委托的方式、一种事件委托的方式  )
             * */

            /第一种方式  简单事件绑定 \\\\\
            // 绑定相同的事件时不会被层叠掉,
            // 因为内部有一个事件队列存着这些事件
            $("div").click(function () {
                console.log("简单事件绑定:触发了div的单击事件1");
            })
            $("div").click(function () {
                console.log("简单事件绑定:触发了div的单击事件2");
            })

            /第二种方式  bind事件绑定 \\\\\
            // 每次都可以绑定多个事件,
            // 并且绑定相同的事件不会被层叠掉
            $("div").bind("click dblclick", function () {
                console.log("bind事件绑定:单击和双击都会触发这个事件1");
            })
            $("div").bind("click dblclick", function () {
                console.log("bind事件绑定:单击和双击都会触发这个事件2");
            })

            /第三种方式  delegate事件绑定 \\\\\
            // 每次可以绑定多个实际那,
            // 并且绑定相同的事件不会被层叠掉
            // 还可以指定的给父容器里的子容器绑定事件
            // 并且还是以事件委托的方式来进行绑定的
            // 当你动态添加新的元素时,
            // 那个元素如果符合要求的话也会有这个被绑定的事件方法,
            // 所以更加的准确灵活健壮稳定了
            $(document).delegate("div", "click dbclick", function () {
                console.log("delegate事件绑定:单击和双击都会触发这个事件1");
            })

            $(document).delegate("div", "click dbclick", function () {
                console.log("delegate事件绑定:单击和双击都会触发这个事件2");
            })


            $("div").delegate(null, "click dbclick", function () {
                console.log("delegate事件绑定:单击和双击都会触发这个事件3");

            })

            //添加新的div  新的div也会有事件
            $("button").click(function () {
                $("<div>新</div>").appendTo($(document).find("body"));
            });

            /第四种方式  on事件绑定 \\\\\
            //其实无论是bind事件绑定还是delegate事件绑定,
            //其实内部都是使用的on事件绑定
            //on事件绑定的方式是最优秀的
            //on事件还是传递数据进去
            $(document).on("click dbclick","div",{name:"xf"},function(event){
                console.log("on事件绑定:单击和双击都会触发这个事件1,传递的数据为:"+event.data.name);
            });
            $(document).on("click dbclick","div",{name:"xf"},function(event){
                console.log("on事件绑定:单击和双击都会触发这个事件2,传递的数据为:"+event.data.name);
            });
            $("div").on("click dbclick", {name: "xf"}, function (event) {
                console.log("on事件绑定:单击和双击都会触发这个事件3,传递的数据为:" + event.data.name);
            })
        });
    </script>
</head>
<body>
<button>添加一个div</button>
<div></div>
</body>
</html>


9.事件解绑的两种方式 (非事件委托的方式与事件委托的方式)

◆事件绑定的方式有四种 分别是 简单事件绑定、bind事件绑定、delegate事件绑定(支持事件委托)、on事件绑定(支持事件委托)
◆由于这几种方式绑定事件都不会被层叠掉,非指定父容器给子容器(非事件委托)的简单事件绑定、bind事件绑定、delegate、on事件绑定可以使用 对象.unbind()、对象.undelegate()、对象.off()来解绑

$("div").unbind();
$("div").undelegate();
$("div").off();
,如果指定父容器给子容器(事件委托)的delegate和on事件绑定可以使用相应的undelegate()和off()方式来解绑
$(document).undelegate("div","click dbclick");//解绑指定的元素的指定事件
$(document).off("click dbclick","div");//解绑指定的元素的指定事件
$(document).off("","div"); //解除指定元素的全部事件
◆事件解绑不仅仅可以解绑全部事件,也可以针对性的解绑某一个事件,获取某一个事件中的某一个方法,但是你绑定事件的时候,方法不能是匿名函数,不然找不到指针地址,当不解绑全部事件时,怎么绑定的就怎么解绑,参数差不多,如
//绑定
$(document).delegate(".box","click blur keydown",function(e){
//事件驱动程序
})
//解绑
$(document).undelegate(".box","click");
★使用bind绑定事件会存在bug,例如双击事件的绑定是无法解除的,必须使用全部解绑的方式
◇ $("div").unbind();

才能够解绑。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery的事件解绑三种方式</title>
    <style type="text/css">

        div {
            width: 300px;
            height: 300px;
            background-color: #a05;
            margin: 50px;

        }

    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>

        //这个入口函数中是事件绑定的入口函数
        $(function () {

            /*
             * 事件绑定的四种方式(其实只有两种方式  一种非事件委托的方式、一种事件委托的方式  )
             * */


            /第一种方式  简单事件绑定 \\\\\
            // 绑定相同的事件时不会被层叠掉,
            // 因为内部有一个事件队列存着这些事件
            $("div").click(function () {
                console.log("简单事件绑定:触发了div的单击事件1");
            })
            $("div").click(function () {
                console.log("简单事件绑定:触发了div的单击事件2");
            })

            /第二种方式  bind事件绑定 \\\\\
            // 每次都可以绑定多个事件,
            // 并且绑定相同的事件不会被层叠掉
            $("div").bind("click dblclick", function (e) {
                console.log("bind事件绑定:单击和双击都会触发这个事件1" + e.type);
            })
            $("div").bind("click dblclick", function (e) {
                console.log("bind事件绑定:单击和双击都会触发这个事件2" + e.type);
            })

            /第三种方式  delegate事件绑定 \\\\\
            // 每次可以绑定多个实际那,
            // 并且绑定相同的事件不会被层叠掉
            // 还可以指定的给父容器里的子容器绑定事件
            // 并且还是以事件委托的方式来进行绑定的
            // 当你动态添加新的元素时,
            // 那个元素如果符合要求的话也会有这个被绑定的事件方法,
            // 所以更加的准确灵活健壮稳定了
            $(document).delegate("div", "click dbclick", function () {
                console.log("delegate事件绑定:单击和双击都会触发这个事件1");
            })

            $(document).delegate("div", "click dbclick", function () {
                console.log("delegate事件绑定:单击和双击都会触发这个事件2");
            })

            $("div").delegate(null, "click dbclick", function () {
                console.log("delegate事件绑定:单击和双击都会触发这个事件3");

            })

            //添加新的div  新的div也会有事件
            $("button").click(function () {
                $("<div>新</div>").appendTo($(document).find("body"));
            });

            /第四种方式  on事件绑定 \\\\\
            //其实无论是bind事件绑定还是delegate事件绑定,
            //其实内部都是使用的on事件绑定
            //on事件绑定的方式是最优秀的
            //on事件还是传递数据进去
            $(document).on("click dbclick", "div", {name: "xf"}, function (event) {
                console.log("on事件绑定:单击和双击都会触发这个事件1,传递的数据为:" + event.data.name);
            });
            $(document).on("click dbclick", "div", {name: "xf"}, function (event) {
                console.log("on事件绑定:单击和双击都会触发这个事件2,传递的数据为:" + event.data.name);
            });
            $("div").on("click dbclick", {name: "xf"}, function (event) {
                console.log("on事件绑定:单击和双击都会触发这个事件3,传递的数据为:" + event.data.name);
            })
        });

        //这个入口函数中是事件解绑的入口函数
        $(function () {

            /**
             * 事件解绑的两种方式 (非事件委托的方式与事件委托的方式)
             * */

            //第一种事件解绑的方式  非事件委托的方式
            //注意:bind事件绑定方式存在bug  例如dbclick无法解除,
            // 必须使用全部解绑的方式:$("div").unbind();才能够解绑。
            //解除该元素的指定事件
//            $("div").unbind("dbclick click");
            //解除该元素的全部事件
//            $("div").unbind();
//            $("div").off();

            //第二种事件解绑的方式 事件委托的方式
            // 可以解除 指定父容器给子容器的delegate和on事件绑定
            //解除指定元素的指定的事件
//            $(document).undelegate("div", "click dbclick");
//            $(document).off("click dbclick", "div");

            //解除指定元素的全部事件
//            $(document).off("","div");
        })

    </script>
</head>
<body>
<button>添加一个div</button>
<div></div>
</body>
</html>


10.事件触发的三种方式
◆事件触发的第一种方式其实就是 简单事件绑定时方法不要参数,如

$(".box").click();
$(".box").dbclick();
,这种方式会触发浏览器的默认行为,例如文本框获取焦点后会有样式的变化之类的表现。

◆事件触发的第二种方式使用

$(".box").trigger("click dbclick");

,可以同时触发多个事件,其实也可以传递叫data的数据进去,但是不常用,因为on绑定事件的方式已经传递了data,这种方式会触发浏览器的默认行为,如超链接的点击事件会进行默认跳转。

◆事件触发的第三种方式使用

$(".box").triggerHandler("click dbclick");

,其实和第二种触发方式相比只有一个区别,就是这种方式不会触发浏览器的默认行为,相当于执行完了事件中的方法后会取消默认的行为比如return false之类的,然后超链接不跳转了,文本框不会显示获取焦点后的样式变化的表现,有一个缺点, 就是不支持事件委托的方式绑定的事件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery的事件触发的三种方式</title>
    <style type="text/css">
        .box {
            width: 200px;
            height: 200px;
            background-color: #0f0;
            margin: 50px;
        }


    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {

            $(".box").on("focus", "input", function () {
                console.log(("触发了文本框的获取焦点事件"));

            });

//            $("input").focus(function () {
//                console.log(("触发了文本框的获取焦点事件"));
//            });


            //第一种触发方式
            // 简单事件绑定时方法不要参数
            // 这种方式会触发浏览器的默认行为,例如文本框获取焦点后会有样式的变化之类的表现
            $("button:eq(0)").on("click", {}, function (e) {
                $("input").focus();
            });

            //第二种触发方式
            // 可以同时触发多个事件,
            // 其实也可以传递叫data的数据进去,
            // 但是不常用,
            // 因为on绑定事件的方式已经传递了data,
            // 这种方式会触发浏览器的默认行为,
            // 如超链接的点击事件会进行默认跳转
            $("button:eq(1)").on("click", {}, function (e) {
                $("input").trigger("focus");
            });

            //第三种触发方式
            //其实和第二种触发方式相比只有一个区别,
            // 就是这种方式不会触发浏览器的默认行为
            // 相当于执行完了事件中的方法后会取消默认的行为比如return false之类的,
            // 然后超链接不跳转了,
            // 文本框不会显示获取焦点后的样式变化的表现
            //有一个缺点, 就是不支持事件委托的方式绑定的事件
            $("button:eq(2)").on("click", {}, function (e) {
                $("input").triggerHandler("focus");
            });

        })

    </script>
</head>
<body>
<button>对象.focus()</button>
<button>对象.trigger("focus")</button>
<button>对象.triggerHandler("focus")</button>
<div class="box">
    <input type="text">
</div>
</body>
</html>


11.jQuery事件对象的常用属性

◆常用属性

event.data//传递事件处理程序的额外数据
event.currentTarget//等同与this,当前的dom对象
event.pageX//鼠标相对与页面文档x轴的坐标值
event.pageY//鼠标相对与页面文档y轴的坐标值
event.target//触发事件源,不一定绝对等于this,因为可能会是事件委托
event.stopPropagation()//阻止事件冒泡
event.preventDefault()//阻止默认行为
event.type//事件类型:click,dbclick...
event.which//鼠标的按键类型:左边1 中间2 右边3
event.keyCode//键盘按键代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery的事件对象的常用属性</title>
    <style type="text/css">
        .box {
            width: 200px;
            height: 200px;
            background-color: #0f0;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>
        $(function () {

            $(".box").on("click", {}, function (event) {
                console.log("传递事件处理程序的额外数据:"+event.data);   //传递事件处理程序的额外数据
                console.log("等同与this,当前的dom对象:"+event.currentTarget);  //等同与this,当前的dom对象
                console.log("鼠标相对与页面文档x轴的坐标值:"+event.pageX);  //鼠标相对与页面文档x轴的坐标值
                console.log("鼠标相对与页面文档y轴的坐标值:"+event.pageY);   //鼠标相对与页面文档y轴的坐标值
                console.log("触发事件源,不一定绝对等于this,因为可能会是事件委托:"+event.target);  //触发事件源,不一定绝对等于this,因为可能会是事件委托
                console.log("阻止事件冒泡:"+event.stopPropagation());   //阻止事件冒泡
                console.log("阻止默认行为:"+event.preventDefault());     //阻止默认行为
                console.log("事件类型:"+event.type);   //事件类型:click,dbclick...
                console.log("鼠标的按键类型:"+event.which);   //鼠标的按键类型:左边1中间2右边3
                console.log("键盘按键代码:"+event.keyCode);   //键盘按键代码
            })
        })
    </script>
</head>
<body>
<div class="box"></div>
</body>
</html>


12.使用jQuery来DIY:表单文本框回车换行并选中、按键后指定区域变色

◆按回车就让文本框的焦点移动到下一个文本框中,使用的是文本框的keydown事件,判断event.keyCode码,如果是回车键的码,那么就将焦点移动到下一个文本框中,使用的是focus(),或者select方法也行,focus只是让下一个文本框获得焦点,而select方法会让下一个文本框获取焦点的同时选中下一个文本框中的内容。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用jQuery制作表单文本框回车换行并选中</title>
    <script src="jquery-1.11.1.js"></script>
    <script>

        //需求1:当文本框中按下回车按钮,将自动把广告移动到下一个文本中去
        //需求2:移动到下一个文本框中时,如果下一个文本框不为空,则自动选中

        //思路:设置每一个文本框的按键按下的事件, keydown
        // 判断按键的码,如果是回车,就让下一个文本框获取焦点 focus()
        // 下一个文本框中如果有值,就让下一个文本框中的值被选中 select()

        //步骤:

        $(function () {
            $(":text").on("keydown", {}, function (event) {
//                console.log(event.keyCode);

                //是否是按下了回车键
                if (event.keyCode === 13) {
//                    $(this).next().next().next().focus();//获取焦点
                    $(this).next().next().next().select();//选中
                }
            })
        })
    </script>
</head>
<body>
<input type="text" value="请输入文本1"><br><br>
<input type="text" value="请输入文本2"><br><br>
<input type="text" value="请输入文本3"><br><br>
<input type="text" value="请输入文本4"><br><br>
<input type="text" value="请输入文本5"><br><br>
<input type="text" value="请输入文本6"><br><br>
<input type="text" value="请输入文本7"><br><br>
<input type="text" value="请输入文本8"><br><br>
<input type="text" value="请输入文本9"><br><br>
</body>
</html>

◆按键后指定区域变色

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用jQuery制作按键变色的效果</title>
</head>
<style>
    .wrap {
        width: 400px;
        height: 400px;
        margin: 100px auto 0;
    }

    .wrap h1 {
        text-align: center;
    }

    .wrap div {
        width: 400px;
        height: 300px;
        background: pink;
        font-size: 30px;
        text-align: center;
        line-height: 300px;
    }
</style>
<script src="jquery-1.11.1.js"></script>
<script>

    //需求:当按下 r键时 在改变div的背景色为红色 并且在span中打印 keyCode
    //思路:使用switch判断 keycode码 ,使用keydown事件  获取event.keyCode

    //步骤:

    $(function () {

        $(document).on("keydown", {}, function (event) {

            switch (event.keyCode) {
                case 80 :
                    setEle("pink", event.keyCode)
                    break;
                case 66:
                    setEle("blue", event.keyCode)
                    break;
                case 79:
                    setEle("orange", event.keyCode)
                    break;
                case 82:
                    setEle("red", event.keyCode)
                    break;
                case 89:
                    setEle("yellow", event.keyCode)
                    break;
                default :
                    alert("系统没有这个颜色!!!");
                    break;
            }
        })

        /**
         * 功能:设置背景色和指示文本
         * @param bgcolor
         * @param text
         */
        function setEle(bgcolor, text) {
            $("#bgChange").css("background-color", bgcolor);
            $("#keyCodeSpan").text(text);
        }
    })
</script>
</head>
<body>
<div class="wrap">
    <h1>按键改变颜色</h1>
    <div id="bgChange">
        keyCode为:
        <span id="keyCodeSpan">80</span>
    </div>
</div>
</body>
</html>


13.链式编程与隐式迭代的原理

◆简单原理

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>链式编程与隐式迭代的原理</title>
</head>
<body>

<script>
    /*
     * 链式编程的原理是,最后都会return this,但是通常情况下,
     *只有设置的操作才能把链式编程延续下去。因为获取操作的时候,
     *或返回获取到的值,所以无法返回this,于是乎,
     *可以使用end(),找到当前链最近的一次断链之前的对象,
     *也就是说,如果没有返回之前那个this,
     *可以通过end()方法获取到之前获取到的那个this。
     */



    /*
     * 隐式遍历是因为内部对jQuery对象进行了循环操作,
     *实际上jQuery对象都是一个伪数组对象,
     *jQuery中有显式遍历的方式,
     *each和map方法,遍历的操作方式和数组的forEach与map方法类似,
     *内部获取到的每一个元素也是原生js的dom对象。
     */

</script>
</body>
</html>

◆jQuery来DIY:五角星评价

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用jQuery制作五角星评价</title>
    <style>
        * {
            padding: 0;
            margin: 0;
        }

        .comment {
            font-size: 40px;
            color: #ff3100;
        }

        .comment li {
            float: left;
            cursor: pointer;
        }

        ul {
            list-style: none;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>

        //需求1:当鼠标移入到某一个五角星上时,
        // 那个五角星及之前的五角星都会是亮的
        // 那个五角星之后的五角星都是不亮的

        //需求2:当鼠标点击后,
        // 鼠标再移出时,
        // 让原来那个点击的五角星及之前的五角星变亮,
        // 那个点击的五角星之后的不亮

        //思路1:给每一个五角星绑定鼠标移入事件,
        // 鼠标移入时,
        // 让当前五角星是亮的,
        // 然后再让之前的五角星亮
        // 最后让鼠标移入的五角星之后的五角星不亮

        //思路2:给每一个五角星绑定鼠标点击事件,
        // 单击后添加一个类,
        // 然后让所在的类及之前的五角星都是亮的,
        // 最后让这个类之后的五角星都是不亮的。


        //步骤:



        $(function () {
            var wjx_none = '☆'; // 空心五角星
            var wjx_sel = '★'; // 实心五角星



            //鼠标移入五角星
            $(".comment>li").on("mouseenter",{}, function () {
                //当前五角星及之前的五角星都变亮,之后的五角星不亮  end()补链
                $(this).text(wjx_sel).prevAll().text(wjx_sel).end().nextAll().text(wjx_none);
            })

            //鼠标移出五角星
            $(".comment>li").on("mouseleave",{},function(){
                //当前的五角星不亮,之前的五角星也不亮            end()补链
                $(this).text(wjx_none).prevAll().text(wjx_none).end().nextAll().text(wjx_none);
            })

            //鼠标点击五角星
            $(".comment>li").on("click",{}, function () {
                $(this).addClass("current").siblings().removeClass("current");
            })


            //鼠标移出所有五角星
            $(".comment").on("mouseleave",{}, function () {
                //                                                end()补链
                $(".current").text(wjx_sel).prevAll().text(wjx_sel).end().nextAll().text(wjx_none);
            })
        })
    </script>
</head>
<body>
<ul class="comment">
    <li>☆</li>
    <li>☆</li>
    <li>☆</li>
    <li>☆</li>
    <li>☆</li>
</ul>
</body>
</html>

◆显式遍历

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery的显式遍历</title>
    <style>
        li {
            width: 200px;
            height: 200px;
            margin: 20px;
            float: left;
            list-style: none;
            text-align: center;
            font: 50px/200px "simsun";
            background-color: pink;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script>

        $(function () {

            //jQuery中有显式遍历的方式,each和map方法,
            // 遍历的操作方式和数组的forEach与map方法类似,
            // 内部获取到的每一个元素也是原生js的dom对象
            $("li").each(function (index,element) {
                $(element).css("opacity",(index+1)/10);
                $(element).addClass("index:"+index);
            });
        })
    </script>
</head>
<body>
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
    <li>6</li>
    <li>7</li>
    <li>8</li>
    <li>9</li>
    <li>10</li>
</ul>
</body>
</html>


14.解决多库共存方法

◆当引入jQuery的多个版本库时,无论使用$还是jQuery,其实都是在使用最后一个引入的jQuery版本库,可以通过打印jQuery的版本号来确定

console.log($.fn.jquery);console.log(jQuery.fn.jquery);

◆如果你想放弃$的使用权然后将$符号使用权转交给上一个引入的jQuery版本库的话,可以使用

$.noConflict()

,然后你就可以通过调用$符号使用上一个jQuery版本库了,而当前这一个版本库你可以使用jQuery单词来调用

◆如果你想放弃$符号与jQuery单词的使用权而改用其它自定义的单词时,可以使用

var customer=$.noConflict(true);

,然后当前这个jQuery版本库就能够通过调用customer单词来使用了,而$符号与jQuery单词的使用权归上一个引入的jQuery版本库使用了,但是可以通过连续的这种方式,实现真正的n个版本的jQuery版本库共存。

◆jQuery版本库的多版本库的引入都是从低到高的引入,不推荐从高到低的引入。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>解决jQuery多库共存的问题</title>
    <script src="jquery-1.8.2.min.js"></script>
    <script src="jquery-1.11.1.js"></script>
    <script>

        /*
         *解决多库共存方法
         1.当引入jQuery的多个版本库时,无论使用$还是jQuery,
           其实都是在使用最后一个引入的jQuery版本库,
           可以通过打印jQuery的版本号来确定
           (console.log($.fn.jquery);console.log(jQuery.fn.jquery);)
         2.如果你想放弃$的使用权然后将$符号使用权转交给上一个引入的jQuery版本库的话,
           可以使用$.noConflict(),
           然后你就可以通过调用$符号使用上一个jQuery版本库了,
           而当前这一个版本库你可以使用jQuery单词来调用
         3.如果你想放弃$符号与jQuery单词的使用权而改用其它自定义的单词时,
           可以使用var customer=$.noConflict(true);,
           然后当前这个jQuery版本库就能够通过调用customer单词来使用了,
           而$符号与jQuery单词的使用权归上一个引入的jQuery版本库使用了,
           但是可以通过连续的这种方式,
           实现真正的n个版本的jQuery版本库共存。
         4.jQuery版本库的多版本库的引入都是从低到高的引入,
           不推荐从高到低的引入。
         */

        //1.打印jQuery的版本号
//        console.log($.fn.jquery);//1.11.1 最后引入的jquery版本库

        //2.放弃$的使用权然后将$符号使用权转交给上一个引入的jQuery版本库
//        $.noConflict();
//        console.log($.fn.jquery);//1.8.2 $符号给 最后一个引入的jQuery版本库的上一个引入的jQuery版本库使用了
//        console.log(jQuery.fn.jquery);//1.11.1  jQuery单词还可以使用 ,可以用来调用最后一个引入的jQuery版本库

        //放弃$符号与jQuery单词的使用权而改用其它自定义的单词
        var customer= $.noConflict(true);
        console.log(customer.fn.jquery);//1.11.1
        console.log($.fn.jquery);//1.8.2
        console.log(jQuery.fn.jquery);//1.8.2

        //说明:$.noConflict(true)这种方式改变使用权的调用符号,让多个jQuery版本库共存
        //例如;$符号与jQuery单词的使用权归上一个引入的jQuery版本库使用了,
        // 但是可以通过连续的这种方式,实现真正的n个版本的jQuery版本库共存

    </script>
</head>
<body>

</body>
</html>


15.JS扩展方法与JQuery扩展方法的区别

◆原生js使用原型的方式是:

object.prototype.functionName=function(){}

◆jQuery使用原型的方式是:

$.fn.functionName=function(){}

,其实都差不多,只不过前者是给对象扩展方法,后者是给伪数组扩展方法。


16.使用jQuery的插件来DIY:动态改变颜色、图片懒加载

◆动态改变颜色:jquery.color.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>解决jQuery的animate()无法改变颜色的问题(使用color插件)</title>
    <style type="text/css">
        .box {
            width: 400px;
            height: 400px;
            /*border: 1px solid #000;*/
            background-color: black;
            margin:100px;
            
        }
        
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script src="jquery.color.js"></script>
    <script>

      $(function () {
          
          $("button:eq(0)").on("click",{}, function () {
              $(".box").animate({backgroundColor:"#f00"},2000);

          })
          $("button:eq(1)").on("click",{}, function () {
              $(".box").animate({backgroundColor:"#0f0"},2000);

          })
          $("button:eq(2)").on("click",{}, function () {
              $(".box").animate({backgroundColor:"#00f"},2000);

          })
          $("button:eq(3)").on("click",{}, function () {
              $(".box").animate({backgroundColor:"#fff"},2000);

          })
          $("button:eq(4)").on("click",{}, function () {
              $(".box").animate({backgroundColor:"#000"},2000);

          })
      })


    </script>
</head>
<body>
<button>变红色</button>
<button>变绿色</button>
<button>变蓝色</button>
<button>变白色</button>
<button>变黑色</button>
<div class="box">
</div>
</body>
</html>

◆图片懒加载:jquery.lazyload.js

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用jQuery的lazyload插件进行图片懒加载</title>
    <style type="text/css">
        div {
            height: 2000px;
        }
    </style>
    <script src="jquery-1.11.1.js"></script>
    <script src="jquery.lazyload.js"></script>
    <script>
        $(function () {
            //懒加载调用

            //使用插件:1.引包。(必须在jquery之下)   2.通过调用方法实现功能,而参数的不同,功能也可能不同。
            $(".lazy").lazyload();
        })
    </script>
</head>
<body>
<div></div>
<!--<img src="images/02.jpg">-->
<img class="lazy" data-original="images/02.jpg" width="640" height="480">
</body>
</html>


17.自己制作JQuery简单插件:

◆jquery的1.xx版本是支持IE678等低版本的浏览器的,而jquery的2.xx版本是不支持IE678等低版本的浏览器的

◆自己做的jquery插件.js

$(function () {

    /*
    设置颜色
     */
    $.fn.setColor= function () {
        console.log(this);
        $(this).css({"background-color":"#a05"});
    }

    /*
    设置大小
     */
    $.fn.setSize= function (size) {
        $(this).css({width:size,height:size})
    }
})

◆使用自己做的jQuery插件:原理就是先引入JQuery,然后给JQuery扩展方法,最后就是你直接调用自己给JQuery扩展的方法

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用自己做的jQuery插件</title>
    <style type="text/css">

        div {
            width: 300px;
            height: 300px;
            margin:50px;
        }

    </style>
    <script src="jquery-1.11.1.js"></script>
    <script src="19.自己做的jquery插件.js"></script>
    <script>
        $(function () {
            //使用自己写的插件中的方法
            $("div").setColor();
            $("div").setSize(500);

            /*
            *原生js使用原型的方式是:
            * object.prototype.functionName=function(){},
            * jQuery使用原型的方式是:$.fn.functionName=function(){},
            * 其实都差不多,只不过前者是给对象扩展方法,
            * 后者是给伪数组扩展方法。
             */
        })
    </script>
</head>
<body>
<div></div>
</body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值