Skip to content

[js] 第97天 写例子说明如何给li绑定事件(ul下有1000+个li)? #969

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
haizhilin2013 opened this issue Jul 21, 2019 · 11 comments
Labels
js JavaScript

Comments

@haizhilin2013
Copy link
Collaborator

第97天 写例子说明如何给li绑定事件(ul下有1000+个li)?

@haizhilin2013 haizhilin2013 added the js JavaScript label Jul 21, 2019
@NicholasBaiYa
Copy link

使用jq
$("ul>li").on("click","function(){}")

@Konata9
Copy link

Konata9 commented Jul 22, 2019

在不考虑任何情况时,直接使用 $('li').addEventListener(event, fun) 就可以对 li 进行事件绑定。

当子元素过多时,可以利用“事件冒泡”在 ul 上进行绑定,实现事件委托。可以利用 event.target 对被触发的子元素进行操作。

document.getElementsByTag('ul')[0].addEventListener('event', (e) => {
	// 利用 e.target 对冒泡上来的元素做区分
	// e.target.nodeName, e.target.id 等
})

参考文章:实例分析JavaScript中的事件委托和事件绑定

@nowherebutup
Copy link

首选事件代理

  <ul>
    <li>1111111111111</li>
    <li>2222222222222</li>
    <li>3333333333333</li>
    <p>44444444444</p>
  </ul>
  <script>
    document.querySelector('ul').addEventListener('click', function (e) {
      if (e.target.tagName === 'LI') {
        // ...
      }
    })
  </script>

@xxf1996
Copy link

xxf1996 commented Jul 22, 2019

用事件委托直接将事件绑定在父元素上,通过target属性判断是否为子元素触发事件;

@xiangshuo1992
Copy link
Contributor

使用jq
$("ul>li").on("click","function(){}")

稍微优化一点点

$(".xxxul").on(".xxxli","click","function(){}")

@LinStan
Copy link

LinStan commented Jul 22, 2019

<ul id = "uu">
<li>aaaa</li>
<li>bbbb</li>
<li>cccc</li>
<li>dddd</li>
</ul>
<script>
//最基础的方法
var ull = document.getElementById("uu");
var list = ull.getElementsByTagName("li");
//给每个li绑定事件
for(var i = 0;i<list.length;i++){
list[i].onclick = function(){
this.style.color = "red";
  }
}
//基于Jquery实现
$("ul>li").on("click",function(){ this.style.color="red" })
//基于事件绑定实现
document.getElementById("uu").addEventListener("click", (e) => {
  if(e.target.tagName==="LI"){
    console.log(e)
    e.target.style.color="red"
  }
})
</script>

@JiangXue93
Copy link

采用事件委托,加switch-case是为了处理不同子元素的事件。

`<ul>
        <li id='1'>1</li>
        <li id='2'>2</li>
        <li id='3'>3</li>
    </ul>
    <script>
        $('ul').click(function(e) {
          switch(e.target.id){
            case '1':
              console.log(1)
              break;
            case '2':
              console.log(2)
              break;
            default:
              console.log('default')
          }
        })
    </script>`

@Drowned-fish
Copy link

这题明显考的是事件委托,利用事件冒泡的原理把事件绑定到父元素,在父元素识别是哪个子元素触发。

@xueweb
Copy link

xueweb commented Dec 22, 2020

难道不toUpcase下吗? 把e.target.tagName 变成大写?

@smile-2008
Copy link

使用jq
$("ul>li").on("click","function(){}")

稍微优化一点点

$(".xxxul").on(".xxxli","click","function(){}")

@xiaoqiangz
Copy link

xiaoqiangz commented Jun 24, 2022

事件委托: ul.addEventListener('click', function(e) {
if (e.target. tagName == 'LI') {
console.log(e.target.innerText)
}
})

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js JavaScript
Projects
None yet
Development

No branches or pull requests