记录一次Jquery中 this 关键字使用出现的问题
今天在用Jquery改造之前的JS代码过程中,遇到了一个让我懵逼了三小时的问题。
问题的关键在 this 的使用。在这里与大家分享一下。并且分享一下我做表单提交的检查代码
错误代码如下:
$("form").submit(function () {
return checkName() && checkAge() && checkEmail() && checkQq();
})
// 验证姓名
$('#name').blur(checkName);
function checkName() {
// 验证姓名验证正则
var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d·s]{2,20}$/;
var flag = reg.test($('#name').val());
if( !flag ){
$('#error_name').remove();
$(this).after("<p id='error_name' class='error_msg'>姓名格式不正确 </p>");
} else {
$('#error_name').remove();
}
return flag;
}
分析:
那提交事件执行 checkName 方法时,this指代的是什么呢?我们试着弹一下它:
在代码中添加以下代码:
alert("我是谁?"+this);
$(this).after("<p id='error_name' class='error_msg'>姓名格式不正确 </p>");
在离焦事件触发后,窗口弹出:
而当提交事件触发后,窗口弹出:
至此,问题就真相大白了。在提交事件触发时,监听器代码中 this 对象指代的是 window 对象,程序执行 after()会出异常。导致 return 语句不能执行。 因此解决问题的方法也很明确:修改this。这里我将this改成了'#name'以 id 选择器为 input 标签'造'一个弟弟.
以下是完整代码:
<script>
// JQuery 完成表单检验
$(function () {
// 表单提交函数。检查name&age&email&qq等属性符合正则后方可提交
$("form").submit(function () {
return checkName() && checkAge() && checkEmail() && checkQq();
})
//验证姓名
$('#name').blur(checkName);
function checkName() {
// 验证姓名验证正则
var reg = /^[\u4E00-\u9FA5\uf900-\ufa2d·s]{2,20}$/;
var flag = reg.test($('#name').val());
if( !flag ){
$('#error_name').remove();
$('#name').after("<p id='error_name' class='error_msg'>姓名格式不正确 </p>");
} else {
$('#error_name').remove();
}
return flag;
}
//验证年龄
$('#age').blur(checkAge)
function checkAge() {
// 验证姓名验证正则
var reg = /^\d{1,3}$/;
var flag = reg.test($('#age').val());
if (!flag) {
$('#error_age').remove();
$('#age').after("<p id='error_age' class='error_msg'>年龄格式不正确 </p>");
} else {
$('#error_age').remove();
}
return flag;
}
//验证QQ
$('#qq').blur(checkQq)
function checkQq() {
// 验证姓名验证正则
var reg = /^\d{6,20}$/;
var flag = reg.test($('#qq').val());
if( !flag ){
$('#error_qq').remove();
$('#qq').after("<p id='error_qq' class='error_msg'>qq格式不正确 </p>");
} else {
$('#error_qq').remove();
}
return flag;
}
//验证Email
$('#email').blur(checkEmail)
function checkEmail() {
// 验证验证码正则
var reg = /^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$/;
var flag = reg.test($('#email').val());
if (!flag) {
$('#error_email').remove();
$('#email').after("<p id='error_email' class='error_msg'>邮箱格式不正确 </p>");
} else {
$('#error_email').remove();
}
return flag;
}
});
</script>
记录一次Jquery中 this 关键字使用出现的问题的更多相关文章
- jQuery中防止表单提交两次的方法
遇到过表单提交两次的情况,做个记录: 解决场景:首先是表单验证,其次是防止多次提交表单: jQuery中插件:validate_submitHandler_plugin,具体的可以使用关键字搜索: 使 ...
- JQuery中的工具函数总结
前提引入 前提当然也是要引入Jquery啦... <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js" typ ...
- JavaScript jQuery 中定义数组与操作及jquery数组操作
首先给大家介绍javascript jquery中定义数组与操作的相关知识,具体内容如下所示: 1.认识数组 数组就是某类数据的集合,数据类型可以是整型.字符串.甚至是对象Javascript不支持多 ...
- JQuery中$.each 和$(selector).each()的区别详解
PS:晚上在写页面时,发现了一个问题,$.each 和$(selector).each()有哪些区别?百度搜索关键词,首页显示出来一些前人的经验,总结一下,发上来. 1.$(selector).eac ...
- jquery中的ajax参数说明
本文只作为记录,方便以后查阅. 内容原地址:$.ajax( )方法详解及案例_JQuery_wodi0007的博客_程序员博客网 http://u.cxyblog.com/28/article-aid ...
- 四、jquery中的事件与应用
当用户浏览页面时,浏览器会对页面代码进行解释或编译--这个过程实质上是通过时间来驱动的,即页面在加载时,执行一个Load事件,在这个事件中实现浏览器编译页面代码的过程.时间无论在页面元素本身还是在元素 ...
- jQuery:详解jQuery中的事件(一)
之前用过一些jQuery的动画和特效,但是用到的部分也不超过10%的样子,感觉好浪费啊——当然浪费的不是jQuery,而是Web资源.后来就想深入研究下jQuery的内部机理,读过两遍jQuery源代 ...
- JQuery中each()的使用方法说明
JQuery中each()的使用方法说明 对于jQuery对象,只是把each方法简单的进行了委托:把jQuery对象作为第一个参数传递给jQuery的each方法.换句话说:jQuery提供的eac ...
- jQuery中的map()方法
jQuery中map()方法的使用格式为:$(selector).map(callback(index,domElement)). 将在每一个被选元素上执行map()方法中设置的回调函数,在回调函数中 ...
随机推荐
- 通过sparkstreaming分析url的数据
spark version 1.6.2 scala verson 2.10.6 此代码参考官方例子---- 自定义接收器 import java.io.BufferedReader import or ...
- 什么是常量?变量? if语句介绍
1.python 的历史 2004 年 Django 的产生 phyton2与 python3 的区别 Python2:源码不统一,有重复的代码功能 Python3:源码统一,没有有重复的代码功能 2 ...
- TensorFlow笔记-图片读取
回到上一篇文件的读取分这么几步: # 构造队列 # 1,构造图片文件的队列 file_queue = tf.train.string_input_producer(filelist) # 构造阅读器 ...
- [剑指offer] 10. 旋转数组的最小数字
题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 利用dp[i]保存盖2*i的矩形有多少种办法. 通过 ...
- md文档的书写《二》
对<md文档的书写一>的补充和部分归总 我使用的是Typora,快捷键可能有些片面,没有特殊说明,下文所有快捷键都是Typora编辑器下支持的快捷键,望知晓. 关于标题的书写补充 除了 ( ...
- vue 的基本语法和常用指令
什么是vue.js Vue.js是目前最火的一个前端框架,React是最流行的一个前端框架(React除了开发网站,还可以开发手机App, Vue语法也是可以用于进行手机App开发的,需要借助于Wee ...
- IDEA中使用mybatis逆向工程
如果使用过mybatis的人就会发现,当我们使用mybatis时,我们每次都需要自己手动创建实体类,映射文件(当然你也可以用注释),还有接口来进行使用,这样手动创建非常的繁琐,mybatis考虑到这方 ...
- java多线程调用run和不调用run的区别
当在java程序中创建一个线程的时候,会三种情况: 1,只运行run方法 2,先执行start,再执行run方法 3,只运行start方法 三者的区别如下: 运行方式 区别 只运行run 只运行run ...
- mysql8.0的连接写法
由于mysql8.0的新特新,所以Driver要写成“com.mysql.cj.jdbc.Driver” url:"jdbc:mysql://host_address:3306/db_nam ...
- 让Controller支持对平铺参数执行@Valid数据校验
每篇一句 在金字塔塔尖的是实践,学而不思则罔,思而不学则殆(现在很多编程框架都只是教你碎片化的实践) 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JS ...