欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-28 22:01:28
...

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

节点操作

添加节点

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---类似于选课功能

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

<!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>
我们可以看到日志里输出的是内容看下图

前端攻城狮---jQuery的使用(3) 其实这是一串字符串,那么同理我们若是要清空div里面的所有的元素是不是穿个空字符串就可以了。

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

方法二

empty表示移除所有子元素

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

方法三

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

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

节点复制

clone  表示克隆

clone() clone(false) clone(true)

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

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

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

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

主要流程就是 通过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的使用(3)

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对象等高级方法,如有表达错的请谅解,并请提出指出,且修改错误,望能共同进步。