前端攻城狮---jQuery的使用(3)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gaoyouhuang/article/details/80894866

本章节主要讲解节点的相关操作和事件相关知识点。

节点操作

添加节点

append     在被选元素的结尾插入元素

prepend     在被选元素的开头插入元素

after     在被选元素的后面插入元素

before     在被选元素的前面插入元素

我们这里需要区分一下append和after的区别,那么prepend和before同理

    append被添加的对象是一样容器,是一个父亲。

    after被添加的对象是一个同创建的对象是兄弟级别的关系,是同级的。

上诉四个方法是用来将被添加的元素到添加到指定元素后面的,那么元素的创建是怎么样的?


节点的创建

html创建元素     var child = "<p>haha</p>";

jQuery创建元素     $("<p></p>")

dom创建元素     document.createElement("p");

然后我们可以再通过添加方法将被创建的元素添加进去。

如下所

            // dom创建方法
            var box = document.getElementById("box");
            var obj_link = document.createElement("a");
            box.appendChild(obj_link);

            //html创建方法
            $("#box").append('<a href="http://www.sina.com.cn" target="_blank">新浪</a>');

            //jQuery 创建方法
            var $a = $('<a href="http://www.sina.com.cn" target="_blank">新浪</a>');
            $("#box").append($a); 

append/appendTo

append前的参数被添加的元素,后面的参数表示创建需要添加的元素

appendTo同append的效果一样,只不过前面的对象是创建需要添加的元素,后面是被添加的元素

            --->$("<a>asdasd</a>").appendTo($("#box"));


dom与jQuery对象的互转

一个dom对象要转成jQuery对象,只需将对象用括号包裹切前面加$------>¥(dom对象)

jQuery对象转dom,只需直接从jQuery类数组中直接获取即可------->$("#div").get(0)/$("#div")[0]

注意:jQuery是没有innerHTML的属性的


节点操作demo---类似于选课功能


<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
	    select {
	    	height: 200px;
	    	width: 200px;
	    	background-color: skyblue;
	    	font-size: 20px;
	    }
	    .btns {
	    	width: 30px;
	    	display: inline-block;
	    	vertical-align: top;
	    }
	</style>
</head>
<body>
	<h1>可选择课程:</h1>
	<select id="src_courses" multiple>
		<option value="">大学英语</option>
		<option value="">js编程</option>
		<option value="">音乐</option>
		<option value="">美术</option>
		<option value="">舞蹈</option>
		<option value="">php</option>
	</select>
	<div class="btns">
		 <button>>></button>
		 <button><<</button>
		 <button>></button>
		 <button><</button>
	</div>
	<select name="" id="tar_courses" multiple></select>
	<script type="text/javascript" src="jquery-1.12.4.js"></script>
	<script type="text/javascript">
	   $(function() {
	   	   // 全部右移
	   	   $(".btns button:eq(0)").click(function() {
                $("#tar_courses").append($("#src_courses option"));
	   	   });
           
           // 全部左移 
	   	   $(".btns button:eq(1)").click(function() {
	   	   	   $("#src_courses").append($("#tar_courses option"));
	   	   });
           
           // 选中右移 
	   	   $(".btns button:eq(2)").click(function() {
	   	   	   $("#tar_courses").append($('#src_courses  option:selected'));
	   	   });
            
           // 选择左移 
	   	   $(".btns button:eq(3)").click(function() {
	   	   	   $("#src_courses").append($('#tar_courses  option:selected'));
	   	   });
	   });
	</script>
</body>
</html>
节点的删除
  1. 通过html清空元素的内容
  2. empty方法
  3. remove方法

我们先来看看第一个方法

在jQuery(2)中我们对html()方法进行讲解,这么把我们先来一个demo看看实际效果

	<div>
		<p>段落1111</p>
		<p>段落2222</p>
	</div>
	<script type="text/javascript" src="jquery-1.12.4.js"></script>
	<script type="text/javascript">
	   $(function() {
            var $value =  $("div").html();  
          	console.log($value); </script>
我们可以看到日志里输出的是内容看下图

 其实这是一串字符串,那么同理我们若是要清空div里面的所有的元素是不是穿个空字符串就可以了。

$("div").html("");就达到了清空div里面元素的效果

方法二

empty表示移除所有子元素

使用方法         $("div").empty();

方法三

移除该元素,并且移除该元素下所有的子元素。

$("div").remove();   会把div 两个p标签都移除了。

节点复制

clone  表示克隆

clone() clone(false) clone(true)

前面两个表示不克隆事件,最有一个会克隆事件,我们来看看具体的使用。

            $("div").append($(".outer").clone(false));

结合节点的添删,再写一个demo


主要流程就是 通过jQuery创建元素的方法,去创建元素,在父元素的最前面去添加元素,用到prepend,然后给删除添加点击事件,去remove因为要连同自己也删掉

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
	    * {
	    	margin: 0;
	    	padding: 0;
	    }

	    ul {
	    	list-style: none;
	    }

	    .wrap {
	    	width: 600px;
            margin: 100px auto;
            padding: 20px;
            border: 1px solid #000;
	    }

	    textarea {
	    	width: 450px;
	    	height: 160px;
	    	outline: none;
	    	resize: none;
	    }

	    ul {
	    	width: 450px;
	    }

	    ul li {
	    	border-bottom: 1px dashed #ccc;
	    	line-height: 25px; 
	    }
	    .btn_dele{
	    	float: right;
	    }
	</style>
</head>
<body>
	<div id="weibo" class="wrap">
		<h2>微博发布</h2>
		<textarea name="" id="txt" cols="30" rows="10">
		</textarea>
		<button>发布</button>
		<ul id="content">
		</ul>
	</div>
	<script type="text/javascript" src="jquery-1.12.4.js"></script>
	<script type="text/javascript">
	    $(function() {
            $("button").click(function() {
            	if($("#txt").val().trim().length==0){
            		return;
            	}
            	var add_li = $('<li><span></span><button class="btn_dele">删除</button></li>');
            	add_li.children("span").text($("#txt").val().trim());
            	$("#content").prepend(add_li);
            	$("#txt").val("");
            	add_li.children("button").click(function(){
            		add_li.remove();
            	});
            });    
	    });
	</script>
</body>
</html>

width/height方法

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
	   div {
	   	   width: 200px;
	   	   height: 200px;
	   	   padding: 15px;
	   	   margin: 10px;
	   	   background-color: pink;
	   	   border: 10px dashed blue;
	   }
	</style>
</head>
<body>
	<div></div>
	<script type="text/javascript" src="jquery-1.12.4.js"></script>
	<script type="text/javascript">
	   $(function() {
           alert($("div").css("width")); //获取宽度 200px
           alert($("div").width()); // 200 内容宽 直接获取数字
           alert($("div").innerWidth()); // 230 width+左右padding
           alert($("div").outerWidth()); // 250 width+左右padding+左右border
           alert($("div").outerWidth(true)); // 270 width+左右padding+左右border + 左右margin
           alert($(window).width());   
           alert($(window).height());
           // 动态获取页面可视区域宽度和高度
           $(window).resize(function() {
           	    /*document.write($(window).width());   
                document.write($(window).height());*/
                alert("ok");
           });
	   });
	</script>;   
</body>
</html>

重点可以看看innerWidth()和outerWidth()    

        其实innerWidth=clientWidth     outerWidth() = offsetWidth

        当outerWidth(true)为true的时候,是需要计算margin

window的resize方法可以动态的获取浏览器大小的变化,怎么说呢?就是比如吧浏览器放大缩小,都会触发该监听。

scrollTop()/scrollLeft()

scrollTop表示页面滚动的距离,当文档高度大于窗口高度,就会显示滚动条,就能进行上下滚动。

文档高度$(document).height()      $(window).hegiht()

    什么是文档高度?就是整个页面的实际高度

    什么是窗口高度?就是我们看的到的高度

使用文档高度-窗口高度=我们看不到/可以滚动的高度

scrollLeft同理。

offset()/position()

offset 表示相对文档的偏移

position 表示相对于最近且有定位的父亲的偏移

返回的数据是一个对象

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
	<style type="text/css">
	   * {
	   	  padding: 0;
	   	  margin: 0;
	   }

	   .fa {
	   	   width: 380px;
	   	   height: 380px;
	   	   background-color: green;
	   	   margin: 100px;
	   	   position: relative; 
	   }

	   .son {
	   	  width: 200px;
	   	  height: 200px;
	   	  background-color: skyblue;
	   	  position: absolute;
	   	  top: 80px;
	   	  left: 80px;
	   }
	</style>
</head>
<body>
	<div class="fa">
		<div class="son"></div>
	</div>
	<script type="text/javascript" src="jquery-1.12.4.js"></script>
	<script type="text/javascript">
         $(function() {
         	  //offset() 方法返回或设置匹配元素相对于文档的偏移(位置)。
         	  console.log($(".son").offset());// {top:180,left:180}
              // 获取元素相对于有定位的父元素的位置
         	  console.log($(".son").position()); // {top:80,left:80}
         });
	</script>
</body>
</html>

jQuery的事件机制

事件机制的发展历程     简单的事件绑定--->bind绑定---->delegate事件绑定----->on事件绑定(推荐)

简单的事件绑定

就是我们常用的    $(".demo").click(function(){ 单击事件 })      $(".demo").mouseenter(function(){ 鼠标移入})      $(".demo").mouseleave(function(){ 鼠标移走 })  

缺点:确定就是同一个对象,同一个事件不能绑定多个,否则后面的点击事件会把前面的覆盖掉。

          不支持动态添加元素的事件绑定

需要用元素的js,jQuery已经帮我处理好了

 document.getElementsByTagName("span")[0].onclick = function() {
            	alert("1");
            }

 document.getElementsByTagName("span")[0].onclick = function() {
            	alert("2");
            }
最终的弹框的内容是2,不会出现两次弹框。
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="box">
		<div>
			<span>abcdef</span>
			<p>00000</p>
			<p>zzzzzzzzzz</p>
			<p>ssssssssss</p>
			<p>tttttttttt</p>
		</div>
	</div>
	<button>点我在div里创建一个新的p元素</button>
	<script type="text/javascript" src="jquery-1.12.4.js"></script>
	<script type="text/javascript">
         $(function() {
            $("button").click(function() {
            	$("div").append("<p>我是新增的p元素</p>");
            });
            $("p").click(function() {
                 alert("I am happy");
            }); 
         });
    </script>   
</body>
</html>
新添加的元素,没有点击事件
bind绑定

可以注册同事注册多个不同的事件,多个不同的事件可以进行同样的处理,也可以进行不同的处理。

            //一次注册多个不同的事件,同样的处理
             $("span").bind("click mouseenter",function() {
            	 alert("success");
            }); 

              //bind一次可以注册多个不同的事件,不同的处理
            $("span").bind({
            	click:function() {
                   alert("right");
            	},
            	mouseenter:function() {
                   alert("wrong");
            	}
            });
缺点:不支持动态添加元素的事件绑定
delegate绑定

这是一个委托代理机制,可以支持动态添加的元素的事件添加,但是必须要这些元素的父亲注册委托的事件。

下面看看一个demo

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Document</title>
</head>
<body>
	<div id="box">
		<div>
			<span>abcdef</span>
			<p>00000</p>
			<p>zzzzzzzzzz</p>
			<p>ssssssssss</p>
			<p>tttttttttt</p>
		</div>
	</div>
	<button>点我在div里创建一个新的p元素</button>
	<script type="text/javascript" src="jquery-1.12.4.js"></script>
	<script type="text/javascript">
         $(function() {
          
            $("button").click(function() {
            	$("div").append("<p>我是新增的p元素</p>");
            });
            // 给父亲注册委托事件 
            // 第一个参数 selector 事件最终由谁来执行
            // 第二个参数 事件的类型
            // 第三个参数  事件处理函数
            // 优点 支持动态创建的元素也能有事件
            // 缺点 必须注册委托事件
            $("#box").delegate("p","click",function() {
            	 alert("haha");
            	 console.log(this);
            });
    
         });
    </script>   
</body>
</html>
如上面的demo,p的点击事件委托给了父亲去注册。

缺点:必须要注册委托事件

on绑定

on方法是jQuery1.7之后出来的,on可以说是结合了之前绑定方式的有点,它既有委托代理模式,又可以对动态添加的元素添加事件。这面我们来看看这三种事件触发的先后顺序。

	   $("p").on("click",function() {//自己直接注册事件(1)
	    	    alert("嘿嘿");
	   }) 
	   $("div").on("click",function() {//祖先元素注册事件(2)
	   	  alert("呵呵");
	   });
           // 委托代理 给自己注册事件(3)
           $("div").on("click","p",function() {
               alert("哈哈");
           });

显示的弹框内容是  嘿嘿-----哈哈----呵呵

所以我们可以得出一个结论事件响应的优先级

    自己直接注册事件>委托代理 给自己注册事件>祖先元素注册事件

若想给动态添加的元素添加事件,那必须要通过注册委托代理的方式去给动态添加的元素注册事件,我们再上诉demo上再做修改

   	   $("p").on("click",function() {
	   	    alert("嘿嘿");
	   });	   	   
	   $("div").on("click",function() {
	   	  alert("呵呵");
	   }); 
           // 给div注册  真正执行由子元素执行
           $("div").on("click","p",function() {
               alert("哈哈");
           });
           // 给按钮直接注册单击事件
           $("button").on("click",function() {
           	    $("div").append("<p>我是动态生成的p</p>");
           });

我们去点击动态添加的p,看看触发了哪些点击事件,显示了哪些弹框?

结果是哈哈------呵呵

也就是说只有通过委托代理注册的方法,才能给动态添加的元素注册点击事件。

那么想要的顺序是

    动态添加的元素先执行委托代理给自己注册的事件---再去执行父亲的事件

事件解绑

unbind()表示解绑bind对应的事件

        $(selector).unbind() 表示解绑全部事件

        $(selector).unbind("click") 表示解绑click事件

undelegate()表示解绑delegate对应的事件

        $(selector).undelegate();表示解绑所有事件

        $(selector).undelegate("click");表示解绑click事件

off() 表示解绑on对应的事件

        $(selector).off(); 表示解绑所有的事件

        $(selector).off("click"); 表示解绑click事件

事件触发

如果说现在有这么个需求,单击一个元素后触发另一个点击元素的点击事件。

          $("p").on("click",function() {
            	alert("ok");
            });
	   });

	   $("button").on("click",function() {
	   	    // 触发p元素的单击事件
	   	    $("p").click();//方法1
	   	    $("p").trigger('click');//方法2
	   });
一种就通过直接触发事件如方法1,另一种通过trigger去触发指定的事件。


jQuery的节点,事件绑定等知识点已经讲完,接下来会来讲js对象等高级方法,如有表达错的请谅解,并请提出指出,且修改错误,望能共同进步。




猜你喜欢

转载自blog.csdn.net/gaoyouhuang/article/details/80894866
今日推荐