jQuery 模拟操作
1.常用模拟
有时,需要通过模拟用户操作,来达到单击的效果。例如在用户进入页面后,就触发 click 事件,而不需要用户去主动单击。在 jQuery 中,可以使用 trigger() 方法完成模拟操作。例如可以使用下面的代码来触发 id 为 btn 的按钮的 click 事件。
<script type="text/javascript"> $(function(){ $('#btn').bind("click", function(){ $('#test').append("<p>我的绑定函数1</p>"); }).bind("click", function(){ $('#test').append("<p>我的绑定函数2</p>"); }).bind("click", function(){ $('#test').append("<p>我的绑定函数3</p>"); }); $('#btn').trigger("click"); }) </script> <body> <button id="btn">点击我</button> <div id="test"></div> </body>
这样,当页面装载完毕后,就会立刻输出想要的效果,如上图所示。也可以直接用简化写法 click(),来达到同样的效果:
$('#btn').click();
2.触发自定义事件
trigger() 方法不仅能触发浏览器支持的具有相同名称的事件,也可以触发自定义名称的事件。
例如为元素绑定一个 "myClick" 的事件, jQuery 代码如下:
<script type="text/javascript"> $(function(){ $('#btn').bind("myClick", function(){ $('#test').append("<p>我的自定义事件.</p>"); }); $('#btn').click(function(){ $(this).trigger("myClick"); }).trigger("myClick"); }) </script> <body> <button id="btn">点击我</button> <div id="test"></div> </body>
想要触发这个事件,可以使用以下代码来实现:
$('#btn').trigger("myClick");
实现效果如下图所示。
3.传递数据
trigger(type, [data]) 方法有两个参数,第1个参数是要触发的事件类型,第2个参数是要传递给事件处理函数的附加数据,以数组形式传递。通常可以通过传递一个参数给回调函数来区别这次事件是代码触发的还是用户触发的。
下面是一个传递数据的例子。
<script type="text/javascript"> $(function(){ $('#btn').bind("myClick", function(event, message1, message2){ $('#test').append("<p>"+message1 + message2 +"</p>"); }); $('#btn').click(function(){ $(this).trigger("myClick",["我的自定义","事件"]); }).trigger("myClick",["我的自定义","事件"]); }) </script> <body> <button id="btn">点击我</button> <div id="test"></div> </body>
4.执行默认操作
trigger() 方法触发事件后,会执行浏览器默认操作。例如 :
$("input").trigger("focus");
以上代码不仅会触发为 <input> 元素绑定的 focus 事件,也会使 <input> 元素本身得到焦点(这是浏览器的默认操作)。
如果只想触发绑定的 focus 事件,而不想执行浏览器默认操作,可以使用 jQuery 中另一个类似的方法—— triggerHandler() 方法。
$("input").triggerHandler("focus");
该方法会触发 <input> 元素上绑定的特定事件,同时取消浏览器对此事件的默认操作,即文本框只触发绑定的 focus 事件,不会得到焦点。
其他用法
前面已经对 bind() 方法进行了介绍, bind() 方法不仅能为元素绑定浏览器支持的具有相同名称的事件,也可以绑定自定义事件。不仅如此, bind() 方法还能做很多的事情。
1 . 绑定多个事件类型
例如可以为元素一次性绑定多个事件类型。 jQuery 代码如下:
<style> div{ width:100px; height:50px; } .over{ color:red; background:#888; } </style> <script type="text/javascript"> $(function(){ $("div").bind("mouseover mouseout", function(){ $(this).toggleClass("over"); }); }) </script> <body> <div >滑入.</div> </body>
当光标滑入<div>元素时,该元素的 class 切换为“ over ”;当光标滑出<div>元素时,class 切换为先前的值。这段代码等同于下面的代码:
<script type="text/javascript"> $(function(){ $("div").bind("mouseover", function(){ $(this).toggleClass("over"); }).bind("mouseout", function(){ $(this).toggleClass("over"); }); }); </script>
很显然,第1种方式能减少代码量,这就是 jQuery 提倡的 “write less,do more”(写得更少,做得更多)理念。
2.添加事件命名空间,便于管理
例如可以把为元素绑定的多个事件类型用命名空间规范起来, jQuery 代码如下:
<script type="text/javascript"> $(function(){ $("div").bind("click.plugin",function(){ $("body").append("<p>click事件</p>"); }); $("div").bind("mouseover.plugin", function(){ $("body").append("<p>mouseover事件</p>"); }); $("div").bind("dblclick", function(){ $("body").append("<p>dblclick事件</p>"); }); $("button").click(function() { $("div").unbind(".plugin"); }) /* click,mouseover 事件被删除, */ }) </script> <body> <div>test.</div> <button >根据命名空间,删除事件</button> </body>
在所绑定的事件类型后面添加命名空间,这样在删除事件时只需要指定命名空间即可。单击〈button〉元素后,“ plugin” 的命名空间被删除,而不在 “plugin” 的命名空间的 “dbldick” 事件依然存在。
删除多个事件代码也可以写为以下链式代码,但显然上面的方式写得更少。
$("button").click(function() { $("div").unbind("click").unbind("mouseover"); })
3.相同事件名称,不同命名空间执行方法
例如可以为元素绑定相同的事件类型,然后以命名空间的不同按需调用, jQuery 代码如下:
<script type="text/javascript"> $(function(){ $("div").bind("click",function(){ $("body").append("<p>click事件</p>"); }); $("div").bind("click.plugin", function(){ $("body").append("<p>click.plugin事件</p>"); }); $("button").click(function() { $("div").trigger("click!"); // 注意click后面的感叹号 }); }) </script> <body> <div >test.</div> <button >根据命名空间,触发事件</button> </body>
当单击<div>元素后,会同时触发 click 事件和 click.plugin 事件。如果只是单击 <button> 元素,则只触发 click 事件,而不触发 click.plugin 事件。注意, trigger("click!") 后面的感叹号的作用是匹配所有不包含在命名空间中的 click 方法。
如果需要两者都被触发,改为如下代码即可:
$("div").trigger("click"); //去掉click后面的感叹号