首页 前端知识 寒露凝珠jquery补充

寒露凝珠jquery补充

2024-05-03 18:05:40 前端知识 前端哥 41 667 我要收藏

四、Jquery入口函数

之前我们的jquery引用和所有的jquery代码都写在dom(网页内容)的后面,但是看商业网站,jquery引用和一些jquery代码会写在网页内容的前面,常常是在head标签中。如果我们直接把之前代码中的jquery引用和代码写到head中,会发现jquery代码无法执行。要实现jq代码在网页内容前面还可以执行就要用到JQuery入口函数。

语法1:

$(function(){

........//这里是页面DOM加载完成的入口。

});

 语法2:

$(document).ready(function(){

........//这里是页面DOM加载完成的入口。

});

1.等DOM结构渲染完成即可执行内部代码,不用等到所有外部资源加载完成,JQuery帮我们完成了封装。

2.相当与原生js中的DOMContentLoaded

3.不同于原生js中的load事件,是等页面的所有外部资源加载完才执行内部代码,外部资源包括外部js,css,图片等。

4.推荐实用第一种写法。

原来的程序

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>

		<style>
			div {
				width: 100px;
				height: 100px;
				background-color: #000;
			}

			.a {
				background: palevioletred;
				border-radius: 50%;
			}

			.b {
				border: 5px dashed darkcyan;
				opacity: 0.6;
			}
		</style>
	</head>
	<body>
		<button id="btn1">添加类样式</button>
		<button id="btn2">移除类样式</button>
		<hr>
		<div></div>
		<script src="js/jquery.min.js"></script>
		<script>
			$("#btn1").click(function() {
				$("div").addClass("a b");
			});
			$("#btn2").click(function() {
				$("div").removeClass("b");
			});
		</script>
	</body>

</html>

使用入口函数后

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>

		<style>
			div {
				width: 100px;
				height: 100px;
				background-color: #000;
			}

			.a {
				background: palevioletred;
				border-radius: 50%;
			}

			.b {
				border: 5px dashed darkcyan;
				opacity: 0.6;
			}
		</style>
		<script src="js/jquery.min.js"></script>
		<script>
			$(function(){				
				$("#btn1").click(function() {
					$("div").addClass("a b");
				});
				$("#btn2").click(function() {
					$("div").removeClass("b");
				});				
			})			
		</script>
	</head>
	<body>
		<button id="btn1">添加类样式</button>
		<button id="btn2">移除类样式</button>
		<hr>
		<div></div>
		
	</body>

</html>

也可以把scirpt模块写成外部文件,然后引入。

五、Each遍历

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

语法1:

$("div").each(function (index, domEle) { xxx; })       

1.each() 方法遍历匹配的每一个元素。主要用DOM处理。 each 每一个
2.里面的回调函数有2个参数: index 是每个元素的索引号; demEle 是每个DOM元素对象,不是jquery对象
3.所以要想使用jquery方法,需要给这个dom元素转换为jquery对象 $(domEle)

语法2:

$.each(object,function (index, element) { xxx; })       
  1. $.each()方法可用于遍历任何对象。主要用于数据处理,比如数组,对象
  2. 里面的函数有2个参数: index 是每个元素的索引号; element 遍历内容
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<div>1</div>
		<div>2</div>
		<div>3</div>
		<button>改背景颜色</button>		
		<script src="js/jquery.min.js"></script>
		<script>
			$("button:eq(0)").click(function(){
				var arr=['red','pink','green'];
				$("div").each(function(index,domEle){
					$(domEle).css('background-color',arr[index]);//domEle是dom对象,这里转为jq对象
				});	
				
				// $.each($("div"),function(index,element){
				// 	$(element).css('background-color',arr[index]);
				// });
			});				
		</script>
	</body>
</html>
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>		
		<button>数组求和</button>
		<button >对象操作</button>
		<script src="js/jquery.min.js"></script>
		<script>			
			$("button:eq(0)").click(function(){				
				var arr=[1,2,4];
				var sum=0;
				$.each(arr,function(index,ele){
					console.log(index,ele);
					sum+=ele;					
				});
				console.log(sum);				
			});			
			$("button:eq(1)").click(function(){					
				$.each({
				  name: "andy",
				  age: 18
				}, function(i, ele) {
				  console.log("i:"+i); // 输出的是 name age 属性名
				  console.log("ele:"+ele); // 输出的是 andy  18 属性值				
				})				
			});			
		</script>
	</body>
</html>

六、事件处理

6.1 事件绑定

jQuery中事件绑定有两种方式
1 eventName(function(){})
绑定对应事件名的监听, 例如:$('#div').click(function(){});
2 on(eventName, funcion(){})
通用的绑定事件监听, 例如:$('#div').on('click', function(){});

优缺点:
eventName: 编码方便, 但有的事件监听不支持
on: 编码不方便, 但更通用

企业开发中如何选择?能用eventName就用eventName, 不能用eventName就用on
 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>13-jQuery事件绑定和解绑</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .father{
            width: 200px;
            height: 200px;
            background: red;
            overflow: hidden;
        }
        .son{
            width: 100px;
            height: 100px;
            background: blue;
            margin-top: 50px;
            margin-left: 50px;
        }
    </style>
    <script src="js/jquery.min.js"></script>
    <script>
        $(function () {
            /*
            // 1.通过eventName绑定事件
            $(".son").click(function () {
                alert("son");
            });
            // 2.通过on绑定事件
           $(".son").on("click", function () {
               alert("son");
           });
             */

            // 2.可以多次添加相同类型的监听,后面添加不会覆盖前面添加
            function test1() {
                alert("son1");
            }
            function test2() {
                alert("son2");
            }
            function test3() {
                alert("son3");
            }
            $(".son").click(test1);
            $(".son").click(test2);
            $(".son").on("mouseleave", test3);
        });
    </script>
</head>
<body>
<div class="father">
    <div class="son"></div>
</div>
</body>
</html>

6.2 事件解绑

jQuery中可以通过off(eventName,function);解绑事件

<script>
        $(function () {
            function test1() {
                alert("son1");
            }
            function test2() {
                alert("son2");
            }
            function test3() {
                alert("son3");
            }
            $(".son").click(test1);
            $(".son").click(test2);
            $(".son").on("mouseleave", test3);

            // 1.1不传入任何参数,移除所有事件
//            $(".son").off();
            // 1.2传入一个参数,移除指定事件
//            $(".son").off("click");
            // 1.3传入两个参数,移除指定事件中的指定回调
            $(".son").off("click", test1);
        });
</script>

6.3 事件冒泡

什么是事件冒泡?

事件冒泡是从目标元素逐级向上传播到根节点的过程


案例中,但单击子节点的时候,儿子和父亲的click事件都会被触发。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			.father{
				width: 200px;
				height: 200px;
				background-color: skyblue;
			}
			.son{
				width: 100px;
				height: 100px;
				background-color: orange;
			}
		</style>
	</head>
	<body>
		<div class="father">
			<div class="son"></div>
		</div>
		<script src="js/jquery.min.js"></script>
		<script>
			$(".father").click(function(){
				console.log("father");
			})
			$(".son").click(function(){
				console.log("son");
			})
		</script>
	</body>
</html>

6.4 阻止事件冒泡

如何阻止事件冒泡?
多数情况下,我们希望在触发一个元素的事件处理程序时,不影响它的父元素, 此时便可以使用停止事件冒泡
 

<script>
        $(function () {
            $(".son").click(function (event) {
                console.log(".son");
                // 在子元素中停止事件冒泡,事件不会继续向上传播,所以父元素click方法不会被触发
                event.stopPropagation();
            });
            $(".father").click(function () {
                console.log(".father");
            });
        });
</script>

  • 6.5 事件委托--利用事件冒泡


  • 1.什么是事件委托?

  • 现实世界的委托: 某班有50个同学有快递,快递员单独找每个同学拿快递,耗时耗力,同学们委托班主任代收快递,快递员一次性将所有快递给班主任,同学们找班主任拿。对于快递员来说,操作就简单多了。

    这是委托之前的程序:

    $("ul li").click(function(){

    alert("单击了ul中的li");

    });

    这是委托之后的程序:

    $("ul").on("click","li",function(){

    alert("单击了ul中的li");

    });

    这里快递员相当于浏览器,老师是绑定事件的对象,同学是触发事件的对象。拿/派送快递就是事件,是浏览器要解释执行的那段程序。

    结论:

    事件委托就是请其他人帮忙做我们想做的事

    做完之后最终的结果还是会反馈到我们这里

  • 2. 委托的语法
  • 绑定事件的对象.on("事件","触发事件的对象",function(){***});

    $("ul").on("click","li",function(){

    alert("单击了ul中的li");

    });

  • 3.事件委托的好处

    (1) 减少监听数量从而节省页面交互就绪时间,节省内容

    添加到页面上的事件处理程序数量直接关系到页面的整体运行性能,因为浏览器需要不断的与Dom节点进行交互,访问Dom的次数越多,引起浏览器重绘与重排的次数也就越多,就会延长整个页面的交互就绪时间。

    每个监听函数都是一个对象,是对象就会占用内存,对象越多,内存占用率就越大,自然性能就越差。

    案例:

    $("li").click隐式迭代给界面上所有li都添加了click事件,编译后(js化后)有多少个li就有多少个同样的事件,监听数量众多

    $("ul").on("click","li",function(){}),事件绑定在ul上,js化后也只有一个事件,只需一个监听即可

  • <!DOCTYPE html>
    <html>
    	<head>
    		<meta charset="utf-8">
    		<title></title>
    	</head>
    	<body>
    		<ul>
    			<li>1我是孩子</li>
    			<li>2我是孩子</li>
    			<li>3我是孩子</li>
    		</ul>
    
    		<script src="js/jquery.min.js"></script>
    		<script>
    			/// js化后有3个监听事件
    			// $("ul li").on("click",function(){
    			// 	alert("单击了ul中的li");
    			// });
    
    			//利用委托,js化后只有一个监听事件
    			$("ul").on("click", "li", function() {
    				alert("单击了ul中的li");
    			})
    		</script>
    	</body>
    </html>
    

    (2) 新增的元素可以响应新增前(自己被添加前)添加的事件

         默认情况下新增的元素无法响应新增前添加的事件,就是通过$("ul").append新添加的li无法响应在它添加前就定义的 $("ul li").click事件。

          然而使用on动态绑定的事件,新增元素自动添加事件响应处理,就是通过$("ul").append新添加的li无法可以响应在它添加前就定义的 $("ul").on("click","li",function(){ *** });事件。

       这里必须使用委托,委托到一个一直存在的对象上面例如ul。直接使用$("li").on("click",function(){ *** });是不行的。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
	</head>
	<body>
		<ul>
			<li>1我是孩子</li>
			<li>2我是孩子</li>
			<li>3我是孩子</li>
		</ul>

		<script src="js/jquery.min.js"></script>
		<script>
			//给未来的元素绑定事件--on的第二大优势
			//这个弹不出来对话框,因为当前ol中还没创建li

			// $("ol li").click(function(){
			// 	alert("单击了ul中的li");
			// });	

			//这个可以弹出对话框,因为on是动态事件,专门来实现这个功能的,必须要写成委托的形式
			$("ul").on("click", "li", function() {
				alert("单击了ul中的li");
			});

			var newli = $("<li>我是后来创建的li</li>");
			$("ul").append(newli);
		</script>
	</body>
</html>
  • 3.委托注意事项

  • (1) 绑定事件的对象与触发事件的对象
  • 在上面的例子中ul就是绑定事件的对象,li就是触发事件的对象。

    如果要获取li可以使用$(this)或者e.target,如果要获取ul可以使用e.delegateTarge,打印e来看看可以获得更多信息

    (2)  绑定事件的对象,要选一直存在的对象,不能是运行后才新增的对象。

  • (3) 委托实质利用了冒泡原理,大家自己参悟。

  • 6.6 阻止事件默认行为

  • 什么是默认行为?
    网页中的元素有自己的默认行为,例如单击超链接后会跳转,点击提交表单按钮会提交

  • 如何阻止事件默认行为?
    可以使用event.preventDefault();方法阻止事件默认行为方法

  • <script>
            $(function () {
                $("a").click(function (event) {
                    var str = $("a").attr("href");
                    // 如果超链接是百度就不跳转
                    if(str.indexOf("baidu") > 0){
                        // 阻止默认行为
                        event.preventDefault();
                    }
                });
            });
    </script>
    
  •  6.7 获取事件的坐标


    当事件被触发时,系统会将事件对象(event)传递给回调函数,通过event对象我们就能获取事件的坐标

    获取事件坐标有三种方式
    event.offsetX, event.offsetY 相对于事件元素左上角
    event.pageX, event.pageY 相对于页面的左上角
    event.clientX, event.clientY 相对于视口的左上角

    event.page和event.client区别
    网页是可以滚动的,而视口是固定的
    所以想获取距离可视区域坐标通过event.client
    想获取距离网页左上角的坐标通过event.client
     

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style>
            *{
                margin: 0;
                padding: 0;
            }
           .father{
    			position:fixed;
    			bottom:0;
    			left:0;
                width: 200px;
                height: 200px;
                background: red;
                overflow: hidden;
            }
            .son{
                width: 100px;
                height: 100px;
                background: blue;
                margin-top: 50px;
                margin-left: 50px;
            }
        </style>
        <script src="js/jquery-1.12.4.js"></script>
        <script>
            $(function () {
                // 获取事件的坐标
                $(".son").click(function (event) {
                    // 获取相对于事件元素左上角坐标
                    console.log(event.offsetX, event.offsetY);
                    // 获取相对于视口左上角坐标
                    console.log(event.clientX, event.clientY);
                    // 获取相对于页面左上角坐标
                    console.log(event.pageX, event.pageY);
                });
            });
        </script>
    </head>
    <body>
    <div class="father">
        <div class="son"></div>
    </div>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    <br>
    </body>
    </html>
    

  • 七、jQuery 尺寸、位置操作

    7.1 jQuery 尺寸

  • 以上参数为空,则是获取相应值,返回的是数字型。
  • 如果参数为数字,则是修改相应值。
  • 参数可以不必写单位。

<script>
  $(function() {
  // 1. width() / height() 获取设置元素 width和height大小 
  console.log($("div").width());
  // $("div").width(300);

  // 2. innerWidth() / innerHeight()  获取设置元素 width和height + padding 大小 
  console.log($("div").innerWidth());

  // 3. outerWidth()  / outerHeight()  获取设置元素 width和height + padding + border 大小 
  console.log($("div").outerWidth());

  // 4. outerWidth(true) / outerHeight(true) 获取设置 width和height + padding + border + margin
  console.log($("div").outerWidth(true));


})
</script>

7.2 jQuery 位置


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

offset() 设置或获取元素偏移
offset() 方法设置或返回被选元素相对于文档的偏移坐标,跟父级没有关系。

该方法有2个属性 left、top 。

offset().top 用于获取距离文档顶部的距离
offset().left 用于获取距离文档左侧的距离。可以设置元素的偏移:offset({ top: 10, left: 30 });

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>		
		<style>
			*{
				padding:0;
				margin:0;
			}
			.father{
				width: 200px;
				height: 200px;
				background-color: pink;
				margin:50px;				
			}			
			.son{
				width: 100px;
				height: 100px;
				background-color:skyblue;				
			}
		</style>
	</head>
	<body>
		<div class="father">
			<div class="son">				
			</div>
		</div>
		<script src="js/jquery.min.js"></script>
		<script>
		// 1. 获取设置距离文档的位置(偏移) offset
		console.log($(".son").offset());
		console.log($(".son").offset().top);
		
		// $(".son").offset({
		//   top: 200,
		//   left: 200
		// });
		</script>
	</body>
</html>

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

该方法有2个属性 left、top。

position().top 用于获取距离定位父级顶部的距离
position().left 用于获取距离定位父级左侧的距离。该方法只能获取。

.father{
				position: relative;
				。。。		
			}			
			.son{
				position: absolute;
				left:10px;
				top:10px;
				。。。。				
			}
// 2. 获取距离带有定位父级位置(偏移) position   如果没有带有定位的父级,则以文档为准// 这个方法只能获取不能设置偏移console.log($(".son").position());
			console.log($(".son").position().top)//10
			console.log($(".son").position().left)//10
			console.log($(".son").position())//{top: 10, left: 10}
			$(".son").position({
				top: 200,
				left: 200
			});
			console.log($(".son").position())//{top: 10, left: 10}

7.3scrollTop()/scrollLeft()

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

scrollTop() 方法设置或返回被选元素被卷去的头部。

1.不跟参数是获取,参数为不带单位的数字则是设置被卷去的头部。

2.一般写法是$(document).scrollTop()获取,$(document).scrollTop(100)设置

3.如果要动画则使用,因为document文档不能做动画,animate动画必须作用在元素上

$("body, html").stop().animate({
                  scrollTop: 0
                });

案例:带有动画的返回顶部

设置当滚动条滚动到蓝色盒子的顶部对齐页面顶端的时候,出现“返回顶部”按钮,当单击“返回顶部”按钮时,返回页面顶端。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			*{
				padding:0;
				margin:0;
			}
			.back{
				position:fixed;
				width: 50px;
				height: 50px;
				background-color: pink;
				right: 30px;
				bottom:100px;
				display: none;
			}
			.container{
				width: 900px;
				height: 500px;
				background-color: skyblue;
				margin:400px auto;
			}
		</style>
	</head>
	<body>
		<div class="container"></div>
		<div class="back">返回顶部</div>
		
		
		<script src="js/jquery.min.js"></script>
		<script>
			$(function () {
				//文档被卷进的距离,页面已加载直接跳到100的位置
			  $(document).scrollTop(100);
			  // 被卷去的头部 scrollTop()  / 被卷去的左侧 scrollLeft()
			  // 页面滚动事件
			  var boxTop = $(".container").offset().top;//蓝色盒子距离页面顶端距离
			  //每当滚动条滚动的时候就触发window的scroll事件
			  $(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>
	</body>
</html>

————————————————
版权声明:本文参考了下面两篇文章
原文链接:jQuery学习---这一篇就够了_时倾-的博客-CSDN博客原文链接:最全pink老师JavaScript笔记-JQuery 入门 基础部分(同步PPT)_琛一森的博客-CSDN博客_pink老师笔记
————————————————

转载请注明出处或者链接地址:https://www.qianduange.cn//article/6841.html
评论
发布的文章

String转Json的几种方式

2024-05-09 11:05:04

iOS ------ JSONModel源码

2024-05-09 11:05:02

java去除 json 中的 \n, \t, \r

2024-05-09 11:05:57

大家推荐的文章
会员中心 联系我 留言建议 回顶部
复制成功!