Javascript-- jQuery事件篇(2)
jQuery表单事件之blur与focus事件
单处理事件focusin事件与focusout事件,同样用于处理表单焦点的事件还有blur与focus事件
它们之间的本质区别:
是否支持冒泡处理
举个简单的例子
<div> <input type="text" /> </div>
其中input元素可以触发focus()事件
div是input的父元素,当它包含的元素input触发了focus事件时,它就产生了focusin()事件。
focus()在元素本身产生,focusin()在元素包含的元素中产生
blur与focusout也亦是如此
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title></title> <style> .left div, .right div { width: 500px; height: 50px; padding: 5px; margin: 5px; float: left; border: 1px solid #ccc; } .left div { background: #bbffaa; } .right div { background: yellow; } </style> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script> </head> <body> <h4>.focusin与blur</h4> <div class="left"> <div class="aaron"> 点击触发焦点(无反应): <input type="text" /> </div> <div class="aaron1"> 点击触发焦点并冒泡: <input type="text" /> </div> </div> <script type="text/javascript"> $(".aaron").focus(function() { $(this).css('border', '2px solid red') }) $(".aaron1").focusin(function() { $(this).find('input').val('冒泡捕获了focusin事件') }) </script> <h4>.focusout与blur</h4> <div class="right"> <div class="aaron3"> 点击触发失去焦点(无反应): <input type="text" /> </div> <div class="aaron4"> 点击触发失去焦点并冒泡: <input type="text" /> </div> </div> <script type="text/javascript"> $(".aaron3").blur(function() { $(this).css('border', '2px solid red') }) $(".aaron4").focusout(function() { $(this).find('input').val('冒泡捕获了focusout事件') }) </script> </body> </html>
jQuery表单事件之change事件
<input>元素,<textarea>和<select>元素的值都是可以发生改变的,开发者可以通过change事件去监听这些改变的动作
input元素
监听value值的变化,当有改变时,失去焦点后触发change事件。对于单选按钮和复选框,当用户用鼠标做出选择时,该事件立即触发。
select元素
对于下拉选择框,当用户用鼠标作出选择时,该事件立即触发
textarea元素
多行文本输入框,当有改变时,失去焦点后触发change事件
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title></title> <style> .left div, .right div { width: 100%; padding: 5px; margin: 5px; float: left; border: 1px solid #ccc; } .left div { background: #bbffaa; } .right div { background: yellow; } </style> <script src="http://libs.baidu.com/jquery/1.9.1/jquery.js"></script> </head> <body> <h2>input、textarea与select</h2> <div class="left"> <div class="aaron">input: <input class="target1" type="text" value="监听input的改变" /> </div> <div class="aaron1">select: <select class="target2"> <option value="option1" selected="selected">Option 1</option> <option value="option2">Option 2</option> </select> </div> <div class="aaron3">textarea: <textarea class="target2" rows="3" cols="20">多行的文本输入控件</textarea> </div> </div> 输出结果: <div id="result"></div> <script type="text/javascript"> //监听input值的改变 $('.target1').change(function(e) { $("#result").html(e.target.value) }); //监听select: $(".target2").change(function(e) { $("#result").html(e.target.value) }) //监听textarea: $(".target3").change(function(e) { $("#result").html(e.target.value) }) </script> </body> </html>
jQuery表单事件之select事件
当 textarea 或文本类型的 input 元素中的文本被选择时,会发生 select 事件。
这个函数会调用执行绑定到select事件的所有函数,包括浏览器的默认行为。可以通过在某个绑定的函数中返回false来防止触发浏览器的默认行为。
select事件只能用于<input>元素与<textarea>元素
使用上非常简单:
方法一:.select()
触发元素的select事件:
$("input").select();
方法二:$ele.select( handler(eventObject) )
绑定$ele元素,每次$ele元素触发点击操作会执行回调 handler函数
这样可以针对事件的反馈做很多操作了
<input id="test" value="文字选中"></input> $("#test").select(function() { //响应文字选中回调 //this指向 input元素 });
方法三:$ele.select( [eventData ], handler(eventObject) )
使用与方法二一致,不过可以接受一个数据参数,这样的处理是为了解决不同作用域下数据传递的问题
<input id="test" value="文字选中"></input> $("#test").select(11111,function(e) {//响应文字选中回调 //this指向 div元素 //e.date => 11111 传递数据 });
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title></title> <style> .left div, .right div { width: 500px; height: 80px; padding: 5px; margin: 5px; float: left; border: 1px solid #ccc; } .left div { background: #bbffaa; } .right div { background: yellow; } select { height: 100px; } </style> <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script> </head> <body> <h2>input与textarea</h2> <div class="left"> <h4>测试一</h4> <div class="aaron"> 选中文字:input <input type="text" value="慕课网" /> </div> <button id="bt1">触发input元素的select事件</button> <h4>测试二</h4> <div class="aaron"> textarea: <textarea rows="3" cols="20">用鼠标选中文字</textarea> </div> </div> <script type="text/javascript"> //监听input元素中value的选中 //触发元素的select事件 $("input").select(function(e){ alert(e.target.value) }) $("#bt1").click(function(){ $("input").select(); }) //监听textarea元素中value的选中 $('textarea').select(function(e) { alert(e.target.value); }); </script> </body> </html>
jQuery表单事件之submit事件
提交表单是一个最常见的业务需求,比如用户注册,一些信息的输入都是需要表单的提交。同样的有时候开发者需要在表单提交的时候过滤一些的数据、做一些必要的操作(例如:验证表单输入的正确性,如果错误就阻止提交,从新输入)此时可以通过submit事件,监听下提交表单的这个动作
使用上非常简单,与基本事件参数处理保持一致
方法一:$ele.submit()
绑定$ele元素,不带任何参数一般是用来指定触发一个事件,用的比较少
<div id="test">点击触发<div> $("ele").submit(function(){ alert('触发指定事件') }) $("#text").click(function(){ $("ele").submit() //指定触发事件 });
方法二:$ele.submit( handler(eventObject) )
绑定$ele元素,每次$ele元素触发点击操作会执行回调 handler函数
这样可以针对事件的反馈做很多操作了
<form id="target" action="destination.html"> <input type="submit" value="Go" /> </form> $("#target").submit(function() { //绑定提交表单触发 //this指向 from元素 });
方法三:$ele.submit( [eventData ], handler(eventObject) )
使用与方法二一致,不过可以接受一个数据参数,这样的处理是为了解决不同作用域下数据传递的问题
<form id="target" action="destination.html"> <input type="submit" value="Go" /> </form> $("#target").submit(11111,function(data) { //绑定提交表单触发 //data => 1111 //传递的data数据 });
通过在<form>元素上绑定submit事件,开发者可以监听到用户的提交表单的的行为
具体能触发submit事件的行为:
- <input type="submit">
- <input type="image">
- <button type="submit">
- 当某些表单元素获取焦点时,敲击Enter(回车键)
上述这些操作下,都可以截获submit事件。
这里需要特别注意:
form元素是有默认提交表单的行为,如果通过submit处理的话,需要禁止浏览器的这个默认行为 传统的方式是调用事件对象 e.preventDefault() 来处理, jQuery中可以直接在函数中最后结尾return false即可
jQuery处理如下:
$("#target").submit(function(data) { return false; //阻止默认行为,提交表单 });
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> <title></title> <style> .left div, .right div { width: 500px; height: 50px; padding: 5px; margin: 5px; float: left; border: 1px solid #ccc; } .left div { background: #bbffaa; } .right div { background: yellow; } select { height: 100px; } </style> <script src="http://lib.sinaapp.com/js/jquery/1.9.1/jquery-1.9.1.min.js"></script> </head> <body> <h2>submit</h2> <div class="left"> <div class="aaron"> <form id="target1" action="test.html"> 回车键或者点击提交表单: <input type="text" value="输入新的值" /> <input type="submit" value="Go" /> </form> </div> <div class="aaron"> <form id="target2" action="destination.html"> 回车键或者点击提交表单,禁止浏览器默认跳转: <input type="text" value="输入新的值" /> <input type="submit" value="Go" /> </form> </div> </div> <script type="text/javascript"> //回车键或者点击提交表单 $('#target1').submit(function(e) { alert('捕获提交表达动作,不阻止页面跳转') }); //回车键或者点击提交表单,禁止浏览器默认跳转: $('#target2').submit(function() { alert('捕获提交表达动作,阻止页面跳转') return false; }); </script> </body> </html>
jQuery键盘事件之keydown()与keyup()事件
鼠标有mousedown,mouseup之类的事件,这是根据人的手势动作分解的2个触发行为。相对应的键盘也有这类事件,将用户行为分解成2个动作,键盘按下与松手,针对这样的2种动作,jQuery分别提供了对应keydown与keyup方法来监听
keydown事件:
当用户在一个元素上第一次按下键盘上字母键的时候,就会触发它。使用上非常简单,与基本事件参数处理保持一致,这里使用不在重复了,列出使用的方法
//直接绑定事件 $elem.keydown( handler(eventObject) ) //传递参数 $elem.keydown( [eventData ], handler(eventObject) ) //手动触发已绑定的事件 $elem.keydown()
keyup事件:
当用户在一个元素上第一次松手键盘上的键的时候,就会触发它。使用方法与keydown是一致的只是触发的条件是方法的
注意:
- keydown是在键盘按下就会触发
- keyup是在键盘松手就会触发
- 理论上它可以绑定到任何元素,但keydown/keyup事件只是发送到具有焦点的元素上,不同的浏览器中,可获得焦点的元素略有不同,但是表单元素总是能获取焦点,所以对于此事件类型表单元素是最合适的。
jQuery键盘事件之keypress()事件
在input元素上绑定keydown事件会发现一个问题:
每次获取的内容都是之前输入的,当前输入的获取不到
keydown事件触发在文字还没敲进文本框,这时如果在keydown事件中输出文本框中的文本,得到的是触发键盘事件前的文本,而keyup事件触发时整个键盘事件的操作已经完成,获得的是触发键盘事件后的文本
当浏览器捕获键盘输入时,还提供了一个keypress的响应,这个跟keydown是非常相似,这里使用请参考keydown这一节,具体说说不同点
keypress事件与keydown和keyup的主要区别
- 只能捕获单个字符,不能捕获组合键
- 无法响应系统功能键(如delete,backspace)
- 不区分小键盘和主键盘的数字字符
总而言之,
KeyPress主要用来接收字母、数字等ANSI字符,而 KeyDown 和 KeyUP 事件过程可以处理任何不被 KeyPress 识别的击键。诸如:功能键(F1-F12)、编辑键、定位键以及任何这些键和键盘换档键的组合等。