blog icon indicating copy to clipboard operation
blog copied to clipboard

事件(Event)

Open yongheng2016 opened this issue 8 years ago • 0 comments

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

DOM0:行内样式或js标签中直接写事件以及所对应的处理函数,它是一种表达式的写法;所以点遇到同名函数的时候会发生重置;

<button onclick=console.log('a')></button>

DOM2:是一种方法,所以可以重复调用这种方法而不冲突;

  • 标准浏览器:
    • 监听事件:addEventListener( )
    • 删除事件:removeEventListener( ) 事件中的this指的是触发事件的元素
  • 老式IE浏览器(IE8及以下):
    • 监听事件:attachEvent( )
    • 删除事件:detachEvent( ) 事件中的this指向的是window

题目2: attachEvent与addEventListener的区别?

  1. 参数不同:

    • attachEvent 只有两个参数(’onclick‘,handler)
    • addEventListener 有三个参数(‘click’,handler,false/true)
  2. 第一个参数意义不同:

    • attachEvent 第一个参数是事件处理函数名称,如(onclick , onload)
    • addEventListener 第一个参数是事件类型,如(click ,load)
  3. 事件处理的作用域不同:

    • attachEvent 事件处理程序在全局变量內运行,this是window
    • addEventListener 作用域是元素本身,this指的是触发元素
  4. 为一个事件添加多个事件处理程序时,执行顺序不同

    • attachEvent 添加处理程序少的时候,反顺序执行;添加处理程序多的时候,乱序执行(有顺序要求的时候要注意了)
    • addEventListener 按照添加顺序执行

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

  • IE事件冒泡: 事件由开始时由最具体的元素接受,并逐级向上传递到祖先元素

image

  • DOM2事件流 三个阶段:捕获阶段 -> 目标阶段 -> 冒泡阶段

image

题目4:如何阻止事件冒泡? 如何阻止默认事件?

  • IE8及以下浏览器:
    • 阻止事件冒泡:cancelBubble(Boolean) //默认为false,设置为true后可以取消事件冒泡
    • 阻止默认事件:returnValue(boolean) //默认为true,设为false可以取消事件默认行为

IE中所有的事件都包含以下属性方法:

属性/方法

类型

读/写

说明

cancelBubble Boolean 读/写 默认为false,设置为true后可以取消事件冒泡
returnValue Boolean 读/写 默认为true,设为false可以取消事件默认行为
srcElement Element 只读 事件的目标元素
type String 只读 被触发的事件类型
  • 标准浏览器:
    • 阻止事件冒泡:stopPropagation( Function) 例:通过此方法可以阻止事件继续冒泡到祖先元素
var handler = function (e) {
    alert(e.type);
    e.stopPropagation();
}
  • 阻止默认事件:preventDefault(Function) //前提是cancelable值为true

例:阻止链接导航:

document.querySelector('#btn').onclick = function (e){
    e.preventDefault( );
}

DOM事件对象中属性和方法:

属性/方法

类型

读/写

说明

bubbles Boolean 只读 事件是否冒泡
cancelable Boolean 只读 是否可以取消事件的默认行为
currentTarget Element 只读 事件处理程序当前处理元素
detail Integer 只读 与事件相关细节信息
eventPhase Integer 只读 事件处理程序阶段:1 捕获阶段,2 处于目标阶段,3 冒泡阶段
preventDefault() Function 只读 取消事件默认行为
stopPropagation() Function 只读 取消事件进一步捕获或冒泡
target Element 只读 事件的目标元素
type String 只读 被触发的事件类型
view AbstractView 只读 与事件关联的抽象视图,等同于发生事件的window对象

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

<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
//todo ...
</script>

方法1:

<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
var ct = document.querySelector('.ct')
ct.addEventListener('click',outputText)
function outputText(e){
	var e = e || window.event;
	var target = e.target;
	if (target.tagName.toLowerCase()=='li'){
		console.log(e.target.innerText);
	}
}
</script>

方法2:

<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
var lis = document.querySelector('.ct').querySelectorAll('li')
lis.forEach(function (node){
	node.addEventListener('click',outputText)
})
function outputText(){
	console.log(this.innerText)
}
</script>

方法3:

<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
var lis = document.querySelector('.ct').querySelectorAll('li')
for (var i=0; i<lis.length; i++){
	lis[i].addEventListener('click',outputText)
}
function outputText(){
	console.log(this.innerText)
}
</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>

代码:

<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>

	var ct = document.querySelector('.ct')
	var btnAddStart = document.querySelector('#btn-add-start')
	var btnAddEnd = document.querySelector('#btn-add-end')
	var input = document.querySelector('.ipt-add-content')

	btnAddStart.addEventListener('click',addStart)
	btnAddEnd.addEventListener('click',addEnd)
	ct.addEventListener('click',outputText)

	function addStart(){
		var newNode = document.createElement('li')
		var inputValue = input.value
		if (inputValue){
			newNode.innerText = inputValue
			ct.insertBefore(newNode,ct.firstElementChild)
			input.value = ''
		}
	}
	function addEnd(){
		var newNode = document.createElement('li')
		var inputValue = input.value
		if (inputValue){
			newNode.innerText = inputValue
			ct.appendChild(newNode,ct.lastElementChild)
			input.value = ''
		}
	}

	function outputText(e){
		var e = e || window.event
		var target = e.target
		if (target.tagName.toLowerCase()=='li'){
			console.log(target.innerText)
		}
	}

</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>

方法1:

<ul class="ct">
    <li data-img="http://wx2.sinaimg.cn/mw690/b9d0abb5ly1fgita9h88oj211e0hd44r.jpg">鼠标放置查看图片1</li>
    <li data-img="http://wx4.sinaimg.cn/mw690/b9d0abb5ly1fgita94hdbj211c0h87bz.jpg">鼠标放置查看图片2</li>
    <li data-img="http://wx1.sinaimg.cn/mw690/b9d0abb5ly1fgita8jq7lj211c0h8jxq.jpg">鼠标放置查看图片3</li>
</ul>
<div class="img-preview"></div>
<script>

	var divPreview = document.querySelector('.img-preview')
	console.log(divPreview)
	var lis = document.querySelectorAll('li')
	console.log(lis)
	lis.forEach(function (li){
		li.addEventListener('mouseenter',preViewImage)
	})
	function preViewImage(){
		divPreview.innerHTML = ''
		var newNode = document.createElement('img')
		var dataImg = this.getAttribute('data-img')
		newNode.setAttribute('src',dataImg)
		divPreview.append(newNode)
	}

</script>

方法2:

<ul class="ct">
    <li data-img="http://wx2.sinaimg.cn/mw690/b9d0abb5ly1fgita9h88oj211e0hd44r.jpg">鼠标放置查看图片1</li>
    <li data-img="http://wx4.sinaimg.cn/mw690/b9d0abb5ly1fgita94hdbj211c0h87bz.jpg">鼠标放置查看图片2</li>
    <li data-img="http://wx1.sinaimg.cn/mw690/b9d0abb5ly1fgita8jq7lj211c0h8jxq.jpg">鼠标放置查看图片3</li>
</ul>
<div class="img-preview"></div>
<script>

var ct = document.querySelector('.ct')
var divPreview = document.querySelector('.img-preview')
ct.addEventListener('mouseover',preViewImage)
function preViewImage(e){
	divPreview.innerHTML = ''
	var e = e || window.event
	var target = e.target
	var newNode = document.createElement('img')
	var dataImg = target.getAttribute('data-img')
	newNode.setAttribute('src',dataImg)
	divPreview.append(newNode)
}

</script>

方法3:

<ul class="ct">
    <li data-img="http://wx2.sinaimg.cn/mw690/b9d0abb5ly1fgita9h88oj211e0hd44r.jpg">鼠标放置查看图片1</li>
    <li data-img="http://wx4.sinaimg.cn/mw690/b9d0abb5ly1fgita94hdbj211c0h87bz.jpg">鼠标放置查看图片2</li>
    <li data-img="http://wx1.sinaimg.cn/mw690/b9d0abb5ly1fgita8jq7lj211c0h8jxq.jpg">鼠标放置查看图片3</li>
</ul>
<div class="img-preview"></div>
<script>

	var lis = document.querySelectorAll('li')
	var divPreview = document.querySelector('.img-preview')
	for (var i=0; i<lis.length; i++){
		lis[i].addEventListener('mouseenter',preViewImage)
	}
	function preViewImage(){
		divPreview.innerHTML = ''
		var newNode = document.createElement('img')
		var dataImg = this.getAttribute('data-img')
		newNode.setAttribute('src',dataImg)
		divPreview.append(newNode)
	}

</script>

yongheng2016 avatar Jun 22 '17 09:06 yongheng2016