事件绑定在JQuery对象上,所以可以一次绑定多个DOM元素,正如前文所述ready():保证所有DOM元素加载完毕。
JQuery推荐的是使用on()和off(),绑定和解除绑定(对标add/removeEventListener):
$('h1').on('click', function(){
JQuery的off()方法,可以只传一个参数:事件类型,就接触元素上所有该类型事件绑定:
$('h1').off('click');
但飞哥更喜欢其简写方法:click()/ change()/keypress()……(没有on的前缀):
$('a').click(function(event){
event.preventDefault();
$(this).hide();
事件仍然可以模拟触发:click()/select()……
复习:JQuery起手式,#理解#它的含义,当document准备(ready)好了……
PS:其他简写:$().ready() / $()……
$().ready(function () { //省略document $(function () { //省略ready
有时候我们希望事件仅触发一次,传统的做法是在事件触发后diable按钮之类的,
但JQuery为我们提供了一个更优雅的实现:
$('h1').one('click', function(){
$('p') .css('font-weight', '800') .width('200px') .mouseover(function () { $(this).addClass('red'); }) .mouseout(function () { $(this).removeClass('red'); } );
注意:
let $p = $('p'); $p === $p.width(500) //true
$p === $p.parent() //false
引入form表单
JQuery为form表单元素提供了一些简写方式:
$('input[type="text"]') //简写为: $(':text')以及:
$(':submit') //提交按钮 $(':radio') //radio button
$(':radio:checked') $('select>option:checked').text()
$(':disabled')
取值/赋值
$(':text').val() $('textarea').eq(0).val()
$(':radio').val() //第一个(不是)选中的radio的value $(':checkbox:checked').val() //被选中的checkbox的value
$('select').val()
传递不同的参数,判断是否被:
//但是,不能用==,
$('#a').parent()==$('#b').parent()
//而是用is:
$('#a').parent().is($('#b').parent())
$(':radio').eq(1).is(":checked")
$(':submit').is(":disabled")
复习:DOM的“属性”可以用两种方式读写
在浏览器将HTML解析成DOM树的过程中,通常(但又不是全部)都会将其attribute封装成property
JQuery中,对form表单设置选中/禁用/只读等时,建议总是使用prop():
$(':text').attr('disabled', true) //生效 $(':text').prop('disabled', false) //生效 $(':radio').eq(1).prop('checked', true) //生效 $(':radio').eq(0).attr('checked', true) //不能生效!
form表单中JavaScript参与最多的一个功能就像验证,比如:
演示:注册页面的验证
注意:前端没有“安全性”可言,服务器端必须再次独立验证!
后端永远不要相信前端。
@想一想@:那为什么还需要前端验证呢?
jquery.validate.js(以下简称validate)是最流行的、基于jquery的客户端验证类库/插件(后文详述)。
PS:ASP.NET项目内置,直接引入,其他复制粘贴或npm
注意顺序,validate必须啊jquery.js后面。
演示:一个最简单的验证效果
验证的实现由
组成:
validate提供了两种方法设定rule。
这其实就是开发人员需要做的:
在表单元素的html标签上添加属性:
<input type="text" name="username" required />
<input type="password" name="password" required minlength="4" />
<input type="text" name="username" number="true" required max="100" min="0" />
密码:<input type="password" name="password" id="password" /> 确认密码:<input type="password" equalTo="#password" />
validate生效,需要被激活:(演示效果)
$('form').validate();
validate()方法还可以接受一个options参数(对象),其中就可以设定rule:
$('form').validate({ rules: { username: { required: true } } });其中,username是被验证element的name,required是validate内置的method名。上述代码还可以简写为:
rules: { username: "required" }另外,rules中还可以设定多个rule,每个rule中也可以设定多个method,比如:
rules: { username: "required", password: { required: true, minlength: 4 //4被认为是参数param } }
且validate()方法中的设置优先级更高。演示:require:false……
validate()中的option还可以包含:
$('form').validate({ rules: {/*同上*/}, messages: { password: { required: "* 不能为空", minlength: "* 不能少于4个字符" } }, errorClass: "red" });另外,可以全局性的将默认的英文message转化成中文。利用JQuery的插件(extend)机制:
$.extend( $.validator.messages, { required: "必选字段", email: "请输入正确格式的电子邮件", minlength: "长度……" } )
推荐做法,将此文件放入messages_cn.js中,在页面中(jquery.validation.js之后)引入:
<script src="../messages_cn.js" ></script>
我们经常会有这样的需求:某个表单元素在某种特定条件下才需要验证。比如,学习计划,在用户选择了“学习课程”之后才必填。
<select name="courses"> <option value="">-----</option> <option value="front">前端</option>
有以下两种方案:
$('select').change(function(){ $('textarea').prop('disabled', $(this).val() == ""); })
rules: { 'study-plan': { required: function(element){ console.log(element); //element:当前元素 return $('select').val() != ''; }
另,要验证隐藏的元素(不ignore):
$('form').data("validator").settings.ignore = "";
有时候还需要我们动态的添加/删除一些rule,这就需要调用rules()方法:
console.log($('#userName').rules());
$('#userName').rules('add', "required")也可以是object
$('#userName').rules('add', { required: true, minlength: 4, messages:{ minlength: '* 至少4个字符'
$('#userName').rules('remove');
$('#userName').rules('remove', 'required'); $('#userName').rules('remove', 'min max');
$('#userName').removeAttr('required');
另外,以上操作都要在$('form').validate()之后才能有效。
validation类库自带的验证不够用了,比如:输入的值不能比另一个元素中定义的值大(演示:悬赏帮帮币)
就可以使用$.validator.addMethod(name,method,message)添加自定义的验证方法:
其中,参数method是一个回调函数,又可以包含三个参数:
<input type="text" lessThan="#threshold" /></label>(最高<span id="threshold">20000</span>
$.validator.addMethod('lessThan', function (value, element, param) { return +value < parseInt($(param).text()); }, '* 不能够大于预定值');
PS:可以在学习下一章JQuery Ajax之后再继续学习。
演示:用户名不能重复
背后其实是通过Ajax远程(remote)获取验证结果,这就需要使用remote:
rules: { username: { required: true, remote: { url: "/hasName.json", //Ajax请求发送地址 type: "get", //因为演示只能使用GET data: { username: function () { //要传递的数据 return $("#username").val();
演示:/hasName.json应返回true/false,表示验证通过/未通过。
注意:默认每一次我们按键,都会触发Ajax请求,如果我们(因为性能原因)不想这样的话,可以设置:
rules: { //...... }, onkeyup: false,
多快好省!前端后端,线上线下,名师精讲
更多了解 加: