【无标题】

事件的概念

事件:对某个元素的某种操作
事件三要素:
事件元素:触发事件的元素
事件类型:鼠标事件/键盘事件类型
事件对象:携带着相关事件的属性和方法,事件对象必需要有事件的触发才会产生

事件类型宏观分为:
鼠标事件:onclick/onmouseover
键盘事件:onkeydown/onkeyup

page:针对于整个页面的左顶点,常用
client:针对于可视窗口的左顶点,用的少
offset:针对其父元素的左顶点,拖拽中常用

注意:一个元素在页面发生位移,本质就是修改其left和top的值,必须设置position:absolute,否则元素无法移动

事件流:当父子元素绑定相同事件时,触发子元素或父元素,事件流会向父元素或子元素传递
冒泡:由子元素向父元素传递(默认就是冒泡)
捕获:由父元素向子元素传递(用的极少)

阻止事件冒泡:在传播源添加阻止代码的函数
事件对象.函数名|事件对象.属性
阻止事件冒泡的方法:
1、e.stopPropagation();
2、e.cancelBubble = true
兼容写法:
e.stopPropagation?e.stopPropagation(): e.cancelBubble = true;

阻止浏览器的默认行为
事件对象.函数()|事件对象.属性
// e.preventDefault();
// e.returnValue = false;
推荐写法//阻止浏览器的默认行为s
// return false;

//鼠标右键
// document.oncontextmenu = function(){
// console.log(“heihei”);

//     return false;
// }

键盘事件及对象

键盘事件:
onkeydown:只要按下任意按键,就触发一次

document.onkeydown = function(){
        console.log("heihei");
    }

onkeypress:生成一个字符时触发,最常用

document.onkeypress = function(){
        console.log("heihei");
    }

onkeyup:键盘抬起时触发

document.onkeyup = function(){
        console.log("heihei");
    }

键盘事件对象:

 document.onkeypress = function(evt){
        // console.log(evt);

        //录入的字符
        console.log(evt.key);

        //录入的ASC码值
        var keyAsc = evt.keyCode || evt.which || evt.charCode;
        // console.log(evt.keyCode);
        // console.log(evt.which);
        // console.log(evt.charCode);

        // 65 97 13   32  48    10
        // A  a  回车 空格 0  ctrl+回车 

        console.log(keyAsc);

        if(keyAsc == 10){
            console.log("发送");
        }

        //ctrlKey:判断ctrl是否被按下
            console.log(evt.ctrlKey);
    }

事件的绑定方式

方法一、通过html元素绑定

<body>
		<button onclick="f1()">点击1</button><br>
</body>
<script>
		function f1(){
		        console.log("嘤嘤嘤");
		    }
		    oBtn.onclick = f1;
</script>

方法二、通过JS对象绑定

<body>
		 <button id="btn">点击2</button><br>
</body>
<script>
		var oBtn = document.querySelector("#btn");
</script>

以上绑定方式的缺陷:
a、无法为相同的元素多次绑定相同的事件
b、无法决定事件流是冒泡还是捕获

方法三、事件的监听(可以解决以上两种的缺陷)
优点:a、可以为相同的元素多次绑定相同的事件
b、可以决定事件流是冒泡还是捕获
事件元素:addEventListener(“去掉on的事件名,回调函数,是否捕获true|默认false”);

 document.addEventListener("click",function(){
        console.log(1);
    });

    document.addEventListener("click",function(){
        console.log(2);
    });
  document.addEventListener("click",function(){
        alert("document捕获");
    },true);

    window.addEventListener("click",function(){
        alert("window捕获");
    },true);

    document.addEventListener("click",function(){
        alert("document冒泡");
    },false);

    window.addEventListener("click",function(){
        alert("window冒泡");
    },false);

    //先捕获后冒泡

事件的解绑

<body>
	 <button>点击</button><br>
     <button>解绑</button><br>
</body>

事件的解绑
1、JS对象解绑

var oB = document.querySelectorAll(“button”);
	oB[0].onclick = function(){
					alert(1111);
	}	
	oB[1].onclick = function(){
					oB[0].onclick = null;
	}

2、事件监听的解绑
removeEventListener(“去掉on的事件”,“同一个回调函数”);
var f =function(){
alert(1111);
}
document.addEventListener(“click”,f);
var oB = document.querySelectorAll(“button”);
oB[1].onclick = function(evt){
evt.stopPropagetion();
document.removeEventListener(“click”,f);
}

事件的委托

委托:自己的事让别人干
事件的委托:子元素被触发后,事件体由元素执行——>依赖于冒泡机制
好处1:可以将批量绑定的子元素事件,委托到父元素事件,从而提高程序执行效率

<body>
    <ul>
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>111</li>
        <li>222</li>
        <li>333</li>
        <li>111</li>
    </ul>
</body>
<script>
方法一、
 // var oLis = document.getElementsByTagName("li");
for(var i=0; i<oLis.length; i++){
    //     oLis[i].onclick = function(){
    //         this.style.backgroundColor = 'hotpink';
    //     }
    // }
    -------------------------------------------------------------------

    var oUl = document.querySelector("ul");
方法二、
    // oUl.onclick = function(evt){
    //     // this.style.backgroundColor = 'hotpink';
    //     // 获取真实的操作元素
    //     var target = evt.target || evt.srcElement;

    //     console.log(target.tagName);

    //     if(target.tagName == "LI"){
    //         target.style.backgroundColor = 'red';
    //     }
    // }
方法三、
    oUl.addEventListener("click",function(evt){
        var target = evt.target || evt.srcElement;
        if(target.tagName == "LI"){
            target.style.backgroundColor = 'red';
        }
    });
    </script>

好处2、可以为未来添加的子元素,提前绑定事件

<body>
    <input type="text" name="" id="">
    <ul>
        <li>福岛核废水</li>
        <li>天津老大爷</li>
        <li>认房不认贷</li>
        <li>小学生开学</li>
        <li>遥遥领先</li>
    </ul>
    <button>添加</button>
</body>
<script>
	 var oInput = document.querySelector("input");
	  var oLis = document.getElementsByTagName("li");
	  var oBtn = document.querySelector("button");
	  var oUl = document.querySelector("ul");
	  oUl.addEventListener("mouseover",function(evt){
	   var target = evt.target || evt.srcElement;

        if(target.tagName == "LI"){
            target.style.backgroundColor = 'red';
        }
    });

    oUl.addEventListener("mouseout",function(evt){
        var target = evt.target || evt.srcElement;

        if(target.tagName == "LI"){
            target.style.backgroundColor = '';
        }
    });

    oBtn.onclick = function(){
        var oLi = document.createElement("li");
        oUl.appendChild(oLi);
        oLi.innerHTML = oInput.value;
    }
</script>

拖拽

onmousedown 作用于box 包含以下两个事件:
onmousemove 作用于document
onmouseup 作用于document

<head>
    <style>
        #box{
            width: 100px;
            height: 100px;
            background-color: red;
            position: absolute;
            cursor: move;
        }
    </style>
</head>
<body>
    <div id="box"></div>
</body>
</html>
<script>
    var oBox = document.querySelector("#box");
    oBox.onmousedown = function(evt){
        var x = evt.offsetX;
        var y = evt.offsetY;
        document.onmousemove = function(evt){
            var left = evt.pageX - x;
            if(left < 0){
                left = 0;
            }
            var maxLeft = window.innerWidth - oBox.offsetWidth;
            if(left > maxLeft){
                left = maxLeft;
            }

            var top = evt.pageY - y;
            if(top < 0){
                top = 0;
            }
            var maxTop = window.innerHeight - oBox.offsetHeight;
            if(top > maxTop){
                top = maxTop;
            }

            oBox.style.left = left + "px";
            oBox.style.top = top + "px";
        }
        document.onmouseup = function(){
            document.onmousemove = null;
        }
    }
</script>

正则表达式

数据校验
数据格式大的判断>通过正则进行格式判断
数据数值的判断
什么是正则表达式:字符串的规范格式
为什么要使用正则表达式?正则表达式(regular expression)是一个描述字符规则的对象

1、构造方法
var reg = new RegExp(“格式字符串”,“修饰符可省略”);

正则的API之一
test
功能:判断目标字符串是否满足正则对象
参数:test(目标字符串)
返回值:布尔值
例子:console.log(reg.test(“bc”);

exec
功能:返回目标字符串满足正则对象的子串
参数:exec(“目标字符串”)
返回值:满足正则对象的子串,存放在长度为1 的数组中

修饰符:g,全局->访问所有元素
例子:// var reg = /d+/g;
修饰符:i,忽略大小写
例子:// var reg = /xing qi si/i;
字符串API,正则对象作为参数

str.match(正则对象)
功能:返回目标字符串满足正则对象的子串
参数:match(正则对象)
返回值:满足正则对象的子串,全都存放在数组中

// search
//功能:查找字串,返回下标或者-1
//参数:search(正则对象)
//返回值:返回下标或者-1

2、字面量
reg=/格式字符串,修饰符可以省略/
例子、reg=/1[3-9]\d{9}/;
console.log(reg.test(“18123456789”));
// 什么时候必须用构造方法创建对象?

 var arr = ["嘿嘿","123","laowang"];

    var reg = /arr[2]/;
    console.log(reg.test("laowang"))

    var reg1 = new RegExp(arr[2]);
    console.log(reg1.test("laowang"))

正则的格式字符串

// 格式字符串:普通字符+特殊字符
// 普通字符:普通的字符
// 特殊字符:a.单个字符
// b.各种括号
// c.组合字符

<body>
    <input type="text" name="" id=""> <button>测试</button>
</body>
<script>
  var oInput = document.querySelector("input");
    var oBtn = document.querySelector("button");

    oBtn.onclick = function(){
        //至少包含一个a
        var reg = /a/;

        //至少包含aaa
        reg = /aaa/;

        // ^&只能包含,同时存在或者同时不存在
        reg = /^a$/;

        reg = /^aaa$/;

        //以b开头,至少3个a,至多5个a
        reg = /^ba{3,5}$/

        //  6个5 /^5{6}$/;
        // reg = /^555555$/;
        reg = /^5{6}$/;

        //邮编   6位数字  
        reg = /^\d{6}$/;

        //定义一个由字母或数字或下划线组成的用户名,范围在6,18之间  
        reg = /^\w{6,18}$/; 

        // 定义一个由字母或数字或下划线组成的用户名,但是首字母不为数字  
        // 范围在6,18之间  
        reg = /^\D\w{5,17}$/;

        //定义一个密码,至少6位    
        reg = ![请添加图片描述](https://img-blog.csdnimg.cn/77cab8d90d3643e7b602223df9ba4430.png)


        //www.baidu.com
        reg = /www.baidu.com/;

        // \转义字符
        reg = /www\.baidu\.com/;
        reg = /\\/;

        //5+3
        reg = /^5\+3$/;

        //以 13 或 15 开头的手机号
        // 或
        // (字符传1|字符串2|xxxx)
        reg = /^1(3|5)\d{9}$/;

        // 还是或
        // [字符1字符2字符3...]
        reg = /^1[35]\d{9}$/;

        //表示区间的一个数据
        //[a-f0-3]
        reg = /^[a-f0-3]$/;

        //除了
        // [^字符1字符2字符3...]
        reg = /^[^a-f0-3!+6]$/;

        //空格 \s
        reg = /\s/;

        //中文 [\u4e00-\u9fa5]
        reg = /^[\u4e00-\u9fa5]{2}$/;
        
        console.log(reg.test(oInput.value));
    }
</script>

在这里插入图片描述

密码强弱的判断

注册

### 表单的强化验证

```javascript
<body>
    <!-- 
        action:提交的后端服务地址
     -->
    <form action="ok.html">
        <input type="text"> <span></span> <br> <br>  
        <input type="text"> <span></span> <br> <br> 
        <input type="submit" value="注册">
    </form>
</body>
</html>
<script>
    var oF = document.querySelector("form");
    var oInput = document.querySelectorAll("input");
    var oSpans = document.getElementsByTagName("span");

    var flagId = false;
    var flagPwd = false;

    oInput[0].onblur = function(){
        var regUserId = /^\w{6,18}$/;

        if(regUserId.test(this.value)){
            flagId = true;
            oSpans[0].innerHTML = "用户名格式正确";
        }else{
            flagId = false;
            oSpans[0].innerHTML = "用户名尿了";
        }
    }

    oInput[1].onblur = function(){
        var regUserPwd = /^.{6,}$/;

        if(regUserPwd.test(this.value)){
            flagPwd = true;
            oSpans[1].innerHTML = "密码格式正确";
        }else{
            flagPwd = false;
            oSpans[1].innerHTML = "密码尿了";
        }
    }

    oF.onsubmit = function(){
        if(flagId && flagPwd){
            return true;
        }else{
            return false;
        }
    }
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值