AddEventListener()之中有三个参数,分别是(1)事件的名称(注:不要加on,例:click才是点击事件的名称)(2)需要执行的function(){} (3)布尔类型(false表示的是事件冒泡开启,true表示的是事件捕获开启)

EventTarget.prototype.addEventListener = function(type,listener,useCapture) {};
/**
@param {string} type
@param {EventListener|Function} listener
@param {boolean} [useCapture = false]
*/

封装添加事件的兼容性:

function addEventListener(element, type, listener) {
//能力检测
if(element.addEventListener) { //谷歌、火狐支持
element.addEventListener(type, listener, false);
}else if(element.attachEvent) { //ie浏览器
element.attachEvent("on" + type, listener);
}else{ // element.onclick=function(){}
element["on" + type] = listener;
}
}

封装移出事件的兼容性:

function removeEventListener(element,type,listener){
if(element.removeEventListener){
element.removeEventListener(type,listener,false);//谷歌火狐之中移除事件的方式
}else if(element.detachEvent){
element.detachEvent("on"+type,listener);//ie中移除事件的方式
}else{
element["on"+type]=null;//element.onclick=function(){}移除事件的方式,此处为何不能写成element.+”on”+type的形式,因为type是一个变量,对象的属性是变量时只能写在[]之中。
}
}

事件的添加与移除

添加:

<input type="button" value="按钮" id="btn"/>
<script>
var btn=document.getElementById("btn");
function test(){
alert("233");
}
//使用addEventListener添加一个点击事件
btn.addEventListener("click",test,false);
</script>

添加并移除:

<script>
var btn=document.getElementById("btn");
// //移除事件:当test命名函数被调用三次之后,移除点击事件
var num=0;
function test(){
num++;
alert("233");
if(num==3){
btn.removeEventListener("click",test,false);
} }
btn.addEventListener("click",test,false);
</script>

补充:我们在注册事件的时候需要考虑到注册事件的性能问题:

举个例子:给下面每一个li注册一个点击事件:

<ul id=”ul”>

<li>123</li>

<li>234</li>

<li>456</li>

<li>567</li>

</ul>

var ul = document.getElementById("ul");
//第一种方式
for(var i = 0, length = ul.children.length; i < length; i++) {
var li = ul.children[i]; li.onclick = function(){//此处可以看出每次都要注册运行一个匿名函数
console.log(this.innerText); };
} //第二种方式
for(var i = 0, length = ul.children.length; i < length; i++) {
var li = ul.children[i]; li.onclick = test; //而运用命名函数的方式则能大大提高程序的运行 //效率
} function test() {
console.log(this.innerText);
}

事件冒泡:

---事件委托(好处):举个例子吧我们现在的要求还是给每个li注册一个点击事件,此时我们可能会想到要给每一个li遍历注册事件,但是我们还有一种更加简单的方法那就是通过事件冒泡的方式委托给它的ul标签,对它进行事件注册

<ul id=”ul”>

<li>123</li>

<li>234</li>

<li>456</li>

<li>567</li>

</ul>

 var ul = document.getElementById("ul");
ul.addEventListener("click", function (e) {
alert(e.target.innerText);//e.target表示的是当前触//发事件的元素
}, false);

当然有好处便有坏处,举个例子我们在页面之中需要通过一个a标签来点击弹出一个窗口,假设a标签的id是link,窗口盒子的的id为box,  $$(“”)表示获取页面元素的id

$$(“link”).onclick=function(e){

$$(“box”).style.display=”block”;

e.stopPropagation();

}

这样点击a标签之后,盒子就显示出来了,但是我们还需要在单击页面空白之处隐藏盒子。因此就有了

Document.onclick=function(){

$$(“box”).style.display=”none”;}

那么问题就来了:我们会发现第一段之中的显示盒子代码不起效果,为什么呢?原因就在于事件冒泡,a标签处于document之中,第二段代码让盒子不显示,覆盖了a标签显示功能的执行。解决办法就是在第一段代码之中加入e.stopPropagation();以阻止事件冒泡

事件捕获:在文章开头我们讲到AddEventListener()之中有三个参数,其中最后一个参数是布尔类型的true/false.

在这里代表事件捕获的就是true.它与事件冒泡的顺序正好相反,若是发生盒子嵌套的话冒泡是由内而外显示,捕获是由外向内显示元素。

e.target的相关属性:

Box3是蓝色盒子,box2是绿色盒子,box1是红色盒子

上图console之中显示的为单机box3盒子时所触发的。

var elements=[box1,box2,box3];
for(var i= 0,length=elements.length;i<length;i++){
var element=elements[i];
// element.addEventListener("click",test,false);
element.addEventListener("mousedown",test,false);
}
function test(e){
e=e||window.event;
console.log("target:"+e.target.id);//target始终是点击的元素
console.log("currentTarget:"+ e.currentTarget.id);//currentTarget是冒泡的的元素
console.log("this:"+this.id);//与currentTarget保持一样
}
//除了在冒泡事件中,trget与currentTarget显示的内容是一样的。

正则表达式:

一、webstorm中按“ctrl+F”键打开,勾选Regex(正则表达式),match case(匹配大小写)

按“ctrl+R” 替换

//正则表达式的作用

1.匹配

2.获取

3.替换

//

二、常用的正则表达式规则

//2.1 元字符

//.   匹配任何单个字符,除了换行

//\d  数字   \D 非数字

//\w  数字 字母 下划线   \W 非

//\s  空白   \S 非空白

//\n  换行

//\t  制表符

//2.2  范围-- 匹配的是一个字符  ABCD

// [0-9]  [0123]  [a-z]  [A-Z]  匹配的是一个字符

//2.3  | 或者   \w|\d

//2.4  量词  -只修饰一个字符

//a+  1个或多个a

//a?  1个或0个a

//a*  0个或多个a

//var str = "aabbccddeeff";

//var regRex = /aa*b/;

//console.log(regRex.test(str));

//2.4  量词  -只修饰一个字符

//a{x}  x个n

//a{x,} 至少x个a

//a{x,y}  x-y个a

//2.5 开始结束

//^a  以a开始

//a$  以a结束

//2.6 () 看成一个整体

//2.7 匹配汉字

// [\u4e00-\u9fa5]

//    var str = "中华人民共和国";

//    var regRex = /[\u4e00-\u9fa5]{7}/;

//    console.log(regRex.test(str));

//2.8 参数

//i  忽略大小写

//g  全局匹配

在javascript之中创建正则表达式对象的两种写法:

下面这段代码也是利用正则表达式进行字符串的匹配判断:

输出的内容为true/false

<script>
// 第一种写法
// var regularExpression=new RegExp("\\d+");
// var str="abc";
// console.log(regularExpression.test(str));
//第二种写法
var regularExpression=/a?/;
var str="abc";
console.log(regularExpression.test(str));
</script>

在javascript之中正则表达式的提取:

举个例子:

var str="张三: 1000,李四:5000,王五:8000。";
var reg=/\d+/g;
var arr=str.match(reg);
console.log(arr);

将提取到的数字转换成数组的形式输出,/  /g====g表示的是global全局。

match() 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。

stringObject.match(searchvalue)

stringObject.match(regexp)

参数

描述

searchvalue

必需。规定要检索的字符串值。

regexp

必需。规定要匹配的模式的 RegExp 对象。如果该参数不是 RegExp 对象,则需要首先把它传递给 RegExp 构造函数,将其转换为 RegExp 对象。

<

js-事件、正则表达式的更多相关文章

  1. DIV+CSS+JS基础+正则表达式

    ...............HTML系列....................        DIV元素是用来为HTML文档内大块(block-level)的内容提供结构和背景的元素.DIV的起始 ...

  2. js常用正则表达式2

    字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界. -或- 对 ...

  3. JS常用正则表达式备忘录

    摘要: 玩转正则表达式. 原文:JS常用正则表达式备忘录 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 正则表达式或"regex"用于匹配字符串的各个部分 下面是 ...

  4. Js与正则表达式

    原本接着上面的章节,这一章节应该是写 Jquery事件的,由工作需要,暂时横插一篇正则表达式的学习,这里是边学边记录,错误之处,希望指正,提拔一二,不甚感激! 此章节有 1.1 正则表达式的定义 1. ...

  5. js常用正则表达式,滚蛋吧!你们测试组bug,让你挑

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  6. JS 之正则表达式

    字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界. -或- 对 ...

  7. dynamic-css 动态 CSS 库,使得你可以借助 MVVM 模式动态生成和更新 css,从 js 事件和 css 选择器的苦海中脱离出来

    dynamic-css 使得你可以借助 MVVM 模式动态生成和更新 css,从而将本插件到来之前,打散.嵌套在 js 中的修改样式的代码剥离出来.比如你要做元素跟随鼠标移动,或者根据滚动条位置的变化 ...

  8. 什么是JS事件冒泡?

    什么是JS事件冒泡?: 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理 程序或者事件返回true,那么 ...

  9. js事件技巧方法整合

    window.resizeTo(800,600); //js设置浏览器窗口尺寸 window.open (function(){ resizeTo(640,480);//设置浏览器窗口尺寸 moveT ...

  10. js事件浅析

    js中关于DOM的操作很多,因此js事件机制也就尤为重要. 事件绑定形式: 一. 内联形式 耦合度高,不利于维护 <button onclick="alert('你点击了这个按钮'); ...

随机推荐

  1. 使用php添加定时任务

    1.  php执行外部命令的函数:       system(),exec(),passthru()      注意点:     1.调用的路径,相对路径有时候不是很靠谱.           sys ...

  2. 黑马程序员_JAVA基础知识总结3

    ------- android培训.java培训.期待与您交流! ---------- Java源文件的扩展名是.java,编译之后生成.class的文件.所有的类都有一个共同的继承祖先Object类 ...

  3. 在CentOS上搭建PHP服务器环境

    您也可以使用一键自动部署环境的工具,请参见网友开发的这个工具 http://www.centos.bz/2013/08/ezhttp-tutorial/     安装apache: yum insta ...

  4. Python从题目中学习:List comprehension

    九九乘法表作业其实有更简单的做法,就是用列表推导式. ------------------------------------------------------------------------- ...

  5. C# 自定义序列化问题

        public class overdue     {         public int overdueTimes { get; set; }         /// <summary ...

  6. 学习java第7天

    关于继承还需要留意的是,子类中的所有构造方法都默认访问父类的无参构造,注意是无参,而且是必须的,如果父类没有无参子类就会报错.如果你不想给父类无参构造,那么在子类中加上super(),显式的调用有参构 ...

  7. java的InputStream和OutputStream的理解【转】

    1.在java中stream代表一种数据流(源),javaio的底层数据元,---(想像成水龙头)2.任何有能力产生数据流(源)的javaio对象就可以看作是一个InputStream对象既然它能产生 ...

  8. 在HttpClient请求的时候,返回结果解析时出现java.io.IOException: Attempted read from closed stream. 异常,解决

    原因是EntityUtils.toString(HttpEntity)方法被使用了多次.所以每个方法内只能使用一次.

  9. sqoop job 踩过的坑

    sqoop 执行可以以job形式 也可以执行用命令执行,再用sqoopjob时,踩了几个坑,分享一下 1.服务器重启 由于服务器增加硬盘,需要重启后,发现sqoop job 无法执行,报连接数据库IO ...

  10. 在MS SQLSERVER中如何最快的速度清空所有用户表的数据

    有时候我们需要清空数据库中所有用户表的数据,如果一张表一张表的清空的话,遇到一个庞大的数据系统估计得崩溃了.  用游标加上用变量来引用表名就可以做到这一点. 用变量来引用表名对表操作可以用在存储过程中 ...