• js事件


    事件

    JavaScript有两种事件实现模式:

    1, 内联模式,

    2, 脚本模式。

    内联模式

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

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

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

    //注意单双引号

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

    <input type="button"value="按钮" onclick="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<aArr.length; i++){
        aArr[i].index = i;
        aArr[i].onclick = function(){
            for(var i=0; i<sectionArr.length; i++){
                sectionArr[i].classList.remove("active");
                aArr[i].classList.remove("active");
            }
            this.classList.add("active");
            sectionArr[this.index].classList.add("active");
        };
     }
    
    
    /*以下为用闭包实现方法*/
    
     for (var i in aArr) {
            aArr[i].onclick = fn(i);
        }
    
        function fn(index){
    
            var click = function(){
                for(var j=0;j< aArr.length;j++){
                    aArr[j].classList.remove("active");
                    sectionArr[j].classList.remove("active");
                }
                aArr[index].classList.add("active");
                sectionArr[index].classList.add("active");
    
            }
            return click;
        }

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

    提示: 使用 removeEventListener() 方法来移除 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.onscroll= 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.onmousedown= 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 就是鼠标点击的位置距离其所属对象上边界的距离

  • 相关阅读:
    event 事件 键盘控制div移动
    event 事件 div鼠标跟随
    获取坐标封装 getPos
    event 事件 clientX 和clientY 配合scrollTop使用, div跟着鼠标走
    event 事件 冒泡
    event 事件 坐标兼容
    event事件基础 document
    DOM 多字符搜索
    DOM search table 模糊搜索
    Reverse a sentence
  • 原文地址:https://www.cnblogs.com/SPHmomo/p/6913398.html
Copyright © 2020-2023  润新知