jQuery学习笔记(pink)

jQuery

  • jQuery是个js库,内部是用JavaScript实现的

  • j就是JavaScript,Q是指Query查询,把js中的DOM操作做了封装,可以快速查询使用

  • jQuery 出现的目的是加快前端人员的开发速度,我们可以非常方便的调用和使用它,从而提高开发效率。

    学习jQuery本质: 就是学习调用这些函数(方法)。

jQuery优点:

1.轻量级。核心文件才几十kb,不会影响页面加载速度
2.链式编程、隐式迭代
3.对事件、样式、动画支持,大大简化了DOM操作
4.支持插件扩展开发。有着丰富的第三方的插件,例如:树形菜单、日期控件、轮播图等

jQuery 的基本使用

jQuery 的入口函数

// $('div').hide();
        // 1. 等着页面DOM加载完毕再去执行js 代码
        // $(document).ready(function() {
        //     $('div').hide();
        // })
        // 2.  等着页面DOM加载完毕再去执行js 代码
        $(function() {
            $('div').hide();

        })

顶级对象

 // 1. $ 是jQuery的别称(另外的名字)
        // $(function() {
        //     alert(11)
        // });
        jQuery(function() {
            // alert(11)
            // $('div').hide();
            jQuery('div').hide();
        });
        // 2. $同时也是jQuery的 顶级对象

jQuery对象和DOM对象

        // 1. DOM 对象:  用原生js获取过来的对象就是DOM对象
        var myDiv = document.querySelector('div'); // myDiv 是DOM对象
        var mySpan = document.querySelector('span'); // mySpan 是DOM对象
        console.dir(myDiv);
        // 2. jQuery对象: 用jquery方式获取过来的对象是jQuery对象。 本质:通过$把DOM元素进行了包装
        $('div'); // $('div')是一个jQuery 对象
        $('span'); // $('span')是一个jQuery 对象
        console.dir($('div'));
        // 3. jQuery 对象只能使用 jQuery 方法,DOM 对象则使用原生的 JavaScirpt 属性和方法
        // myDiv.style.display = 'none';
        // myDiv.hide(); myDiv是一个dom对象不能使用 jquery里面的hide方法
        // $('div').style.display = 'none'; 这个$('div')是一个jQuery对象不能使用原生js 的属性和方法

DOM对象和jQuery对象相互转换

    <video src="mov.mp4" muted></video>
    <script>
        // 1. DOM对象转换为 jQuery对象
        // (1) 我们直接获取视频,得到就是jQuery对象
        // $('video');
        // (2) 我们已经使用原生js 获取过来 DOM对象
        var myvideo = document.querySelector('video');
        // $(myvideo).play();  jquery里面没有play 这个方法
        // 2.  jQuery对象转换为DOM对象
        // myvideo.play();
        $('video')[0].play()
        $('video').get(0).play()

1.jQuery 常用API

1.1 jQuery 基础选择器

在这里插入图片描述

1.2 jQuery 层级选择器

在这里插入图片描述

1.3 jQuery 设置样式(隐式迭代)

$('div').css('属性', '值')

<div>惊喜不,意外不</div>
    <div>惊喜不,意外不</div>
    <div>惊喜不,意外不</div>
    <div>惊喜不,意外不</div>
    <ul>
        <li>相同的操作</li>
        <li>相同的操作</li>
        <li>相同的操作</li>
    </ul>
    <script>
        // 1. 获取四个div元素 
        console.log($("div"));

        // 2. 给四个div设置背景颜色为粉色 jquery对象不能使用style
        $("div").css("background", "pink");
        // 3. 隐式迭代就是把匹配的所有元素内部进行遍历循环,给每一个元素添加css这个方法
        $("ul li").css("color", "red");

1.4 jQuery 筛选选择器

在这里插入图片描述

1.5 jQuery 筛选方法(重点)

在这里插入图片描述

1.6 jQuery 里面的排他思想

当前元素设置样式,其余的兄弟元素清除样式。

在这里插入图片描述

$(function() {
            // 1. 隐式迭代 给所有的按钮都绑定了点击事件
            $("button").click(function() {
                // 2. 当前的元素变化背景颜色
                $(this).css("background", "pink");
                // 3. 其余的兄弟去掉背景颜色 隐式迭代
                $(this).siblings("button").css("background", "");
            });
        })

案例:淘宝服饰精品案例分析

① 核心原理:鼠标经过左侧盒子某个小li,就让内容区盒子相对应图片显示,其余的图片隐藏。

② 需要得到当前小li 的索引号,就可以显示对应索引号的图片

③ jQuery 得到当前元素索引号 $(this).index()

④ 中间对应的图片,可以通过 eq(index) 方法去选择 ⑤ 显示元素 show() 隐藏元素 hide()

在这里插入图片描述

<script>
        $(function() {
            // 1. 鼠标经过左侧的小li 
            $("#left li").mouseover(function() {
                // 2. 得到当前小li 的索引号
                var index = $(this).index();
                console.log(index);
                // 3. 让我们右侧的盒子相应索引号的图片显示出来就好了
                // $("#content div").eq(index).show();
                // 4. 让其余的图片(就是其他的兄弟)隐藏起来
                // $("#content div").eq(index).siblings().hide();
                // 链式编程
                $("#content div").eq(index).show().siblings().hide();

            })
        })
    </script>

链式编程

    <script>
        $(function() {
            // 1. 隐式迭代 给所有的按钮都绑定了点击事件
            $("button").click(function() {
                // 2. 让当前元素颜色变为红色
                // $(this).css("color", "red");
                // 3. 让其余的姐妹元素不变色 
                // $(this).siblings().css("color", "");
                // 链式编程
                // $(this).css("color", "red").siblings().css("color", "");
                // 我的颜色为红色, 我的兄弟的颜色为空
                // $(this).siblings().css('color', 'red');
                // 我的兄弟变为红色  ,我本身不变颜色
                $(this).siblings().parent().css('color', 'blue');
                // 最后是给我的兄弟的爸爸 body 变化颜色 

            });
        })
    </script>

2.jQuery 样式操作

2.1 操作 css 方法

jQuery 可以使用 css 方法来修改简单元素样式; 也可以操作类,修改多个样式。$(this).css(‘‘color’’);

1.参数只写属性名,则是返回属性值

$(this).css(''color'', ''red'');

2.参数是属性名,属性值,逗号分隔,是设置一组样式,属性必须加引号,值如果是数字可以不用跟单位和引号 $(this).css({ "color":"white","font-size":"20px"});

3.参数可以是对象形式,方便设置多组样式。属性名和属性值用冒号隔开, 属性可以不用加引号,

script>
	/*1.设置一个样式*/
	//两个参数  设置的样式属性,具体样式
	$('li').css('color','red');
	//传入对象(设置的样式属性:具体样式)
	$('li').css({'color':'red'});
	$("div").css('height', "300px"); //属性名一定要加引号
	/*2.设置多个样式*/
	$("div").css({
       width: 400,
       height: 400,
       backgroundColor: "red",
       marginTop:50
       // 如果是复合属性则必须采取驼峰命名法,如果值不是数字,则需要加引号    
    })
</script>

2.2设置类样式方法

作用等同于以前的 classList,可以操作类样式, 注意操作类里面的参数不要加点。

<script>
    /*1.添加一个类*/
    $('li').addClass('now');
    /*2.删除一个类*/
    $('li').removeClass('now');
    /*3.切换一个类  有就删除没有就添加*/
    $('li').toggleClass('now');
    /*4.匹配一个类  判断是否包含某个类  如果包含返回true否知返回false*/
    $('li').hasClass('now');
</script>

案例:tab栏切换

① 点击上部的li,当前li 添加current类,其余兄弟移除类。

② 点击的同时,得到当前li 的索引号

③ 让下部里面相应索引号的item显示,其余的item隐藏
在这里插入图片描述

$(function() {
            // 1.点击上部的li,当前li 添加current类,其余兄弟移除类
            $(".tab_list li").click(function() {
                // 链式编程操作
                $(this).addClass("current").siblings().removeClass("current");
                // 2.点击的同时,得到当前li 的索引号
                var index = $(this).index();
                console.log(index);
                // 3.让下部里面相应索引号的item显示,其余的item隐藏
                $(".tab_con .item").eq(index).show().siblings().hide();
            });
        })

2.3 类操作与className区别

原生 JS 中 className 会覆盖元素原先里面的类名。

jQuery 里面类操作只是对指定类进行操作,不影响原先的类名。

3.jQuery 效果

在这里插入图片描述

3.1显示隐藏

显示:语法规范:show([speed,[easing],[fn]])
显示参数
(1)参数都可以省略, 无动画直接显示。
(2)speed:三种预定速度之一的字符串(“slow”,“normal”, or “fast”)或表示动画时长的毫秒数值(如:1000)。
(3)easing:(Optional) 用来指定切换效果,默认是“swing”,可用参数“linear”。
(4)fn: 回调函数,在动画完成时执行的函数,每个元素执行一次。
hide(); toggle(); 用法与之一样

	<button>显示</button>
    <button>隐藏</button>
    <button>切换</button>
    <div></div>
    <script>
        $(function() {
            $("button").eq(0).click(function() {
                $("div").show(1000, function() {
                    alert(1);
                });
            })
            $("button").eq(1).click(function() {
                $("div").hide(1000, function() {
                    alert(1);
                });
            })
            $("button").eq(2).click(function() {
                    $("div").toggle(1000);
                })
                // 一般情况下,我们都不加参数直接显示隐藏就可以了
        });

3.2滑动

	<button>下拉滑动</button>
    <button>上拉滑动</button>
    <button>切换滑动</button>
    <div></div>
    <script>
        $(function() {
            $("button").eq(0).click(function() {
                // 下滑动 slideDown()
                $("div").slideDown();
            })
            $("button").eq(1).click(function() {
                // 上滑动 slideUp()
                $("div").slideUp(500);


            })
            $("button").eq(2).click(function() {
                // 滑动切换 slideToggle()

                $("div").slideToggle(500);

            });

        });
    </script>

3.3切换

hover([over,]out)

      $(function() {
            // 鼠标经过
            // $(".nav>li").mouseover(function() {
            //     // $(this) jQuery 当前元素  this不要加引号
            //     // show() 显示元素  hide() 隐藏元素
            //     $(this).children("ul").slideDown(200);
            // });
            // // 鼠标离开
            // $(".nav>li").mouseout(function() {
            //     $(this).children("ul").slideUp(200);
            // });
            // 1. 事件切换 hover 就是鼠标经过和离开的复合写法
            // $(".nav>li").hover(function() {
            //     $(this).children("ul").slideDown(200);
            // }, function() {
            //     $(this).children("ul").slideUp(200);
            // });
            // 2. 事件切换 hover  如果只写一个函数,那么鼠标经过和鼠标离开都会触发这个函数
            $(".nav>li").hover(function() {
                $(this).children("ul").slideToggle();
            });
        })

3.4动画队列及其停止排队方法

动画或者效果一旦触发就会执行,如果多次触发,就造成多个动画或者效果排队执行。

停止排队:stop();
(1)stop() 方法用于停止动画或效果。
(2) 注意: stop() 写到动画或者效果的前面, 相当于停止结束上一次的动画。

/*
    jQuery中有个动画队列的机制。
    当我们对一个对象添加多次动画效果时后添加的动作就会被放入这个动画队列中,  
    等前面的动画完成后再开始执行。
    可是用户的操作往往都比动画快,  
    如果用户对一个对象频繁操作时不处理动画队列就会造成队列堆积,
    影响到效果。
*/
$(".nav>li").hover(function() {
                // stop 方法必须写到动画的前面
                $(this).children("ul").stop().slideToggle();
            });
        })

3.5淡入淡出

fadeIn();	fadeOut();	fadeToggle();

<button>淡入效果</button>
    <button>淡出效果</button>
    <button>淡入淡出切换</button>
    <button>修改透明度</button>
    <div></div>
    <script>
        $(function() {
            $("button").eq(0).click(function() {
                // 淡入 fadeIn()
                $("div").fadeIn(1000);
            })
            $("button").eq(1).click(function() {
                // 淡出 fadeOut()
                $("div").fadeOut(1000);

            })
            $("button").eq(2).click(function() {
                // 淡入淡出切换 fadeToggle()
                $("div").fadeToggle(1000);

            });
            $("button").eq(3).click(function() {
                //  修改透明度 fadeTo() 这个速度和透明度要必须写
                $("div").fadeTo(1000, 0.5);

            });


        });
    </script>

案例:高亮显示

在这里插入图片描述

<script>
        $(function() {
            //鼠标进入的时候,其他的li标签透明度:0.5
            $(".wrap li").hover(function() {
                $(this).siblings().stop().fadeTo(400, 0.5);
            }, function() {
                // 鼠标离开,其他li 透明度改为 1
                $(this).siblings().stop().fadeTo(400, 1);
            })

        });
    </script>

3.6 自定义动画 animate

语法:animate(params,[speed],[easing],[fn])

参数:params: 想要更改的样式属性,以对象形式传递,必须写。

属性名可以不用带引号, 如果是复合属性则需要采取驼峰命名法 borderLeft。

其余参数都可以省略

    <button>动起来</button>
    <div></div>
    <script>
        $(function() {
            $("button").click(function() {
                $("div").animate({
                    left: 500,
                    top: 300,
                    opacity: .4,
                    width: 500
                }, 500);
            })
        })
    </script>

案例:王者荣耀手风琴效果

① 鼠标经过某个小li 有两步操作:

② 当前小li 宽度变为 224px, 同时里面的小图片淡出,大图片淡入

③ 其余兄弟小li宽度变为69px, 小图片淡入, 大图片淡出

在这里插入图片描述

       $(function() {
            // 鼠标经过某个小li 有两步操作:
            $(".king li").mouseenter(function() {
                // 1.当前小li 宽度变为 224px, 同时里面的小图片淡出,大图片淡入
                $(this).stop().animate({
                    width: 224
                }).find(".small").stop().fadeOut().siblings(".big").stop().fadeIn();
                // 2.其余兄弟小li宽度变为69px, 小图片淡入, 大图片淡出
                $(this).siblings("li").stop().animate({
                    width: 69
                }).find(".small").stop().fadeIn().siblings(".big").stop().fadeOut();
            })

4.jQuery 属性操作

1.获取属性语法

1 设置或获取元素固有属性值 prop() prop(''属性'')

2.设置属性语法 prop(''属性'', ''属性值'')

2 设置或获取元素自定义属性值 attr()

3.数据缓存 data()

    <a href="http://www.itcast.cn" title="都挺好">都挺好</a>
    <input type="checkbox" name="" id="" checked>
    <div index="1" data-index="2">我是div</div>
    <span>123</span>
    <script>
        $(function() {
            //1. element.prop("属性名") 获取元素固有的属性值
            console.log($("a").prop("href"));
            $("a").prop("title", "我们都挺好");
            $("input").change(function() {
                console.log($(this).prop("checked"));

            });
            // console.log($("div").prop("index"));
            // 2. 元素的自定义属性 我们通过 attr()
            console.log($("div").attr("index"));
            $("div").attr("index", 4);
            console.log($("div").attr("data-index"));
            // 3. 数据缓存 data() 这个里面的数据是存放在元素的内存里面
            $("span").data("uname", "andy");
            console.log($("span").data("uname"));
            // 这个方法获取data-index h5自定义属性 第一个 不用写data-  而且返回的是数字型
            console.log($("div").data("index"));
        })
    </script>

案例:购物车案例模块-全选分析

① 全选思路:里面3个小的复选框按钮(j-checkbox)选中状态(checked)跟着全选按钮(checkall)走。

② 因为checked 是复选框的固有属性,此时我们需要利用prop()方法获取和设置该属性。

③ 把全选按钮状态赋值给3小复选框就可以了。

④ 当我们每次点击小的复选框按钮,就来判断:

⑤ 如果小复选框被选中的个数等于3 就应该把全选按钮选上,否则全选按钮不选。

⑥ :checked 选择器 :checked 查找被选中的表单元素

在这里插入图片描述

<script>
		// 1. 全选 全不选功能模块
	    // 就是把全选按钮(checkall)的状态赋值给 三个小的按钮(j-checkbox)就可以了
	    // 事件可以使用change
	    $(".checkall").change(function() {
	        // console.log($(this).prop("checked"));
	        $(".j-checkbox, .checkall").prop("checked", $(this).prop("checked"));
	       
	    });
	    // 2. 如果小复选框被选中的个数等于3 就应该把全选按钮选上,否则全选按钮不选。
	    $(".j-checkbox").change(function() {
	        // if(被选中的小的复选框的个数 === 3) {
	        //     就要选中全选按钮
	        // } else {
	        //     不要选中全选按钮
	        // }
	        // console.log($(".j-checkbox:checked").length);
	        // $(".j-checkbox").length 这个是所有的小复选框的个数
	        if ($(".j-checkbox:checked").length === $(".j-checkbox").length) {
	            $(".checkall").prop("checked", true);
	        } else {
	            $(".checkall").prop("checked", false);
	        }
	    });
	</script>

5.jQuery 文本属性值

在这里插入图片描述

<div>
        <span>我是内容</span>
    </div>
    <input type="text" value="请输入内容">
	<script>
        // 1. 获取设置元素内容 html() 相当于原生inner HTML
        console.log($("div").html());
        // $("div").html("123");
        
        // 2. 获取设置元素文本内容 text() 相当与原生 innerText
        console.log($("div").text());
        $("div").text("123");
        
        // 3. 获取设置表单值 val() 相当于原生value
        console.log($("input").val());
        $("input").val("123");
    </script>

6.jQuery 元素操作

主要是遍历、创建、添加、删除元素操作。

6.1 遍历元素

jQuery 隐式迭代是对同一类元素做了同样的操作。 如果想要给同一类元素做不同操作,就需要用到遍历。

	<div>1</div>
    <div>2</div>
    <div>3</div>
    <script>
        $(function() {
            // $("div").css("color", "red");
            // 如果针对于同一类元素做不同操作,需要用到遍历元素(类似for,但是比for强大)
            var sum = 0;
            // 1. each() 方法遍历元素 
            var arr = ["red", "green", "blue"];
            $("div").each(function(i, domEle) {
                // 回调函数第一个参数一定是索引号  可以自己指定索引号号名称
                // console.log(index);
                // console.log(i);
                // 回调函数第二个参数一定是 dom元素对象 也是自己命名
                // console.log(domEle);
                // domEle.css("color"); dom对象没有css方法
                $(domEle).css("color", arr[i]);
                sum += parseInt($(domEle).text());
            })
            console.log(sum);
            // 2. $.each() 方法遍历元素 主要用于遍历数据,处理数据
            // $.each($("div"), function(i, ele) {
            //     console.log(i);
            //     console.log(ele);

            // });
            // $.each(arr, function(i, ele) {
            //     console.log(i);
            //     console.log(ele);


            // })
            $.each({
                name: "andy",
                age: 18
            }, function(i, ele) { 
                console.log(i); // 输出的是 name age 属性名
                console.log(ele); // 输出的是 andy  18 属性值


            })
        })
    </script>

6.2创建添加删除元素

    <ul>
        <li>原先的li</li>
    </ul>
    <div class="test">我是原先的div</div>
    <script>
        $(function() {
            // 1. 创建元素
            var li = $("<li>我是后来创建的li</li>");
            // 2. 添加元素
            	// (1) 内部添加
            	$("ul").append(li);  //内部添加并且放到内容的最后面 
            	$("ul").prepend(li); // 内部添加并且放到内容的最前面

            	// (2) 外部添加
            	var div = $("<div>我是后妈生的</div>");
            	$(".test").after(div);
            	$(".test").before(div);
         	//内部添加元素,生成之后,它们是父子关系。
			//外部添加元素,生成之后,他们是兄弟关系。
            
            // 3. 删除元素
             $("ul").remove(); //可以删除匹配的元素 自杀
             $("ul").empty(); // 可以删除匹配的元素里面的子节点 孩子
             $("ul").html(""); // 可以删除匹配的元素里面的子节点 孩子

        })
    </script>

7.jQuery 尺寸、位置操作

7.1 jQuery 尺寸

在这里插入图片描述

7.2jQuery 位置

位置主要有三个: offset()、position()、scrollTop()/scrollLeft()

offset() 设置或获取元素偏移

	<script>
		// offset() 方法设置或返回被选元素相对于文档的偏移坐标,跟父级没有关系。
		// 该方法有2个属性 left、top 。
        //offset().top 用于获取距离文档顶部的距离,offset().left 用于获取距离文档左侧的距离。
		// 1. 获取设置距离文档的位置(偏移) offset
	    $(".son").offset({
	         top: 200,
	         left: 200
	     });
	     // console.log($(".son").offset());
	     // console.log($(".son").offset().top);
	</script>

position() 获取元素偏移

① position() 方法用于返回被选元素相对于带有定位的父级偏移坐标,如果父级都没有定位,则以文档为准。

② 该方法有2个属性 left、top。position().top 用于获取距离定位父级顶部的距离,position().left 用于获取距离定 位父级左侧的距离。

③ 该方法只能获取。

	<script>
		// position() 方法用于返回被选元素相对于带有定位的父级偏移坐标,如果父级都没有定位,则以文档为准。
		// 该方法有2个属性 left、top。position().top 用于获取距离定位父级顶部的距离,position().left 用于获取距离定位父级
左侧的距离。
		// 该方法只能获取不能设置偏移
		console.log($(".son").position().top);
            // $(".son").position({
            //     top: 200,
            //     left: 200
            // });
	</script>

scrollTop()/scrollLeft() 设置或获取元素被卷去的头部和左侧

    <div class="back">返回顶部</div>
    <div class="container">
    </div>
    <script>
        $(function() {
            $(document).scrollTop(100);
            // 被卷去的头部 scrollTop()  / 被卷去的左侧 scrollLeft()
            // 页面滚动事件
            var boxTop = $(".container").offset().top;
            $(window).scroll(function() {
                // console.log(11);
                console.log($(document).scrollTop());
                if ($(document).scrollTop() >= boxTop) {
                    $(".back").fadeIn();
                } else {
                    $(".back").fadeOut();
                }
            });
            // 返回顶部
            $(".back").click(function() {
                // $(document).scrollTop(0);
                $("body, html").stop().animate({
                    scrollTop: 0
                });
                // $(document).stop().animate({
                //     scrollTop: 0
                // }); 不能是文档而是 html和body元素做动画
            })
        })
    </script>

案例:电梯导航

$(function() {
    // 当我们点击了小li 此时不需要执行 页面滚动事件里面的 li 的背景选择 添加 current
    // 节流阀  互斥锁 
    var flag = true;
    // 1.显示隐藏电梯导航
    var toolTop = $(".recommend").offset().top;
    toggleTool();

    function toggleTool() {
        if ($(document).scrollTop() >= toolTop) {
            $(".fixedtool").fadeIn();
        } else {
            $(".fixedtool").fadeOut();
        };
    }

    $(window).scroll(function() {
        toggleTool();
        // 3. 页面滚动到某个内容区域,左侧电梯导航小li相应添加和删除current类名
        if (flag) {
            $(".floor .w").each(function(i, ele) {
                if ($(document).scrollTop() >= $(ele).offset().top) {
                    console.log(i);
                    $(".fixedtool li").eq(i).addClass("current").siblings().removeClass();

                }
            })
        }
				
    });
    // 2. 点击电梯导航页面可以滚动到相应内容区域
    $(".fixedtool li").click(function() {
        flag = false;
        console.log($(this).index());
        // 当我们每次点击小li 就需要计算出页面要去往的位置 
        // 选出对应索引号的内容区的盒子 计算它的.offset().top
        var current = $(".floor .w").eq($(this).index()).offset().top;
        // 页面动画滚动效果
        $("body, html").stop().animate({
            scrollTop: current
        }, function() {
            flag = true;
        });
        // 点击之后,让当前的小li 添加current 类名 ,姐妹移除current类名
        $(this).addClass("current").siblings().removeClass();
    })
})

8.jQuery 事件

单个事件注册

element.事件(function(){})

$(“div”).click(function(){ 事件处理程序 })

其他事件和原生基本一致。

比如mouseover、mouseout、blur、focus、change、keydown、keyup、resize、scroll 等

8.1 事件处理

on() 绑定事件 element.on(events,[selector],fn)

  1. events:一个或多个用空格分隔的事件类型,如"click"或"keydown" 。

  2. selector: 元素的子元素选择器 。

  3. fn:回调函数 即绑定在元素身上的侦听函数。 on() 方法在匹配元素上绑定一个或多个事件的事件处理函数

    <div></div>
    <ul>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
        <li>我们都是好孩子</li>
    </ul>
    <ol>

    </ol>
    <script>
        $(function() {
            1. 单个事件注册
            $("div").click(function() {
                $(this).css("background", "purple");
            });
            $("div").mouseenter(function() {
                $(this).css("background", "skyblue");
            });

            2. 事件处理on
            (1) on可以绑定1个或者多个事件处理程序
            $("div").on({
                mouseenter: function() {
                    $(this).css("background", "skyblue");
                },
                click: function() {
                    $(this).css("background", "purple");
                },
                mouseleave: function() {
                    $(this).css("background", "blue");
                }
            });
            $("div").on("mouseenter mouseleave", function() {
                $(this).toggleClass("current");
            });
            // (2) on可以实现事件委托(委派)
            // $("ul li").click();
            $("ul").on("click", "li", function() {
                alert(11);
            });
            // click 是绑定在ul 身上的,但是 触发的对象是 ul 里面的小li
            // (3) on可以给未来动态创建的元素绑定事件
            //动态创建的元素,click() 没有办法绑定事件, on() 可以给动态生成的元素绑定事件
            // $("ol li").click(function() {
            //     alert(11);
            // })
            $("ol").on("click", "li", function() {
                alert(11);
            })
            var li = $("<li>我是后来创建的</li>");
            $("ol").append(li);
        })
    </script>

案例:微博发布案例

① 点击发布按钮, 动态创建一个小li,放入文本框的内容和删除按钮, 并且添加到ul 中。

② 点击的删除按钮,可以删除当前的微博留言。

    <div class="box" id="weibo">
        <span>微博发布</span>
        <textarea name="" class="txt" cols="30" rows="10"></textarea>
        <button class="btn">发布</button>
        <ul>
        </ul>
    </div>
</body>
<script>
        $(function() {
            // 1.点击发布按钮, 动态创建一个小li,放入文本框的内容和删除按钮, 并且添加到ul 中
            $(".btn").on("click", function() {
                var li = $("<li></li>");
                li.html($(".txt").val() + "<a href='javascript:;'> 删除</a>");
                $("ul").prepend(li);
                li.slideDown();
                $(".txt").val("");
            })

            // 2.点击的删除按钮,可以删除当前的微博留言li
            // $("ul a").click(function() {  // 此时的click不能给动态创建的a添加事件
            //     alert(11);
            // })
            // on可以给动态创建的元素绑定事件
            $("ul").on("click", "a", function() {
                $(this).parent().slideUp(function() {
                    $(this).remove();
                });
            })

        })
    </script>

8.2 事件处理 off() 解绑事件

off() 方法可以移除通过 on() 方法添加的事件处理程序。

		$("p").off() // 解绑p元素所有事件处理程序
		$("p").off( "click") // 解绑p元素上面的点击事件 后面的 foo 是侦听函数名
		$("ul").off("click", "li"); // 解绑事件委托

        $(function() {
            $("div").on({
                click: function() {
                    console.log("我点击了");
                },
                mouseover: function() {
                    console.log('我鼠标经过了');
                }
            });
            $("ul").on("click", "li", function() {
                alert(11);
            });
            // 1. 事件解绑 off 
            // $("div").off();  // 这个是解除了div身上的所有事件
            $("div").off("click"); // 这个是解除了div身上的点击事件
            $("ul").off("click", "li");//解绑委托
            // 2. one() 但是它只能触发事件一次
            $("p").one("click", function() {
                alert(11);
            })
        })

8.3 自动触发事件 trigger()

    <div></div>
    <input type="text">

<script>
        $(function() {
            $("div").on("click", function() {
                alert(11);
            });

            // 自动触发事件
            // 1. 元素.事件()
            $("div").click();会触发元素的默认行为
            // 2. 元素.trigger("事件")
            $("div").trigger("click");会触发元素的默认行为
            $("input").trigger("focus");
            // 3. 元素.triggerHandler("事件") 就是不会触发元素的默认行为(比如说光标闪烁)
            $("div").triggerHandler("click");
            //$("input").on("focus", function() {
                $(this).val("你好吗");
            });
            $("input").triggerHandler("focus");

        });
    </script>

8.3jQuery 事件对象

事件被触发,就会有事件对象的产生。

element.on(events,[selector],function(event) {})

阻止默认行为:event.preventDefault() 或者 return false

阻止冒泡: event.stopPropagation() element.on(events,[selector],function(event) {}

9.jQuery 其他方法

jQuery 拷贝对象

如果想要把某个对象拷贝(合并) 给另外一个对象使用,此时可以使用 $.extend() 方法

语法: $.extend([deep], target, object1, [objectN])

  1. deep: 如果设为true 为深拷贝, 默认为false 浅拷贝
  2. target: 要拷贝的目标对象
  3. object1:待拷贝到第一个对象的对象。
  4. objectN:待拷贝到第N个对象的对象。
  5. 浅拷贝是把被拷贝的对象复杂数据类型中的地址拷贝给目标对象,修改目标对象会影响被拷贝对象。
  6. 深拷贝,前面加true, 完全克隆(拷贝的对象,而不是地址),修改目标对象不会影响被拷贝对象。
            // var targetObj = {};
            // var obj = {
            //     id: 1,
            //     name: "andy"
            // };
            // // $.extend(target, obj);
            // $.extend(targetObj, obj);
            // console.log(targetObj);
            // var targetObj = {
            //     id: 0
            // };
            // var obj = {
            //     id: 1,
            //     name: "andy"
            // };
            // // $.extend(target, obj);
            // $.extend(targetObj, obj);
            // console.log(targetObj); // 会覆盖targetObj 里面原来的数据
            var targetObj = {
                id: 0,
                msg: {
                    sex: '男'
                }
            };
            var obj = {
                id: 1,
                name: "andy",
                msg: {
                    age: 18
                }
            };
            // // $.extend(target, obj);
            // $.extend(targetObj, obj);
            // console.log(targetObj); // 会覆盖targetObj 里面原来的数据
            // // 1. 浅拷贝把原来对象里面的复杂数据类型地址拷贝给目标对象
            // targetObj.msg.age = 20;
            // console.log(targetObj);
            // console.log(obj);
            // 2. 深拷贝把里面的数据完全复制一份给目标对象 如果里面有不冲突的属性,会合并到一起 
            $.extend(true, targetObj, obj);
            // console.log(targetObj); // 会覆盖targetObj 里面原来的数据
            targetObj.msg.age = 20;
            console.log(targetObj); // msg :{sex: "男", age: 20}
            console.log(obj);

jQuery 多库共存

问题概述: jQuery使用作为标示符,随着 j Q u e r y 的流行 , 其他 j s 库也会用这 作为标示符,随着jQuery的流行,其他 js 库也会用这作为标示符,随着jQuery的流行,其他js库也会用这作为标识符, 这样一起使用会引起冲突。

客观需求: 需要一个解决方案,让jQuery 和其他的js库不存在冲突,可以同时存在,这就叫做多库共存。

jQuery 解决方案:

1.把里面的 $ 符号 统一改为 jQuery。 比如 jQuery(‘‘div’’)

2.jQuery 变量规定新的名称:$.noConflict() var xx = $.noConflict();

        $(function() {
            function $(ele) {
                return document.querySelector(ele);
            }
            console.log($("div"));
            // 1. 如果$ 符号冲突 我们就使用 jQuery
            jQuery.each();
            // 2. 让jquery 释放对$ 控制权 让用自己决定
            var suibian = jQuery.noConflict();
            console.log(suibian("span"));
            suibian.each();
        })

版权声明:本文为qq_45911263原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。