zoukankan      html  css  js  c++  java
  • 事件 event

    添加移除函数(removeEventListener)时三个参数保持一致,否则会失败,而且不会有错误提示
    var btn = document.getElementById(“myBtn”);
    btn.addEventListener(“click”, function(){
        alert(this.id);
    }, false);
    这样是移除不了的,因为第二个匿名函数并不是同一个,也就是说匿名函数作为handle是无法取消的!
    btn.removeEventListener(“click”, function(){             
        alert(this.id);
    }, false);
     
     
    object.onclick = myfunc 等同于 object.addEventListener("click", myfunc, false);
    事件默认被添加到冒泡阶段,使用onclick这样方式添加的事件处理被认为是该元素对象的方法,因此this指向该对象,可以获取该元素属性,this.id
    如果在HTML中指定了onclick=""事件,也可以用object.onclick获取,或者object.onclick = null 取消掉
     
     
    object.addEventListener("click", myfunc, false);                  // 不需要 on,一个元素添加多个事件会按添加顺序触发
    object.attachEvent("onclick", myfunc);                            // 记得要加上on,另外使用这里的this指向的是window对象,而不是元素对象,添加多个事件触发顺序相反,ie 的 attachEvent 的事件处理程序是被引用的,而不是拷贝的,所以this 总是指向 window
    btn.onclick = function(){
          alert(window.event.srcElement === this);                           //IE添加事件监听方式不同,结果也不同,应该使用event.srcelement取代this
    };
    btn.attachEvent(“onclick”, function(event){
          alert(event.srcElement === this);                                      //this指向window
    });
     
     
    object.onclick = myfunc
    object.onclick = myfunc2
    注意的是DOM Level 0只能添加一个处理函数,后面分配的会取代前面分配的
     
     写在元素上的事件可以直接访问元素的attribute属性,上面三种方法都可以
    <input type="button" value="haha" onclick="alert(event.type)">
    <input type="button" value="haha" onclick="alert(this.type)">
    <input type="button" value="haha" onclick="alert(type)">
     
     
    使用传统委托方式 elem.onclick = function(){} 的话,可以使用 alert(elem.onclick) 看到哪些函数被注册了
    而 addeventlistener()  方式注册的看不到,直到DOM3才有一个  eventListenerList  来储存已经注册了的处理函数
     
     
    target属性指向触发事件的真正目标,而currenttarget属性指向目前事件处理函数所在的元素
    document.body.onclick = function(event){
    alert(event.currentTarget === document.body);                                  //true 
    alert(this === document.body);                                                        //true 
    alert(event.target === document.getElementById(“myBtn”));                //true
    };
     
    模拟/定制事件:
    事件触发器 fireEvent(ie) 和 dispatchEvent ,用来触发某个元素下的某个事件,通常情况是用户操作触发事件的
    但有些时候我们需要自定义事件或者在特定情况下触发这些事件,就可以使用事件触发,大概流程如下:
    Dom下:
    var div = document.getElementById(“myDiv”), event;
    EventUtil.addHandler(div, “myevent”, function(event)  {
        alert(“DIV: “ + event.detail);
    });
    EventUtil.addHandler(document, “myevent”, function(event)  {
        alert(“DOCUMENT: “ + event.detail);
    });
    if (document.implementation.hasFeature(“CustomEvents”, “3.0”))  {
        event = document.createEvent(“CustomEvent”); 
        event.initCustomEvent(“myevent”, true, false, “Hello world!”);
        div.dispatchEvent(event);
    }
    ie下:
    var btn = document.getElementById(“myBtn”);
    var event = document.createEventObject();                                      //create event object
    event.screenX = 100;                                                                    //initialize the event object
    event.screenY = 0;
    event.clientX = 0;
    event.clientY = 0;
    event.ctrlKey = false;
    event.altKey = false;
    event.shiftKey = false;
    event.button = 0; 
    btn.fireEvent(“onclick”, event);                                                          //fire the event
     
    应该使用CustomEvent来定制事件:
     
    事件委托:
    var EventUtil = {
    addHandler: function(element, type, handler){
    if (element.addEventListener){
    element.addEventListener(type, handler, false);
    } else if (element.attachEvent){
    element.attachEvent(“on” + type, handler);
    } else {
    element[“on” + type] = handler;
    }
    },
    removeHandler: function(element, type, handler){
    if (element.removeEventListener){
    element.removeEventListener(type, handler, false);
    } else if (element.detachEvent){
    element.detachEvent(“on” + type, handler);
    } else {
    element[“on” + type] = null;
    }
    }
    };
     
    ie使用专用的事件处理机制 然而DOM规定的是另外一种,不一样,以下为取得事件信息方法:
    EventUtil.getEvent = function()  {
    if (window.event) {
    return this.formatEvent(window.event);
    } else {
    return EventUtil.getEvent.caller.arguments[0];
    }
    };
     
    实现实现事件委托另一种思路   apply()    call()
     
    Dom3新增的事件属性和方法:
    stopImmediatePropagation和stopPropagation()方法区别在于前者除了组织事件继续捕获或者冒泡之外,还会阻止其他事件处理函数运行
     
    trusted属性为true表示事件由浏览器产生,false表示事件由开发者javascript代码触发
     
    eventPhase属性指出事件在哪个阶段触发,1表示捕获阶段,2表示at the target,3表示冒泡阶段
    var btn = document.getElementById(“myBtn”); 
    btn.onclick = function(event){
          alert(event.eventPhase);                                                //2
    };
    等于2的时候,this,target,currenttarget相等
    document.body.addEventListener(“click”, function(event){
          alert(event.eventPhase);                                                 //1
    }, true);
    document.body.onclick = function(event){
        alert(event.eventPhase);                                                      //3
    };
    Dom3弃用了keypress事件
     
    HTML5事件:
    contentmenu事件,右键出现菜单事件,preventDefault()可以组织默认菜单弹出,用自己做的菜单替换
    beforeunload事件,在unload事件之前触发,可以用于在用户推出之前确认,event.returnValue=“真的要离开了么?”可以设置确认的文字
    DOMContentLoaded事件当dom加载完成就立刻触发,不用等images, JavaScript files, CSS files, or other such resources,不支持的话用setTimeout(function(){},0)来模拟
    hashchange事件,当URL的hash值改变时触发
    readystatechange,用来提供document或者元素加载状态信息,所有支持该事件的元素都有一个readyState属性,用来目前判断加载状态
     
     
    触屏设备事件:
    不支持双击事件,因为那是放大缩小,无法覆盖默认行为。
    点击一个带有点击事件的元素或默认可点击的元素例如链接,会触发mousemove事件。如果点击后内容不改变就会触发mousedown,mouseup,click,如果内容改变不会触发那些事件了。
    mousemove事件同时触发mouseover,mouseout
    mousewheel和scroll事件当两个手指在屏幕上滑动页面时触发
     
    指南针
    orientationchange 事件在IOS设备上支持,检测手机的摆放状态,其中window.orientation属性0竖着,90向左转90度,-90向右转90度,因为这是window的事件,因此可以在body上用onorientationchange属性触发
    火狐提供了一个 MozOrientation 事件,但这个事件可能将来会被取代
    deviceorientation 事件监听window对象,当设备有加速器的时候可用,主要目的是提供设备目前的朝向信息,而不是运动信息。通过三个轴来判断:
    当deviceorientation 事件被触发的时候,它会有五个属性:
    alpha: 以设备坐标系z轴为轴,旋转alpha度。alpha的作用域为[0, 360)。
    beta:以设备坐标系x轴为轴,旋转beta度。beta的作用域为[-180, 180)。
    gamma:已设备坐标系y轴为轴,旋转gamma度。gamma的作用域为[-90, 90)。
    absolute:返回一个布尔值,反映设备是否返回绝对值。
    compassCalibrated:返回一个布尔值,反映设备的罗盘是否校准了
     
    devicemotion 事件用来检测设备运动情况,例如手机正在下落或者被人拿着走路。有四个属性值:
    acceleration — An object containing x, y, and zproperties that tells you the acceleration in each dimension without considering gravity.
    accelerationIncludingGravity  — An object containing x, y, and zproperties that tells you the acceleration in each dimension, including the natural acceleration of gravity in the z-axis.
    interval  — The amount of time, in milliseconds, that will pass before another devicemotionevent is fired. This value should be constant from event to event.
    rotationRate  — An object containing the alpha, beta, and gammaproperties that indicate device orientation.
    使用前需要检测是否为null,因为不一定能提供相应数据                                                                                                              //fire the event
     
    // 横屏监听
    var updateOrientation = function() {
    if(window.orientation=='-90' || window.orientation=='90'){
         $('.landscape-wrap').removeClass('hide');
         console.log('为了更好的体验,请将手机/平板竖过来!');
    }else{
         $('.landscape-wrap').addClass('hide');
         console.log('竖屏状态');
    }
    };
    window.onorientationchange = updateOrientation;
  • 相关阅读:
    TextBox换行C#文本框换行.net文本框换行textarea换行
    日期控件 My97DatePicker WdatePicker 日期格式
    Python之面向对象:继承
    Python之面向对象:封装
    Python之面向对象:方法
    Python之面向对象:属性
    Python之面向对象:面向对象基础
    插入排序
    冒泡排序
    Python 安装MySQLdb模块遇到报错及解决方案:_mysql.c(42) : fatal error C1083: Cannot open include file: 'config-win.h': No such file or directory
  • 原文地址:https://www.cnblogs.com/chuangweili/p/5166254.html
Copyright © 2011-2022 走看看