javascript-事件流

2020-01-12  本文已影响0人  ssttIsme

javascript-事件流

当页面元素触发事件的时候,该元素的容器以及整个页面都会按照特定顺序(如由下往上)响应改元素
的触发事件,事件传播(发生)的顺序叫做事件流。
事件流是一直存在的,并不是因为添加了事件才存在。

一、事件流的分类

1.1冒泡型事件(所有浏览器都支持)

由明确的事件源到最不确定的事件源依次向上触发
addEventListener(事件,处理函数,false)

<!DOCTYPE html>
<html lang="en" onclick="show('html')">
<head>
    <meta charset="UTF-8">
    <title>javascript事件流</title>
    <style>
        li{
            border: 1px solid #0f0;
        }
        ul{
            border: 1px solid #f0f;
        }
        div{
            border: 1px solid #000;
        }
        body{
            padding: 5px;
            border: 1px solid #f00;
        }
        html{
            border: 1px solid #00f;
        }
    </style>
</head>
<body onclick="show('body')">
<div onclick="show('div')">
    <ul onclick="show('ul')">
        <li onclick="show('li')">第1个</li>
        <li onclick="show('li')">第2个</li>
        <li onclick="show('li')">第3个</li>
    </ul>
</div>
<script>
    function show(text) {
        alert(text);
    }
    document.onclick=function () {
        show('document');
    }
</script>
</body>
</html>

点击如何一个li,依次弹出li,ul,div,body,html,document


1.2捕获型事件(IE不支持,WC3C标准的浏览器如火狐支持)

不确定的事件源到明确的事件源依次向下触发
addEventListener(事件,处理函数,true)

<div id="outer" style="border: 1px solid #f00; width: 200px; height: 200px; padding: 10px;">
    <div id="inner" style="border: 1px solid #00f; width: 100px; height: 100px; padding: 10px; "></div>
</div>
<script>
    var outer=document.getElementById("outer");
    var inner=document.getElementById("inner");
    outer.addEventListener("click",function () {
        alert(this.id);
    },true);
    inner.addEventListener("click",function () {
        alert(this.id);
    },true);
</script>

点击蓝色方框,先弹出outer,再弹出inner

二、阻止事件流

事件对象.cancelBubble=true(IE)
事件对象.stopPropagation()(火狐)

<!DOCTYPE html>
<html lang="en" onclick="show(event,'html')">
<head>
    <meta charset="UTF-8">
    <title>javascript事件流</title>
    <style>
        li{
            border: 1px solid #0f0;
        }
        ul{
            border: 1px solid #f0f;
        }
        div{
            border: 1px solid #000;
        }
        body{
            padding: 5px;
            border: 1px solid #f00;
        }
        html{
            border: 1px solid #00f;
        }
    </style>
</head>
<body onclick="show(event,'body')">
<div onclick="show(event,'div')">
    <ul onclick="show(event,'ul')">
        <li onclick="show(event,'li')">第1个</li>
        <li onclick="show(event,'li')">第2个</li>
        <li onclick="show(event,'li')">第3个</li>
    </ul>
</div>
<script>
    function show(event,text) {
        alert(text);
        if(event.stopPropagation){
            event.stopPropagation();
        }else{
            event.cancelBubble=true;
        }
    }
    document.onclick=function () {
        show('document');
    }
</script>
</body>
</html>

三、目标事件源的对象

事件对象.srcElement(IE)
事件对象.target(火狐)

<div>
    <ul onclick="show(event)">
        <li >第1个</li>
        <li >第2个</li>
        <li >第3个</li>
    </ul>
</div>
<script>
    function show(event) {
        var object=event.srcElement||event.target;
        alert(object.innerHTML);
    }
</script>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>学生成绩单</title>
    <style>
        table{
            margin: 0 auto;
        }
    </style>
</head>
<body>
<table border="1px" width="600px" cellpadding="0" cellspacing="0px" id="scoreList">
    <caption>学生成绩单</caption>
    <tr><th>姓名</th><th>班级</th><th>科目</th><th>成绩</th></tr>
    <tr>
        <td>张三</td>
        <td>1班</td>
        <td>语文</td>
        <td>98</td>
    </tr>
    <tr>
        <td>李四</td>
        <td>2班</td>
        <td>语文</td>
        <td>97</td>
    </tr>
    <tr>
        <td>王五</td>
        <td>3班</td>
        <td>语文</td>
        <td>99</td>
    </tr>
</table>
<script>
    var table=document.getElementById("scoreList");
    table.onclick=function(e){
        var ev=e||window.event;
        var td=ev.srcElement||ev.target;
        if(td.nodeName=="TH"||td.nodeName=="CAPTION"){
            return;
        }
        var tdText=td.innerHTML;
        td.innerHTML="";
        var inputs=document.createElement("input");
        inputs.type="text";
        inputs.size=10;
        td.appendChild(inputs);
        inputs.focus();

        inputs.onblur=inputs.ondblclick=inputs.onkeydown=function(e){
            var ev=e||window.event;
            if(ev.type=="blur"||ev.type=="dbclick"||(ev.type=="keydown"&&ev.keyCode==13)){
                 var val=this.value;
                 td.removeChild(inputs);
                 if(val==""){
                     td.innerHTML=tdText;
                 }else{
                     td.innerHTML=val;
                }
            }
        }

    }
</script>
</body>
</html>
上一篇下一篇

猜你喜欢

热点阅读