JS学习二十:JQuery中的事件
一、页面加载事件
原生JS的页面加载事件:window.onload = function
JQ的页面加载事件:$(document).ready(function)
示例:
<p>p...</p> <script type="text/javascript" charset="UTF-8"> // 原生 // window.onload = function(){ // alert("页面加载成功"); // } $(document).ready(function(){ alert("页面加载成功123"); }) // // 简写 // $().ready(function() { // alter("xyz") // }) // // 简写 // $(function() { // alert("abc") // }) </script>
两者的区别:
在一个文档完全下载到浏览器时(包括所有关联的文件,例如图片、横幅等),就会响应window.onload()方法。
在所有的DOM元素完全就绪以后,但不包括关联文件,就会响应$(document).ready(function)方法。
问题:
所以,在使用$(document).ready(function)要注意:由于响应此方法时,关联文件未加载,如果响应方法使用到关联文件,则会失效。
解决办法:可以使用JQ中,另一个关于页面加载的方法:$(window).load(function)方法。
load()方法,会在元素的onload事件中绑定一个处理函数。
如果这个处理函数绑定到window对象上,就会在所有内容,包括关联文件都加载完后触发。
如果绑定在元素上,则会在元素的内容加载完后触发。
$(window).load(function)方法等同于window.onload(function)
二、JQ中的事件:
说明:fn参数,表示一个函数,事件处理程序就写在这个函数中。
三、事件绑定
原生JS中的事件绑定,有四种方式。
JQ绑定事件,有四个方法:bind,delegate,on,live
<button id="btn">添加一个p标签</button> <div> <p>p1.....</p> <p>p2.....</p> <p>p3.....</p> <p>p4.....</p> </div> <script type="text/javascript"> $(document).ready(function() { // JQ绑定事件方式一:bind // 示例:给div下的所有p标签绑定事件 // $("div p").bind("click", function() { // console.log($(this).text()) // }) // bind方法的问题:1.隐式迭代,对给定元素中所有元素,迭代的方式,给每一个指定的元素绑定事件.会绑定多次. // 问题2: 对于尚未存储的标签,无法绑定事件.如下面新增的标签,无法绑定 // $("div").append("<p>new p........</p>") // 所以bind适合于对id属性绑定事件,因为id属性是唯一的,不会出现以上两个问题. // JQ绑定事件方式二:delegate // delegate可以解决bind中的两个问题:只会绑定一次事件,同时尚未存在标签在后来新增后,事件也会传递到此标签上. // 这种方式,叫做事件委托.示例事件绑定在div上,事件会像冒泡一样,传递到指定的标签上. // $("div").delegate("p", "click", function() { // console.log($(this).text()) // }) // $("div").append("<p>new p........</p>") // delegate的缺点: 如果绑定的标签,层次很深,会消耗性能. // JQ绑定事件方式三:on,最常用 // on对以上两种方式的统一,既可像bind一样绑定多个,又类似于delegate方式, 绑定在一个元素上,通过冒泡传递绑定的事件 $("div").on("click", "p", function() { console.log($(this).text()) }) $("div").append("<p>new p........</p>") // JQ绑定事件方式四:live,很少使用 }) </script>
delegate,on能适用的事件,必须是冒泡事件,才可有效绑定。如click,mousedown,mouseup,keydown,keypress,keymove
总结 :
- 选择器匹配到的元素比较多的时侯,不要使用bind(),它迭代绑定事件
- 用id选择器时,可以用bind()
- 需要给动态添加的元素绑定时,用delegate()或on()
- 用delegate()和on()方法,dom树不要太深
- 语法区别:deletgate(后代标签,事件,函数),on(事件,后代标签,函数)
- 尽量使用on()
- 可见,一般能使用到的是on()或bind()方法。
四、移除绑定事件
移除绑定:unbind,undelegate,off
<div> <p>p1.....</p> <p>p2.....</p> <p>p3.....</p> <p>p4.....</p> </div> <script type="text/javascript"> $(document).ready(function() { $("div p").bind("click", function() { console.log($(this).text()) }) $("div p").unbind("click") $("div").delegate("p", "click", function() { console.log($(this).text()) }) $("div").undelegate("p", "click") $("div").on("click", "p", function() { console.log($(this).text()) }) $("div").off("click", "p") }) </script>
五、一次性事件
还有一种绑定方式:one,一次性事件。事件发生一次以后,就不再起作用。较少使用
<button id="btn2">按钮</button> <script type="text/javascript"> $(document).ready(function() { $("#btn2").one("click", function() { console.log($(this).text()) }) }) </script>
六、模拟用户操作触发事件
trigger(事件),triggerHandle(事件)
这两个方法,实现的效果基本一样。唯一区别:
triggerHandle(),不会导致浏览器同名的默认行为被执行。
trigger(),会导致浏览顺同名的默认行为的执行。可以通过return false,也可以阻止默认行为被执行。
<button id="btn">添加一个p标签</button> <button id="btn2">按钮</button> <script type="text/javascript"> // tigger模拟事件发生 $("#btn").bind("click",function() { console.log("************") }).trigger("click") // 传递参数 $("#btn2").bind("click",function(e, msg1, msg2) { console.log(msg1 + "************" + msg2) }).trigger("click", ["args1", "args2"]) </script> </body>
七、模拟鼠标悬念事件
hover(移入时的函数,移出时的函数)
<button id="btn2">按钮</button> <script type="text/javascript"> $(document).ready(function(){ $("#btn2").hover(function() { console.log("移入") }, function() { console.log("移出") }) }) // 同下面的代码功能一样 // $("#btn2").bind("mouseover", function() { // console.log("移入") // }) // $("#btn2").bind("mouseover", function() { // console.log("移出") // }) </script>
八、事件对象
查看事件类型:e.type
触发事件的DOM元素:e.target
返回与事件相关联的DOM元素,e.relateTarget,如移入时,从哪个DOM元素移入的;移出时,移出到了哪个DOM元素。
九、事件冒泡、阻止默认行为
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <script src="js/jquery-3.3.1.min.js" type="text/javascript" charset="UTF-8"></script> <style type="text/css"> #box { width: 100px; height: 100px; background-color: red; } </style> </head> <body style="width: 500px; height: 500px;"> <div id="box"></div> <input type="text" name="in" id="put"/> <a href="red.html" id="link">跳转到红页面</a> <script type="text/javascript"> $(document).ready(function(){ $("body").bind("click", function() { $(this).css("background-color", "blue") }) $("#box").bind("click", function(e) { $(this).css("background-color", "yellow") // 阻止冒泡方式一: e.stopPropagation() // 阻止冒泡方式二: // return false,除了可以阻止冒泡,还可以阻止默认行为· return false }) $("input").bind("click", function(e) { e.stopPropagation() }) $("#link").bind("click", function(e) { // 阻止冒泡 e.stopPropagation() var d = window.confirm("网站有病毒!确认继续访问?") if ( d == false) { // 阻止默认行为:跳转页面 e.preventDefault() // return false } }) }) </script> </body> </html>
posted on 2018-12-09 14:41 myworldworld 阅读(215) 评论(0) 收藏 举报