• js-事件模型总结


    三种事件模型:原始事件模型(DOM0),DOM2事件模型,IE事件模型;

    不同点:

      事件程序的注册(给HTML元素所对应的JS对象绑定事件)

      事件传播的过程

    事件模型的注册:

      一、原始事件模型(没有兼容性问题)

    原始事件模型的特点:

    事件类型上面有ON(onclick)

    没有事件的传播(事件一旦发生就立刻调用事件句柄)

    一个DOM对象只能注册一个类型的事件,如果注册了两个,则会发生覆盖,只执行后一个事件;

    注册:

     1、将JS代码作为HTML的性质(也就是直接在标签中将HTML元素的性质设置为一段代码)

    <input type="button" value="Press me" onclick="alert('thanks');"  

     2、将事件处理程序作为js对象的属性

    <form name="f1">  
    <input name="b1" type="button" value="Press Me"/>  
    </form>  

    复制代码
    document.f1.b1.onclick=function()  
        {  
           alert('thanks');  
         };  
    
    或者
    
    function plead()  
    {  
       window.status="Please Press Me!";  
    }  
    document.f1.bi.onmouseover=plead; 
    (注意没有括号)

    或者

      显示调用:document.myfrom.onsubmit();  

    
    
    复制代码

    解除:

    将null复制给事件函数:

    document.getElementById('click'_).onclick = null;

    浏览器可以对每个事件执行默认的动作:

    –submit按钮默认行为是提交表单。

    –超链接的默认行为是向指定资源发起请求。
    -reset按钮默认行为是重置。。
    -click单选按钮或复选框点击设置。
    -keydown用户按下按钮。
    -mousedown鼠标按下。
    阻止默认动作:
    事件处理程序可以通过返回false来阻止浏览器的默认行为

    特例:对超链接mouseover的window.status显示事件的阻挡,是返回true

    <a href="help.htm" onmouseover="window.status='help';return true;">help</a>  

     

    二:DOM2级(IE8以下不支持)

    主要特点:有一个事件的传播过程


    事件捕获:事件由document对象一直向下捕捉到目标元素

    事件执行:目标对象的事件处理程序执行

    事件冒泡:事件从目标元素上升到document

     所有事件类型都会经历第一阶段,有的事件不会经历第三阶段(submit)

    特点二:

    一个dom对象可以注册多个相同类型的事件,不会发生事件的覆盖,会依次的执行各个事件函数。

    eg:定义两个盒子,outer包含inner,给inner可绑定两个click事件,添加false表明在冒泡阶段调用函数,则先执行inner的click函数,再执行outer的click函数。

    因为点击了里面的div后事件会经历三个阶段(document——outer——inner——document)

    复制代码
    <div id = 'outer' style = 'margin: 100px 0 0 100px;  200px;height: 200px; background: red;'>
        <div id="inner" style = 'margin-left:20px;  50px;height:50px; background: green;'></div>
    </div>
    <script>
        var click = document.getElementById('inner');
        click.addEventListener('click',function(){
            alert('click one');
        },false);
        click.addEventListener('click',function(){
            alert('click two');
        },false);
    </script>
    复制代码

    注册:

    [object].addEventListener('事件名称',方法名(函数),事件模型(true/false))

    解除:

    [object].removeEventListener('事件名称',方法名(函数),事件模型(true/false))

     true/false决定在那个阶段调用函数

    true:捕获

    false:冒泡

    停止传播:event.stopPropagation()

    如果我们给outer和inner都注册了click事件但是我不希望outer执行怎么办呢?

    复制代码
    <script>
        var click = document.getElementById('inner');
        var clickouter = document.getElementById('outer');
        click.addEventListener('click',function(event){
            alert('inner show');
            event.stopPropagation();
        },false);
        clickouter.addEventListener('click',function(){
            alert('outer show');
        },false);
    </script>
    复制代码

    阻止默认动作:event.preventDefault()

    由于事件捕获阶段没有可以阻止事件的函数,所以一般都是设置为事件冒泡。

    三、IE模型

    特点:Event对象不是事件处理程序的函数参数,而是window的全局变量

    事件对象event:事件发生时产生的对象。封装了跟事件相关的信息。

    –鼠标信息
    –键盘信息
      IE得到的事件对象

    div1.onclick = function(){

      var e = window.event;

    }

      DOM得到事件对象

    div1.onclick = function(ev){

      var e = ev;

    }

    事件传播过程只有冒泡阶段

    注册:

    [object].attachEvent("onclick",click1)

    解除:

    [object].detachEvent("onclick",click1)

    停止传播:window.ecent.cancelBubble=true;

    event属性和方法

    Dom和IE的event相同点。
    –获取事件类型:e.type
    –获取键盘码:keydown/keyup
    –检测是否按下e.shiftKey,e.altKey,e.ctrlKey
    –获取客户坐标:e.clientX,e.clientY
    –获取屏幕坐标:e.screenX,e.screenY
    Dom和IE的event不相同点。

                                                                                                                         IE                                                            DOM

    获取事件源

    e.srcElement

    e.target

    获取字符码

    e.keyCode

    e.charCode

    阻止默认行为

    e.returnValue=false

    e.preventDefault()

    中止冒泡传播

    e.cancelBubble=true

    e.stopPropagation()

     
     
    获取事件源对象:

    div1.onclick = function(e){

       var ev = window.event||e;//获取事件对象

    var srcObj = ev.srcElement||ev.target;

    }

     
    事件类型
     
    鼠标事件
    常见事件
    –click  点击
    –dbclick  双击
    –mousedown  鼠标按下时
    –mouseout  当光标在一个元素上,并且用户将其移出元素边界时
    –mouseover 鼠标移入时
    –mouseup 释放鼠标按钮时
    –mousemove  当光标在你一个元素上时 重复发生
    页面上所有元素均支持鼠标事件。
     
    键盘事件
    常见事件
    –keydown  当用户在键盘上按下一个键时发生,如果用户按键不放,就会重复发生
    –keypress  当用户在键盘上按下一个字符键(不包括shift和Alt键等)时发生,如果用户按键不放,也会重复发生
    –keyup   当用户释放一个键时发生
    通常在输入框上实现键盘事件。
    返回false表示不响应该事件
    事件发生顺序
    –字符键:keydown,keypress,keyup
    –非字符键:keydown,keyup
    HTML事件
    常见事件
    –load,unload
    –select
    –change  失去焦点并且值被改变
    –submit
    –reset 
    –resize 窗口或框架尺寸调整
    –scroll 有滚动条时
    –focus  获得焦点
    –blur  失去焦点
     
     
    兼容性问题:

    div1.onclick = function(ev){

      var e = windo.event||ev;

    }

    function myaddEvent(obj,event,fn){//对象 ,事件,函数,
    if(document.all){
    obj.attachEvent('on'+event,fn);
    }else{
    obj.addEventListener(event,fn);//第三个参数默认为false(冒泡)
    }
    }
  • 相关阅读:
    ubuntu server 14.04和18.04挂载vmware共享文件夹
    Ubuntu 无法进行SSH连接,开启22端口
    ubuntu切换到root用户
    VMware Workstation 15 Pro 永久激活密钥
    idea静态资源的访问问题,如HTML,css,js的加载
    idea在Tomcat服务器加载html文件出现乱码的解决方案
    html,js 打开时出现 Uncaught TypeError: Cannot read property 'addEventListener' of null at register.js:24错误的解决方法
    js判断input输入是不是含有中文,或者判断输入是不是全是中文
    PHP连接前端from数据的错误,如源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。
    PHP与Tomcat运行前的配置。
  • 原文地址:https://www.cnblogs.com/SRH151219/p/11062498.html
Copyright © 2020-2023  润新知