JavaScript事件

事件的类型:
  鼠标事件,键盘事件,进度事件,表单事件,突变事件(修改DOM节点间时发生),触摸事件,错误事件(出错时发生)

window对象的load事件在页面加载时触发,unload事件在页面卸载时触发(用户关闭浏览器,或转向另一个页面),window对象的事件处理程序实际上放在<body>开标记中。

<body onl oad="function()"  onunload="function()">

将代码连接到事件

  1.通过HTML属性处理事件

    将this作为参数传递给函数的时候,这时候参数名一般取为that

//使用event判断事件类型
    <p ondblclick="handle(event)">paragraph</p>
    <h1 onclick="handle(event)">heading 1</h1>
    <span onm ouseover="handle(event)">special text</span>
        function handle(e){
            if(e.type == "mouseover"){
                alert("you move the mouse on the div")
            }
            else if(e.type == "click"){
                alert("you had click the div")
            }
        }

  2通过对象属性处理事件

    把对象的事件处理程序属性设置为前面定义的函数

function(){
    XXX
}
document.getElementById("XXX").onclick = function;

    删除事件处理程序只需要把null赋予事件处理程序属性即可。

标准事件模型

    DOM标准定义了一个对象EventTarget,其作用是定义一种标准的方式,为目标上的事件动态添加和删除监听器,DOM中的每个元素节点都是一个EventType。

    DOM标准还定义了一个Event对象,该对象提供了触发事件的元素信息,并允许在脚本中获取该元素。它提供了一组规则,以标准的方式确定何种元素生成事件,生成何种类型事件,以及何时触发。如果要在脚本中使用Event对象(下面有详细介绍),则必须将它作为参数,传入与事件处理程序关联的函数。

//标准事件方式
        var h_link = document.getElementById("h")
        h_link.addEventListener("click",function(e){
            var new_node = document.createElement("h2")
            var new_text = document.createTextNode("hello hello")
            new_node.appendChild(new_text)
            h_link.appendChild(new_node)
            e.preventDefault()   //禁止发送默认操作的标准方式
        })

注销事件监听器:

removeEventListener()

一个元素可以注册多个事件监听器,这些监听器按他们注册的顺序执行。

Event对象(使用事件数据)这是一个全局对象

   属性:

    1.bubbles      表示是否允许事件冒泡

    2.cancelable       表示是否可以取消事件的默认行为

    3.currentTarget      事件在DOM中传递时,指定事件的当前目标

    4.defaultPrevented   表示在事件上是否调用preventDefault()

    5.eventPhase      表示事件当前处于事件流的哪个阶段

    6.target        该属性表示引发事件的元素

    7.timestamp      表示事件发生的时间

    8.type        表示事件的名称

MouseEvent对象

  属性:

    1.altKey        表示事件发生时,是否按下alt键

    2.ctrlKey          表示事件发生时,是否按下Ctrl键            

    3.metaKey       表示事件发生时,是否按下meta键

    4.shiftKey         表示事件发生时,是否按下shift键

    5.button        表示按下鼠标的哪一个按钮

    6.clientX        表示事件发生时,鼠标指针在浏览器窗口中的水平坐标

    7.clientY        表示事件发生时,鼠标指针在浏览器窗口中的垂直坐标

    8.srceenX        表示事件发生时,鼠标指针相对于屏幕坐标原点的水平坐标

    9.srceenY        表示事件发生时,鼠标指针相对于屏幕坐标原点的垂直坐标

      10.relatedTarget     用于标识第二个事件目标。对于mouseover事件,该属性表示鼠标指针退出的元素。

.  事件:

    1.click事件

    2.mousedown事件

    3.mouseup事件

    4.mouseover事件(指针移入)

    5.mouseout事件(指针移出)

    6.mousemove事件(指针位于元素上方)

 KeyboardEvent对象:

  属性:

    1.altKey  是否按下alt键  2.ctrlKey  同上  3.metaKey  同上  4.shiftKey  同上  

    5.charCode  用于keypress事件,键的Unicode号  6.keyCode  按下的键,依赖系统和浏览器的数码

 旧版本IE的事件处理,使用attchEvent()和detachEvent()事件来替代addEventListener()和removeEventListener(),使用srcElment代替target属性同时,传递参数的时候,需要加上“on”前缀,具体见图片

if(typeof(addEventListener) != "undefinded"){
        use addEventListener
    }else{
        use attachEvent
    }
// 函数功能实现
    var evt ={
        addlistener: function(obj,type,fn){
            if(obj.addEventListener){
                obj.addEventListener(type,fn)
            }else{
                obj.attachEvent("on"+type,fn)
            }
        },
        removeListener: function(obj,type,fn){
            if(obj.removeEventListener){
                obj.removeEventListener(type,fn)
            }else{
                obj.detachEvent("on"+type,fn)
            }
        },
        getTarget: function(e){
            if(e.target){
                return e.target
            }else{
                return e.srcElement
            }
        },
        preventDefault: function(e){
            if(e.preventDefault){
                e.preventDefault()
            }else{
                e.returnValue = false
            }
        }
    };

如果是在一个a标签上添加事件,可以使用obj.preventDefault(e)方法来阻止a标签的默认跳转行为。

内置拖放操作

  拖动源事件:

    1.dragstart:开始拖动时在元素上触发。从文件系统中拖动一个对象,不会触发该事件。

    2.drag:拖动对象的过程中一直触发。

    3.dragend:拖动操作结束时触发,无论是否释放了该对象。

    4.dragenter:拖动的过程中,鼠标第一次移入目标元素时触发。

    5.dragover:拖动过程中,鼠标移动到元素上时,在目标上触发。

    6.dragleave:拖动过程中,鼠标离开目标时,在目标上触发。

    7.drop:鼠标释放对象时,在目标上触发。

//释放对象
        function drapDropHandler(e){
            e.preventDefault()
            //dropover的默认行为必须被禁止,才能出发drop事件
            if(e.type == "dragover"){
                dropStatus.innerHtml = "you'ra dragging over the drop zone!"
            }else{
                dropStatus.innerHtml = "you dropped something!"
            }

            var dropZone = document.getElementById("dropZone")
            var dropStatus = document.getElementById("dropStatus")

            dropZone.addEventListener("dragover",drapDropHandler)
            dropZone.addEventListener("drop",drapDropHandler)
                
        }

传输数据

  拖放操作就是传递数据。拖放规范定义了DataTransfer对象,使用event对象的dataTransfer属性可以访问这个对象。

  在dragstart事件处理程序中使用DataTransfer对象的setData()方法设置数据,在drop事件中使用getData()方法读取数据。

  getData()方法只带一个参数,调用setData()时使用的数据类型。

//传递数据
        function drapDropHandler(e){
            e.preventDefault()
            //dropover的默认行为必须被禁止,才能出发drop事件
            function dragStartHadler(e){
                e.dataTransfer.setData("text","drag and drag!")
            }
            if(e.type == "dragover"){
                dropStatus.innerHtml = "you'ra dragging over the drop zone!"
            }else{
                dropStatus.innerHtml = e.dataTransfer.getData("text")
            }

            var dragBox = document.querySelectorAll("[draggable]")
            var dropZone = document.getElementById("dropZone")
            var dropStatus = document.getElementById("dropStatus")

            dragBox.addEventListener("dragstart",dragStartHadler)
            dropZone.addEventListener("dragover",drapDropHandler)
            dropZone.addEventListener("drop",drapDropHandler)
                
        }

使用元素的on属性,可以把函数连接到元素的事件处理程序上,但是这么做会混合HTML和JavaScript,不建议使用。

 

上一篇:松软科技web教程:JavaScript HTML DOM 事件监听器


下一篇:JavaScript学习——事件处理程序