博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js事件
阅读量:6472 次
发布时间:2019-06-23

本文共 7710 字,大约阅读时间需要 25 分钟。

事件

JavaScript有两种事件实现模式:

1, 内联模式,

2, 脚本模式。

内联模式

内联模式 : 直接在HTML标签中添加事件.  

//HTML中把事件处理函数作为属性执行JS代码

<input type="button" value="按钮" οnclick="alert('hello');" />

//注意单双引号

//HTML中把事件处理函数作为属性执行 JS 函数

<input type="button"value="按钮" οnclick="btnClick();" />

//执行JS 的函数

: 内联模式调用函数, 则函数不能放到window.onload 里面,否则会找不到该函数。

脚本模式

使用脚本模式我们需要先获取到元素节点对象, 再针对该节点对象添加事件, 如我们可以采用三种方式来获得节点对象: getElementById(), getElementsByTagName(), getElementsByName()

添加事件方式一 :  通过匿名函数,可以直接触发对应的代码

//给box节点对象添加点击事件onclick

box.onclick = function() {   

         console.log('Hello world!');

};

添加事件方式二 :  通过指定的函数名赋值的方式 来执行函数

//给box节点对象添加点击事件onclick

box.onclick = func;

function func() {    

         console.log('Hello world!');

}; 

 

循环添加事件

var aArr = document.querySelectorAll("a");var sectionArr = document.querySelectorAll("section");for(var i=0; i

 

addEventListener() 方法用于向指定元素添加事件句柄。

提示: 使用  方法来移除 addEventListener() 方法添加的事件句柄。

语法

element.addEventListener(event, function, useCapture)

参数值

参数

描述

event

必须。字符串,指定事件名。

注意: 不要使用 "on" 前缀。 例如,使用 "click" ,而不是使用 "onclick"。 

function

必须。指定要事件触发时执行的函数。 

当事件对象会作为第一个参数传入函数。 事件对象的类型取决于特定的事件。例如, "click" 事件属于 MouseEvent(鼠标事件) 对象。

useCapture

可选。布尔值,指定事件是否在捕获或冒泡阶段执行。

可能值:true - 事件句柄在捕获阶段执行

  • false- false- 默认。事件句柄在冒泡阶段执行

 

 

 

事件处理函数

所有的事件处理函数都会都有两个部分组成,on+ 事件名称;

: 事件处理函数一般都是小写字母

JavaScript 可以处理的事件种类有三种:

 1, 鼠标事件、

 2, 键盘事件、

 3, HTML事件。

 

鼠标事件

click: 当单击鼠标按钮并在松开时触发     boxNode.onclick = function() { };

dblclick 当双击鼠标按钮时触发。ondbclick = function() { };

mouseover:当鼠标移入某个元素的那一刻触发。onmouseover = function() { };

mousedown:当按下了鼠标还未松开时触发 onmousedown = function() { };

mousemove:当鼠标指针在某个元素上移动时触发。onmousemove = function() { };  

mouseup 释放鼠标按钮时触发 onmouseup = function() { };

mouseout:当鼠标刚移出某个元素的那一刻触发 onmouseout = function() {  };

 

键盘事件

键盘事件,在键盘上按下键时触发的事件;

(一般由window对象或者document对象调用)

keydown:当用户按下键盘上某个键触发,如果按住不放,会重复触发。

window.onkeydown = function() { };

keypress:当用户按下键盘上的字符键触发,如果按住不放,会重复触发

window.onkeypress = function() { };

keyup:当用户释放键盘上的某个键触发。 

window.onkeyup = function() { };

 

Keypresskeydown的区别

KeyDown:在控件有焦点的情况下按下键时发生。会重复触发

KeyPress:在控件有焦点的情况下按下键时发生。会重复触发

KeyUp:在控件有焦点的情况下释放键时发生。

1.KeyPress主要用来捕获数字(注意:包括Shift+数字的符号)字母注意:包括大小写)、小键盘等除了F1-12SHIFTAltCtrlInsertHomePgUpDeleteEndPgDnScrollLockPauseNumLock{

菜单键}{
开始键}和方向键外的ANSI字符 KeyDown KeyUp 通常可以捕获键盘除了PrScrn所有按键(这里不讨论特殊键盘的特殊键)

2.KeyPress 只能捕获单个字符KeyDown KeyUp 可以捕获组合键

3.KeyPress 可以捕获单个字符的大小写

4.KeyDownKeyUp 对于单个字符捕获的KeyValue 都是一个值,也就是不能判断单个字符的大小写。

5.KeyPress 不区分小键盘和主键盘的数字字符。KeyDown KeyUp 区分小键盘和主键盘的数字字符。

6.其中PrScrn 按键KeyPressKeyDownKeyUp 都不能捕获。

系统组合键的判定

在使用键盘的时候,通常会使用到CTRL+SHIFT+ALT 类似的组合键功能。对于此,我们如何来判定?

通过KeyUp 事件能够来处理(这里说明一下为什么不用KeyDown,因为在判定KeyDown的时候,CTRLSHIFTALT 属于一直按下状态,然后再加另外一个键是不能准确捕获组合键,所以使用KeyDown 是不能准确判断出的,要通过KeyUp 事件来判定 

 

 

HTML事件

load:当页面完全加载后触发 window.onload = function() { };

unload:当页面完全卸载后触发window.onunload = function() { };

select:当用户选择文本框(input textarea)中的内容触发。 

input.onselect = function() { }; 

change:当文本框(input textarea)内容改变且失去焦点后触发。

input.onchange = function() { };

focus:当页面或者元素获得焦点时触发。 input.onfocus = function() { };

blur:当页面或元素失去焦点时触发。input.onblur = function() {  };

submit:当用户点击提交按钮在<form>元素节点上触发。

 form.onsubmit = function() {  };

reset:当用户点击重置按钮在<form>元素节点上触发。

form.onreset = function() { };

scroll:当用户滚动带滚动条的元素时触发

window.οnscrοll= function() { };

 

事件处理的三个组成部分

事件处理由三个部分组成:

1, 触发事件的节点对象

2, 事件处理函数

3, 事件执行函数。

 

this关键字 

JS事件中, this表示触发事件的元素节点对象;this指向函数的所有者

var box = document.getElementById('box');box.onclick = function() {      console.log(this.nodeName);  //this表示box对象};

 

 

event对象的获取

event对象(事件对象)是在触发事件时, 浏览器会通过函数把事件对象作为参数传递过来, 在事件触发执行函数时一般会得到一个隐藏的参数, 该参数也是放在arguments数组中.

 

box.onclick = function(evt){     var oEvent  = evt || event; //获取到event对象(事件对象)     alert(oEvent);};

 

 

event对象的属性

1.button属性

document.onclick = function(evt) {        var oEvent  = evt || event;        console.log(oEvent.button);};

 

(右键属性在mousedown中可以显示);

2.可视区坐标及屏幕坐标

事件对象提供了两组来获取浏览器坐标的属性,一组是页面可视区坐标,另一组是屏幕区坐标。

 

Client 是到window的坐标,screen是到整个电脑屏幕的坐标

 

document.οnmοusedοwn= function(evt) {       var oEvent  = evt || event;        console.log(oEvent.clientX + ',' + oEvent.clientY);        console.log(oEvent.screenX + ',' + oEvent.screenY);};

 

event对象的属性/键盘事件(修改键)

有时,我们需要通过键盘上的某些键来配合鼠标来触发一些特殊的事件。这些键为: ShfitCtrlAlt Meat(Windows 中就是 Windows 键,苹果机中是 Command ),它们经常被用来修改鼠标事件和行为,所以叫修改键。

 

 

event对象的属性/键盘事件(键码)

1. 键码 : keyCode属性 

       所有按键, 包括功能键(control, alt,shift, tab, 方向键等), (不包括亮度,音量..的按键)在发生 keydownkeyup 事件时event对象的 keyCode属性中会包含一个代码,与键盘上一个特定的键对应。对数字字母字符集,keyCode属性的值与 ASCII 码中对应, 大写字母或小写的编码相同, 为大写字母

document.onkeydown = function(evt) {      var oEvent = evt || window.event;      alert(oEvent.keyCode);  //按任意键,得到相应的 keyCode};

 

 

event对象的属性/键盘事件(字符码)

2.字符编码 : charCode属性 

FirefoxChrome Safari event对象支持charCode属性,这个属性只有在发生keypress事件时才包含值,而且这个值是按下的那个键所代表字符的 ASCII 编码。此时的keyCode通常等于0或者也可能等于所按键的编码

( 键盘上的数字, 字母(区分大小写), 字符, 空格, 回车) 

document.onkeypress = function(evt) {var oEvent = evt || event;console.log(oEvent.charCode);}

 

注:可以使用 String.fromCharCode() ASCII 编码转换成实际的字符

 

事件的目标(target属性)

target: 目标对象,存放绑定事件的元素节点对象

document.onclick = function(evt) {     var oEvent = evt || event;     console.log("document: " + oEvent.target); //HTMLHtmlElement}

 

事件的冒泡

事件流

        事件流是描述的从页面接受事件的顺序,当几个都具有事件的元素层叠在一起的时候, 那么你点击其中一个元素,并不是只有当前被点击的元素会触发事件,而层叠在你点击范围 的所有元素都会触发事件。事件流包括两种模式:冒泡和捕获。

事件冒泡是从里往外逐个触发。事件捕获,是从外往里逐个触发。那么现代的浏览器 默认情况下都是冒泡模型

事件的冒泡: 指的是在页面上层节点触发的事件会继续传递给下层节点, 这种传递方式,我们称之为事件的冒泡传递;

 

阻止冒泡的方式有两种:

( 在指定不想再继续传递事件的节点的事件执行函数中使用)

//1, 取消冒泡

     oEvent.cancelBubble = true;     //这个用的比较多

//2, 停止传播

     oEvent.stopPropagation();  //不支持IE8以下

 

阻止右键菜单事件

阻止右键菜单

在之前使用event对象的button属性时, 点击鼠标右键会弹出系统菜单, 如果我们想要创建自己的右键菜单, 则需要先阻止默认的右键菜单

document.oncontextmenu = function(){alert("右键被按下");return false;}

 

 

 

超链接的拦截

<a>标签有属性href, 在用户点击超链接标签<a>时, 实际上内部会调用onclick事件,那么如果我们需要在超链接跳转前做一些判断处理, 则可以将onclick指向我们自己的函数,并返回true或者false来决定是否允许超链接跳转;

var oA = document.getElementsByTagName("a")[0];oA.onclick = function() {return (confirm("你确定要跳转吗?"));}

 

<a href="http://www.baidu.com">百度一下</a>

 

拖拽

所谓拖拽: 就是按住元素后移动位置, 最后松开的过程

1, 实现拖拽相关的三大事件:

onmousedown : 鼠标按下

onmousemove : 鼠标移动

onmouseup : 鼠标松开

 

实现拖拽思路:

    1, 给目标元素添加onmousedown事件(鼠标按下事件)

        在鼠标按下的瞬间, 记录鼠标所在位置与目标元素左边界的距离disX, 以及与上边界的距离disY

    2, 当onmousedown事件发生以后(鼠标按下后),就给document添加onmousemove事件(鼠标移动事件)

    在onmousemove(鼠标移动事件)中, 根据以下公式不断刷新目标元素所在的位置:

    公式: 目标元素的left = oEvent.clientX – disX + “px”;

             目标元素的top = oEvent.clientY – disY + “px”;

3, 在onmousedown事件(鼠标按下事件)发生以后,给document再添加onmouseup事件(鼠标松开事件),且在onmouseup事件中,取消document的onmousemove事件; 

onmousedown触发事件的对象: 目标元素(即要拖拽的元素);

onmousemove触发事件的对象: document

onmouseup触发事件的对象: document

onmousemove和onmouseup的触发事件对象都是document, 意味着鼠标在网页的任意位置移动鼠标或松开鼠标,都会触发对应的事件;

onmousemove和onmouseup 都要写在onmousedown事件中, 这样就可以保证鼠标按下后才可以移动目标元素(onmousemove)或停止移动(onmouseup) 

取消事件的方法:把该事件等于null,(divNode.onmousedown = null;)

 

事件监听器

      事件监听器, 是JS事件中的一种事件触发机制, 我们可以通过添加事件监听器的方式给元素添加事件及执行函数

1, 添加事件监听器

   box.addEventListener("click", func, false) : 给box元素添加点击事件(click), 以及事件执行函数func

针对该函数的三个参数作说明:

      第一个参数(“click”) : 事件名称(前面没有on)

      第二个参数(func): 事件执行函数名称(没有双引号, 也没有())

匿名函数写法:function(){}

      第三个参数(false/true) : 是否使用捕捉(反向冒泡),默认false,为冒泡 

注: IE8及其以下不支持,火狐和谷歌支持。 

2, 移除事件监听器 

   box.removeEventListener("click", func) : 将box元素的点击事件(click), 以及对应的事件执行函数func移除 

注: 这里只会删除使用box.addEventListener()方法添加的事件监听器 

 

获取style样式

Var cssStyle = box.currentStyle || getComputedStyle(box, null);

 

例子:console.log(getComputedStyle(box, null).width);

修改style属性的时候只能用   doxNode.style.width =’100px’;

 

offsetParent参照物父元素(只能取值,不能赋值)

当某个元素的父元素或以上元素都未进行CSS定位时,则返回body元素,也就是说元素的偏移量(offsetTopoffsetLeft)等属性是以body为参照物的

当某个元素的父元素进行了CSS定位时(absolute或者relative),则返回父元素,也就是说元素的偏移量是以父元素为参照物的

当某个元素及其父元素都进行CSS定位时,则返回距离最近的使用了CSS定位的元素

Offsetwidth 类似于 style.width,此处取到的是自身的宽度   Offsetheight 类似于 style.height,此处取到的是自身的高度

oEvent.offsetX 就是鼠标点击的位置距离其所属对象左边界的距离

oEvent.offsetY 就是鼠标点击的位置距离其所属对象上边界的距离

转载于:https://www.cnblogs.com/SPHmomo/p/6913398.html

你可能感兴趣的文章
java单例模式深度解析
查看>>
【学习笔记】阿里云Centos7.4下配置Nginx
查看>>
VuePress手把手一小時快速踩坑
查看>>
dnsmasq安装使用和体验
查看>>
学习constructor和instanceof的区别
查看>>
Vijos P1881 闪烁的星星
查看>>
ABP理论学习之领域服务
查看>>
Qt 控制watchdog app hacking
查看>>
让所有IE支持HTML5的解决方案
查看>>
RDD之五:Key-Value型Transformation算子
查看>>
Windows 搭建Hadoop 2.7.3开发环境
查看>>
python操作mysql数据库实现增删改查
查看>>
percona 5.7.11root初始密码设置
查看>>
Cognitive Security的异常检测技术
查看>>
Impress.js上手 - 抛开PPT、制作Web 3D幻灯片放映
查看>>
生活杂事--度过十一中秋
查看>>
Pyrex也许是一个好东西
查看>>
Java内部类总结
查看>>
WINFORM WPF字体颜色相互转换
查看>>
能力不是仅靠原始积累(三)
查看>>