@
目录语法:
element.事件(function(){ //事件处理程序 })
可以注册多个事件,不用担心事件覆盖等问题。
普通的事件注册不能做事件委托,且无法实现事件解绑,需要借助其他方法(暂未知,待补充)。
其他事件和原生基本一致。
比如mouseover、 mouseout、 blur、 focus、 change、 keydown、 keyup、 resize、 scroll
等
演示代码
<body> <div></div> <script> $(function() { $("div").click(function() { $(this).css("background", "purple"); }); $("div").mouseenter(function() { $(this).css("background", "skyblue"); }); }) </script> </body>
因为普通注册事件方法的不足,jQuery又创建了多个新的事件绑定方法bind() / live() / delegate() / on()
等,其中最好用的是: on()
on()
方法在匹配元素上绑定一个或多个事件的事件处理函数
语法:
element.on(events,[selector],fn)
events
:一个或多个用空格分隔的事件类型,如"click"或"keydown" 。selector
: 元素的子元素选择器 "selector"
。fn
:回调函数 即绑定在元素身上的侦听函数。可以绑定多个事件,多个不同的相对应处理事件处理程序,事件与侦听函数包装成一个对象作为参数传进on(),如下:
$("div").on({ mouseover: function(){ //事件处理程序 }, mouseout: function(){ //事件处理程序 }, click: function(){ //事件处理程序 } });
如果事件处理程序相同,可以绑定多个事件并共用一个侦听函数。如下:
$("div").on("mouseover mouseout", function() { $(this).toggleClass("current"); });
因为 on() 方法支持事件冒泡,所以可以事件委派操作 。
事件委派的定义就是,把原来加给子元素身上的事件绑定在父元素身上,就是把事件委派给父元素。
可以通过指定子元素来触发父元素事件,且一旦指定了这个子元素,就只能是这个子元素来促发,其他子元素无法触发父元素的事件。 如果没有指定,子元素们都可触发父元素事件。
<ul> <li class="one">1</li> <li class="two">2</li> <li class="three">3</li> </ul> <script> /* $("ul").on("click",function() { alert("hello world!"); }); 点击 1 , 2, 3都会执行监听函数 */ $("ul").on("click", "li", function() { alert("hello world!"); }); //点击 1 , 2, 3都会执行监听函数 /* $("ul").on("click", ".one", function() { alert("hello world!"); }); 只有点击1 才会执行监听函数 */ </script>
在此之前有bind(), live() delegate()
等方法来处理事件绑定或者事件委派,最新版本的请用on
替代他们。
动态创建的元素, $("selector").click()
没有办法绑定事件, on()
可以给动态生成的元素绑定事件
<div></div> <script> /* 动态元素不可直接绑定事件 $("div p").click(function(){ alert("无法给子元素p绑定事件") }) $("div p").on("click",function(){ //... }) */ $("div").on("click","p", function(){ alert("俺可以给动态生成的元素绑定事件") }); $("div").append($("<p>我是动态创建的p</p>")); </script>
用one() 绑定的事件被触发后指挥执行一次监听函数,下次触发不再执行。
$(selector).one("click",function(){ //事件处理程序 })
事件解绑:当某个事件上面的逻辑,在特定需求下不需要的时候,可以把该事件上的逻辑移除,这个过程我们称为事件解绑。
jQuery 提供了多种事件解绑方法:die() / undelegate() / off()
等
off() 方法可以移除通过 on() 方法添加的事件处理程序
解绑元素所有事件处理程序
$(selector).off(); //eg: $("p").off();
只解绑元素上面的指定的事件
$(selector).off(event); //eg: $("p").off("click");
解绑事件委托
$(selector).off(event, selector) //eg: $("ul").off("click", "li");
在有些情景下,需要自动触发事件,有如下三种方式,都为一次性的
$(selector).event(); // 第一种简写形式 //eg: $("div").on("click", function() { alert(11); }); $("div").click();
$(selector).trigger(event) // 第二种自动触发模式 //eg: $("div").on("click", function() { alert(11); }); $("div").trigger("click");
$(selector).triggerHandler(event) // 第三种自动触发模式 //eg: $("input").on("focus", function() { $(this).val("表单控件光标会闪烁"); }); $("input").triggerHandler("focus");
triggerHandler
模式不会触发元素的默认行为,这是和前面两种的区别。
jQuery 对DOM中的事件对象 event 进行了封装,兼容性更好,获取更方便,使用变化不大。事件被触发,就会有事件对象的产生。
$(selector).on(events,[selector],function(event) {})
注意:jQuery中的 event 对象使用,可以借鉴 API 和 DOM 中的 event 。