进阶9作业

题目1: DOM0 事件和DOM2级在事件监听使用方式上有什么区别?
<body>
    <input id="btn1" type="button" value="DOM0事件">
    <input id="btn2" type="button" value="DOM2事件">
    <script>
        // 以点击事件为例
        // DOM0 级
        var oBtn1 = document.getElementById("btn1");
        oBtn1.onclick = function() {
            console.log("点击一下");
        }
        oBtn1.onclick = function() {
            console.log("再次点击一下");
        }
        /*  如上面这样写的话,控制台最后显示的是"再次点击一下",  "点击一下"被覆盖掉了。 */

        oBtn1.onclick = null;         // 取消点击事件

        // DOM2 级
        /* addEventListener 和 removeEventListener 
        它们接受三个参数: (1) 事件类型 (2)事件处理方法 (3)布尔参数,如果是true表示在捕获阶段调用事件处理程序,如果是false则是在事件冒泡阶段处理。*/

        var oBtn2 = document.getElementById("btn2");

        oBtn2.addEventListener('click', function() {
            console.log("点击一下");
        }, false);

        oBtn2.addEventListener('click', function() {
            console.log("再次点击一下");
        }, false);
        /* 点击DOM2事件按钮,控制台显示"点击一下", "再次点击一下"。*/

        /* 当移除事件处理程序的时候可以这样写 */
        var handler = function() {
            alert(this.id);
        }
        oBtn2.addEventListener('click', handler, false);
        oBtn2.removeEventListener('click', handler, false);    // 移除处理程序
    </script>
</body>
题目2: attachEvent与addEventListener的区别?
<body>
    <input id="btn" type="button" value="点我">
    <script>
    /* IE并不支持addEventListener和removeEventListener方法,而是实现了两个类似的方法
         (1) attachEvent
         (2) detachEvent
        这两个方法都接收两个相同的参数(1)事件处理程序名称 (2) 事件处理程序方法
        IE6~10 支持, IE11就不再支持了。  同时addEventListener被支持IE9+
    */
        var oBtn = document.getElementById('btn');
        var handler = function() {
            alert("hello world");
        }
        oBtn.attachEvent('onclick', handler);   // 注意是带on的。
        oBtn.detachEvent('onclick', handler);
    </script>
</body>

主要几个区别
1、 参数个数不相同
2、 第一个参数意义不同
3、 事件处理程序的作用域不相同, addEventListener的作用域是元素本身,this是指的触发元素,而attachEvent事件处理程序会在全局变量内运行,this是window
4、 为一个事件添加多个事件处理程序时,执行顺序不同,addEventListener添加会按照
添加顺序执行,而attachEvent添加多个事件处理程序时顺序无规律(添加的方法少的时候大多是按添加顺序的反顺序执行的,但是添加的多了就无规律了),所以添加多个的时候,不依赖执行顺序的还好,若依赖于函数执行顺序,最好自己处理,不要指望浏览器。

题目3: 解释IE事件冒泡和DOM2事件传播机制?

IE事件冒泡: 即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接受,然后
逐级向上传播至最不具体的那个节点(文档)。
DOM2级事件规定事件流包括三个阶段: 事件捕获阶段,处于目标阶段和事件冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接受到事件。最后一个阶段是冒泡阶段。
举列说明

<style>
        .container {
            width: 200px;
            height: 200px;
            border: 1px solid #aaa;
        }
        .box {
            height: 100px;
            background: red;
        }
    </style>
<body class="body">
    <div class="container">
        <div class="box">
            <button class="btn">点我</button>
        </div>
    </div>
    <script>
        function handler() {
            console.log(this.className);
        }
        // 事件冒泡
        document.body.addEventListener('click', handler, false);
        document.querySelector('.container').addEventListener('click', handler, false);
        document.querySelector('.box').addEventListener('click', handler, false);
        document.querySelector('.btn').addEventListener('click', handler, false);
        // 控制台依次显示 "btn" "box" "container" "body"  
        // 可以看出事件在一级一级的向上冒泡。 
        // 事件捕获 将 false 替换成 true。
        document.body.addEventListener('click', handler, true);
        document.querySelector('.container').addEventListener('click', handler, true);
        document.querySelector('.box').addEventListener('click', handler, true);
        document.querySelector('.btn').addEventListener('click', handler, true);
        // 这个时候控制台依次显示 "body" "container" "box" "btn" 从最不具体的到最为具体的      
    </script>
</body>
题目4:如何阻止事件冒泡? 如何阻止默认事件?
function stopPropagation(e) {
    if(e.stopPropagation)
        e.stopPropagation();   
    else
        e.cancelBubble = true;    // 兼容IE
}
function preventDefault(e) {
    if(e.preventDefault)
        e.preventDefault();
    else
        e.returnValue = false;  // 兼容IE  
} 
function getEvent(e) {
    return e || window.event;
}
题目5:有如下代码,要求当点击每一个元素li时控制台展示该元素的文本内容。不考虑兼容
<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
//todo ...
</script>
<script>
        var ct = document.querySelector('.ct');
        ct.addEventListener('click', function(e) {
            var target = e.target;
            if(target.tagName.toLowerCase() === 'li') {
                    console.log(target.innerText);
            }
        }, false);
    </script>
题目6: 补全代码,要求:

当点击按钮开头添加时在<li>这里是</li>元素前添加一个新元素,内容为用户输入的非空字符串;当点击结尾添加时在最后一个 li 元素后添加用户输入的非空字符串.
当点击每一个元素li时控制台展示该元素的文本内容。

<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>任务班</li>
</ul>
<input class="ipt-add-content" placeholder="添加内容"/>
<button id="btn-add-start">开头添加</button>
<button id="btn-add-end">结尾添加</button>
<script>
//你的代码
</script>
    <script>
    function $(id) {
        return document.querySelector(id);
    }
    function $$(id) {
        return document.querySelectorAll(id);
    }
    // 开头添加
    $("#btn-add-start").addEventListener('click', function() {
        var newNode = document.createElement('li');
        if($(".ipt-add-content").value.length !== 0) {
            newNode.innerText = $(".ipt-add-content").value;
            $(".ct").insertBefore(newNode, $(".ct").firstChild);
        }
    }, false);

    // 结尾添加
    $("#btn-add-end").addEventListener('click', function() {
        var newNode = document.createElement('li');
        if($(".ipt-add-content").value.length !== 0) {
            newNode.innerText = $(".ipt-add-content").value;
            $(".ct").appendChild(newNode);
        }
    }, false);

    // 点击每个元素li时控制台展示该元素的文本内容
    $(".ct").addEventListener('click', function(e) {
        var target = e.target;
        if (target.tagName.toLowerCase() === 'li') {
            console.log(target.innerText);
        }
    }, false);
    </script>

效果展示

题目7: 补全代码,要求:当鼠标放置在li元素上,会在img-preview里展示当前li元素的data-img对应的图片。
<ul class="ct">
    <li data-img="1.png">鼠标放置查看图片1</li>
    <li data-img="2.png">鼠标放置查看图片2</li>
    <li data-img="3.png">鼠标放置查看图片3</li>
</ul>
<div class="img-preview"></div>
<script>
//你的代码
</script>
<script>
        var ct = document.getElementsByClassName('ct')[0];
        var imgPreview = document.getElementsByClassName('img-preview')[0];


        function show(e) {
            var e = e || window.event;
            var target = e.target || e.srcElement;
            src = target.getAttribute('data-img');
            imgPreview.innerHTML = "![]( + src + )";
        }

        addEvent(ct, 'click', show);

        function addEvent(node, type, handler) {
            if(!node) return false;
            if(node.addEventListener) {
                node.addEventListener(type, handler, false);
                return true;
            }else if(node.attachEvent) {
                node['e' + type + handler] = handler;
                node[type + handler] = function() {
                    node['e' + type + handler](window.event);
                };
                node.attachEvent('on' + type, node[type + handler]);
                return true;
            }
            return false;
        }
    </script>

效果展示
题目8: 写一篇博客,讲解事件相关知识点,如事件冒泡、捕获、代理、兼容写法等(选做题目)
事件代理

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容