一.今天做点击按钮验证邮箱时,遇到以下几个问题:

  (1)点击按钮后,执行if(regExp.test(str)),出现一种奇怪的现象:第一次输入正确邮箱验证通过,第二次输入正确邮箱就返回false,第三次又验证通过....

自己百思不得其解,直接找老大调试。老大用谷歌自带调试工具弄了20分钟,也没找到原因。

后面自己通过百度搜索和360搜索都没搜到,用https://g.ttlsa.com/一搜,就找到了原因。原因是regExp.lastIndex惹的货。原来老大和我因为时间太长,忘记了这个东西,这是正则里面很简单的问题。

只要regExp里面的正则表达式包含g属性(也就是全局属性),那么regExp就会保存上次的lastIndex值。因此就出现:

第一次验证通过后,由于设置了g属性,因此lastIndex值就变成了str的长度。    第二次验证时,直接从lastIndex开始,因此就会返回false。这时lastIndex就会变成0.第三次验证时,又可以验证通过。

解决办法:在if语句里面,执行regExp.lastIndex=0,就可以解决这个问题了。

  (2)在事件委托时,需要判断target是否是I标签,我用的是if(target == $("i")[0])。老大说:你应该通过if($(target).prop("nodeName") == "I")去判断,减少了再去找I元素引起的Dom操作性能问题,然后我问:那要有很多歌I元素呢,他说你可以通过if($(target).prop("nodeName") == "I"&&$(target).hasClass("特有类"))等等这样特有的属性来判断。最后,我问了一句为啥用prop而不用attr,他说,你自己去百度。然后我就去百度了。区别:

  1.DOM 对象属性(property)及 HTML 标签属性(attribute),prop操作property,attr操作attribute。DOM对象属性通过元素.property来取得,和设置。HTML标签属性,通过setAttribute和getAttribute来设置。
  2. HTML元素的内置build-in属性,attribute和property共享数据,attribute更改了会对property造成影响,反之亦然,但是两者的自定义属性是独立的数据,即使name一样,也互不影响,但是IE6、7没有作区分,依然共享自定义属性数据。
  3.并不是所有的attribute与对应的property名字都一致,比如刚才使用的attribute 的class属性,使用property操作的时候应该是这样className。t.className='active2';
  4.类似于input的checked属性等,attribute取得值是HTML文档字面量值,property是取得计算结果(true or false),property改变并不影响attribute字面量,但attribute改变会影响property计算。
    var t=document.getElementsByTagName('input');
     console.log(t.getAttribute('checked'));  //null
     console.log(t.checked);        //false;
     t.setAttribute('checked','checked');
      console.log(t.getAttribute('checked'));    //checked
      console.log(t.checked);      //true
      t.checked=false;
     console.log(t.getAttribute('checked'));    //checked
     console.log(t.checked);          //false
  5. 对于一些和路径相关的属性,两者取得值也不尽相同,但是同样attribute取得是字面量,property取得是计算后的完整路径
    var t=document.getElementsByTagName('a');
console.log(t.getAttribute('href'));//#
console.log(t.href);//file:///C:/Users/bsun/Desktop/ss/anonymous.html#
  在jQuery1.6之前,.attr()方法在获取一些attributes的时候使用了property值,这样会导致一些不一致的行为。在jQuery1.6中,.prop()方法提供了明确的获取property值的方式,这样.attr()方法仅返回attributes。
  selectedIndextagNamenodeNamenodeTypeownerDocumentdefaultChecked, 和defaultSelected应该使用.prop()方法获取/设置值,因为这几个并没有相应的attibute,只有property。
(这就解释了我老大为什么要用prop("nodeName")=="I",来处理了)。
  checkbox的checked属性property是一个布尔值,这就意味着只要checked属性在HTML中表现出来了,那么相应的property就应该是true,即使checked没有值,这点儿对其它布尔类型的属性一样适用。
  var elem = $('<input type="checkbox" checked=null(空字符"") /> ');
  console.log(elem[0].checked); //true(true)   var elem = $('<input type="checkbox" checked=false/> ');
  console.log(elem[0].checked); //true
  
还有一点:checked attribute并不随着checkedbox的状态而改变,但是checked property却跟着变。因此浏览器兼容的判断checkebox是否被选中应该使用property:if ( elem.checked ),if ( $( elem ).prop( "checked" ) ),if ( $( elem ).is( ":checked" ) ),这对其它一些类似于selected、value这样的动态attribute也适用。


二.由于IE8一下浏览器,不支持原生的console,但是有时为了开发测试,会在js文件添加console打印日志,但是上线时,为了在低版本浏览器下不出问题,可以使用
if(!window.console){
  window.console = {
    log:function(){},
    time:function(){},
    timeEnd:function(){}
  };
}

加油!

 
 

工作中遇到的两个问题-正则以及console的更多相关文章

  1. css布局 - 工作中常见的两栏布局案例及分析

    突然想到要整理这么一篇平时工作中相当常见但是我们又很忽视的布局的多种处理方法.临时就在我经常浏览的网站上抓的相对应的截图.(以后看到其他类型的我再补充) 既然截了图,咱们就直接看人家使用的布局方式,毕 ...

  2. 工作的思考十七:工作中容易犯的错误 - Delay

    其实IT是一个很严谨的行业,不管是从代码角度还是从日常的工作分配都是按计划来的. 从今年年初到现在,在我的工作中出现了两次“Delay”,第一次不以为然,虽然上司也找过我谈话,但没意识到问题的严重性. ...

  3. 【python正则】工作中常用的python正则代码

    工作中常用的一些正则代码: 01.用户名正则 import re # 4到16位(字母,数字,下划线,减号)if re.match(r'^[a-zA-Z0-9_-]{4,16}$', "ab ...

  4. linq介绍及工作中应用两例——左联与内联,linq循环方法

    目录 1 linq介绍 1.1 linq产生背景 1.2 linq使用范围 1.3 linq核心程序集 1.4 linq架构图 1.5 linq使用形式对比 1.5.1 linq To Objects ...

  5. 工作中那些提高你效率的神器(第一篇)_Everything

    引言 无论是工作还是科研,我们都希望工作既快又好,然而大多数时候却迷失在繁杂的重复劳动中,久久无法摆脱繁杂的事情. 你是不是曾有这样一种想法:如果我有哆啦A梦的口袋,只要拿出神奇道具就可解当下棘手的问 ...

  6. 运维工作中sed常规操作命令梳理

    sed是一个流编辑器(stream editor),一个非交互式的行编辑器.它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间",接着用sed命令处理缓冲 ...

  7. 教你如何在工作中“偷懒”,python优雅的帮你解决

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...

  8. [工作中的设计模式]解释器模式模式Interpreter

    一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...

  9. [工作中的设计模式]享元模式模式FlyWeight

    一.模式解析 Flyweight在拳击比赛中指最轻量级,即“蝇量级”或“雨量级”,这里选择使用“享元模式”的意译,是因为这样更能反映模式的用意.享元模式是对象的结构模式.享元模式以共享的方式高效地支持 ...

随机推荐

  1. go 算法 查询字符在字符串中的位置

    在utf8字符串判断是否包含指定字符串,并返回下标."北京天安门最美丽" , "天安门"结果:2 解答: import ( "fmt" &q ...

  2. http post Content-type: application/json; charset=utf-8

      The header just denotes what the content is encoded in. It is not necessarily possible to deduce t ...

  3. SimpleReflection

    [SimpleReflection] 取法线的x.y作为reflection-map的uv. Shader "Custom/SimpleReflection" { Properti ...

  4. partial function

    [partial function] functools.partial(func[,*args][, **keywords]) Return a new partial object which w ...

  5. Exception in thread "main" java.lang.UnsatisfiedLinkError:

    [oracle@landor database]$ ./runInstaller 正在启动 Oracle Universal Installer... 检查临时空间: 必须大于 MB. 实际为 MB ...

  6. 21-py3 发邮件

    Python3 SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. p ...

  7. ROS 消息发布器和订阅器Publisher, Subscriber

    博客参考:https://www.2cto.com/kf/201705/639776.html 1.编写发布器节点节点(Node) 是指 ROS 网络中可执行文件.接下来,将会创建一个发布器节点(“t ...

  8. 如何用Python实现常见机器学习算法-4

    四.SVM支持向量机 1.代价函数 在逻辑回归中,我们的代价为: 其中: 如图所示,如果y=1,cost代价函数如图所示 我们想让,即z>>0,这样的话cost代价函数才会趋于最小(这正是 ...

  9. jQuery自定义动画

    $(function(){ $(".btn1").click(function(){ $(','opacity':'toggle'}); }); $(".btn2&quo ...

  10. mysql 开通远程连接

    使用localhost好用,但是改成ip地址后不好用,执行sql语句做如下修改: update user set host = '%' where user = 'root'; flush privi ...