Hi FE !
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
Ai
git
前端面试题
前端小tip
  • vite
  • webpack
npm
  • vue2
  • vue3
react
GitHub
  • D008-DOM绑定事件的几种方式★★

D008-DOM绑定事件的几种方式★★

1.在DOM元素中直接绑定

<input type="button" onclick="fn()"/>

<script>
function fn() {
  console.log("执行方法1")
}
</script>

2.在js中直接绑定

document.getElementById('btn').onclick = function() {
  console.log("方法2")
}

绑定事件监听函数

事件监听函数addEventListener() 或attachEvent()

事件监听分别定义了三个时间阶段,依次是:捕获阶段,目标阶段,和冒泡阶段

element.addEventListener(event, function, useCapture)


event:(必需)事件名,支持所有的Dom事件。
function:(必需)指定要事件触发时候执行的函数
useCapture:(可选)指定事件是否在捕获或冒泡阶段执行。true,捕获。false,冒泡。默认false。

element.addEventListener(DOM事件名,事件触发时执行函数,指定是否是冒泡执行 不填时候默认为false false为冒泡)
document.getElementById('btn').addEventListener('onclick','aaa')

function aaa() {
  console.log('123')
}

在ie中,dom事件名必须加on

element.attachEvent('onclick',aaa)

function aaa() {
  console.log('aaaa')
}

所以封装一个通用的就是

//绑定监听事件
function listen(ele,type,fn) {
  if(ele.addEventListener) {
    ele.addEventListener(type,fn)
  } else {
    ele.attachEvent('on'+ type,fn)
  }
}

//解除事件监听
function removeEventHandler(ele,type,fn) {
  if(ele.removeEventListener) {
    ele.removeEventListener(type,fn)
  } else {
    ele.detachEvent('on' + type,fn)
  }
}

let btnInput = document.getElementById('btn');

listen(btnInput,'click',hello1);//添加事件 hello1
listen(btnInput,'click',hello2);//添加事件 hello2

removeEventHandler(btnInput,'click',hello1) //移除事件hello1

由于我们正常写,然后绑定多个事件时候:

let btn1 = document.getElementById('btn1');
btn1.onclick = function() {
  console.log('hello1')
}
btn1.onclick = function() {
  console.log('hello2')
}

我们会发现:常规的事件绑定只执行最后绑定的事件。

所以事件监听的一大优点就是

可以绑定多个事件,并可以解除相应的绑定

事件委托

事件委托就是利用冒泡的原理,把事件加到父元素或祖先元素上,触发执行效果。

let btn6 = document.getElementById('btn6')
document.onclick = function(event) {
  let event = event || window.event;
  let target = event.target || event.srcElement
  if(target == btn6) {
    alert("我是按钮6")
  }
}

通过下面两个例子

let btn1 = document.getElementById('btn1')
let btn2 = document.getElementById('btn2')
let btn3 = document.getElementById('btn3')

item1.onclick = function() {
  console.log('btn1')
}

item2.onclick = function() {
  console.log('btn2')
}

item3.onclick = function() {
  console.log('btn3')
}

但通过事件委托ne

let btn1 = document.getElementById('btn1')
let btn2 = document.getElementById('btn2')
let btn3 = document.getElementById('btn3')

document.addEventListener('click',function(event) {
    let target = event.target
    if(target == btn1) {
      console.log('btn1')
    } else if(target == btn2) {
        console.log('btn2')
    } else if(target == btn3) {
        console.log('btn3')
    }
  })

因此呢,得出

事件委托优点

1.提高JavaScript性能。事件委托可以显著的提高事件的处理速度,减少内存的占用。

那么还有优点吗?

看下面这两个例子:

<ul id="list">
 <li id="item1" >item1</li>
 <li id="item2" >item2</li>
 <li id="item3" >item3</li>
</ul>



let oUl = document.getElementById("list");
let oLi = oUl.getElementsByTagName("li");

for(var i = 0; i < oLi.length; i ++) {
  (function(i) {
    oLi[i].onclick = function() {
      console.log(i)
    }
  }(i))
}

let newLi = document.createElement('li')
let newText = document.createTextNode('item4')
newLi.appendChild(newText);
oLi.appendChild(newLi)

你会发现点击第四个按钮时候是不生效的。。。

但你用事件监听写呢

let oUl = document.getElementById("list");

document.addEventListener('click',function(event) {
    let target = event.target;
    if(target == 'Li') {
      console.log(target.innerHTML)
    }
  })


  let newLi = document.createElement('li');
  let newText = document.createTextNode('item4');

  newLi.appendChild(newText)
  oUl.appendChild(newLi)

item4有事件响应。说明事件委托可以为新添加的DOM元素动态的添加事件。

所以得出

事件委托第二个优点

可以对动态创建的DOM元素进行事件绑定:

Edit this page
最近更新: 2025/6/27 02:24
Contributors: qdleader
qdleader
本站总访问量 129823次 | 本站访客数 12人