DOM-事件 | 捕获 | 冒泡 | 兼容 |

My Work...

DOM0 事件和DOM2级在事件监听使用方式上有什么区别?

DOM 0 级事件是基于元素内联属性或DOM元素命名的元素的概念,例:
<pre>
<input type="button" onclick="clickMe();" />
</pre><pre>
input.onclick = function() { ... };
</pre>

  • 通过这种方式绑定的事件,是元素的属性,当再一次给同一个节点元素绑定另外一个属性方法的时候,前一个属性的方法将会被覆盖,也就是只能指定一次,其次此时事件处理程序是在元素的作用域里中运行,所以此时this指向的是元素本身。
  • DOM 0是在标准DOM定义之前内置到浏览器中的专用命令。它们都被标准- DOM所取代,但仍然在浏览器中工作,只是为了支持早期Netscape浏览器编写的脚本。
    <pre>
    var btn = document.getElementById('id'); btn.addEventListener('click',function() { //do sth }) //通过这种方式指定的事件处理程序能更灵活,最明显的区别就是能够同时绑定多个不同的事件处理程序,并且不相干涉。
    </pre>
  • DOM级别2,有了一个更加标准化的方法来管理事件,增加了一个监听器,可使用addEventListenerremoveEventListener (所有DOM节点都包含这2种方法)

attachEvent与addEventListener的区别?

  • IE并不支持addEventListener方法,而是实现了类似的方法
  • attachEvent
  • attachEvent是IE的事件处理程序,当使用node.attachEvent('on'+type,handler)时,要在事件类型前面加上on,其次IE的事件处理程序只能触发在冒泡阶段,还有就是当我们使用IE的事件处理程序添加事件时,其处理的先后顺序是后添加的先执行,并且当处理程序的作用域是window即this指向的是window.

解释IE事件冒泡和DOM2事件传播机制?

  • IE事件的传播机制只有冒泡阶段,即从目标元素向父元素传播一直传播到window停止,当传播的过程中如果监听到了相同的事件类型酒会一并触发,即从最具体的元素开始触发,一直到最外层的元素.
  • DOM2事件传播机制包括事件的,从window开始 -> 捕获阶段 -> 到达目标元素 -> 冒泡阶段 -> 再到达最外层的 window,并且在addEventListener(type,function(){},true(为捕获阶段)/false(默认为冒泡阶段触发))。

如何阻止事件冒泡? 如何阻止默认事件?

  • 阻止事件冒泡
  • stopPropagation(停止传播)
    <pre>
    document.body.addEventListener('click',function(){ console.log('Body') }) document.querySelector('.container').addEventListener('click',function(){ console.log('Container') }) document.querySelector('.box').addEventListener('click',function(){ console.log('Box') }) document.querySelector('button').addEventListener('click',function(e){ e.stopPropagation() //冒泡会被阻止 console.log('Button') })
    </pre>
  • 阻止默认事件
  • preventDefault
    form表单、a链接 都是有默认事件,点击链接会默认跳转到
    该功能:可监听到提交,先阻止提交,验证是否符合条件
    符合,即继续下一步
    <pre>
    document.querySelector('button').addEventListener('click',function(e){ e.preventDefault() console.log('Button') })
    </pre>

<pre>a链接标签添加:href="javascript:void(0)"</pre>


有如下代码,要求当点击每一个元素li时控制台展示该元素的文本内容。不考虑兼容

<pre>
<ul class="ct"> <li>这里是</li> <li>饥人谷</li> <li>前端6班</li> </ul> <script> //todo ... </script>
</pre><pre>
var storage = document.querySelector('.ct') //找到目标的父容器. storage.addEventListener('click',function(e){ console.log(e.target.innerText)//获取目标事件的文本内容(innerHTML) })
</pre>


补全代码,要求:

  • 当点击按钮开头添加时在<i>这里是</li>元素前添加一个新元素,内容为用户输入的非空字符串;当点击结尾添加时在最后一个 li 元素后添加用户输入的非空字符串.
  • 当点击每一个元素li时控制台展示该元素的文本内容。
    <pre>
    <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>
    </pre><pre>
    var ct = document.querySelector('.ct') //这是ul容器 var startBtn = document.querySelector('#btn-add-start') //前按钮 var endBtn = document.querySelector('#btn-add-end') //后按钮 var content = document.querySelector('.ipt-add-content')//input startBtn.addEventListener('click',function(){ if ( !(/^\s+$/.test(content.value)) && content.value != "") {//不是以0开头和结尾&值不等于空 var newLi= document.createElement('li') //创建新的Li元素 newLi.innerText = content.value //input值赋予 ct.insertBefore(newLi, ct.firstChild); //添加到ct首子元素 } else { console.log('内容为空'); } }) endBtn.addEventListener('click', function() { if ( !(/^\s+$/.test(content.value)) && content.value != "") { var newLi = document.createElement('li') newLi.innerText = content.value ct.appendChild(newLi) } else { console.log('内容为空') } }) document.getElementsByTagName('ul')[0].addEventListener('click', function(e) { console.log(e.target) })
    </pre>

补全代码,要求:当鼠标放置在li元素上,会在img-preview里展示当前li元素的data-img对应的图片。

<pre>
<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>
</pre><pre>
<style> .ct { margin: auto; max-width: 200px; } .img-preview { margin: auto; max-width:300px; max-height:300px; } img { display:none; width: 100%; } .show { display:block; } </style> <script> var img = document.createElement('img') var img_ct = document.querySelector('.img-preview') img_ct.appendChild(img) // img_ct.appendChild(img) var ul = document.querySelector('ul') ul.addEventListener('mouseover', function(e) { var att = e.target.getAttribute('data-img')//获取到data-img的值 img.setAttribute('src',att) // img.classList.add('show') }) ul.addEventListener('mouseout', function(e) { img.classList.remove('show') }) </script>
</pre>


Addevent Compatible IE

<pre>
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; } 在取消事件处理程序的时候 function removeEvent(node, type, handler) { if (!node) return false; if (node.removeEventListener) { node.removeEventListener(type, handler, false); return true; } else if (node.detachEvent) { node.detachEvent('on' + type, node[type + handler]); node[type + handler] = null; } return false; } //event arguments for IE function getEvent(e) { return e || window.event; } function getTarget(e) { return e.target || e.scrElement; } function preventDefault(e) { if (e.preventDefault) e.preventDefault(); else e.returnValue = false; } function stopPropagation(e) { if (e.stopPropagation) e.stopPropagation(); else e.cancelBubble = true; }
</pre>


End.. Watch Out !!

  1. var insertedNode = parentNode.insertBefore(newNode, referenceNode);
  2. let attribute = element.getAttribute(attributeName);
  3. element.setAttribute(name, value);
  4. const elementClasses = elementNodeReference.classList;
  5. Uncaught SyntaxError: Unexpected token -

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

推荐阅读更多精彩内容

  • 问答 一、dom对象的innerText和innerHTML有什么区别? innerTextinnerText是一...
    婷楼沐熙阅读 395评论 0 0
  • 1.dom对象的innerText和innerHTML有什么区别? innerText是一个可写属性,返回元素内包...
    GarenWang阅读 446评论 0 0
  • 题目1: DOM0 事件和DOM2级在事件监听使用方式上有什么区别? Dom0级Dom0级事件处理程序是将一个函数...
    QQQQQCY阅读 314评论 0 0
  • 不知道自己要什么,只能任人摆布。
    颖仔心随阅读 77评论 0 0
  • 拨通电话的时候,姐正在上着班。待我说明意图,她先是推托半天,在我的坚持下,终于应允。 我说:“找时间请咱爸妈...
    沉入海底的鱼阅读 335评论 1 1