无法将单击事件添加到列表项

时间:2013-07-14 02:35:51

标签: javascript html javascript-events

这是我第一次尝试使用Javascript和HTML。我正在尝试将点击事件添加到有序列表中的列表项中,但是我正在做的事情的某些方面是行不通的。有人可以为我阐明这一点吗?

我在我的head中创建了一个函数,该函数应该将指定列表的列表项上的所有点击事件委托给给定的函数,并且在该给定函数中,我尝试用文本提出一个简单的警报。项目清单。最终我想做更多,但我只是想让简单的点击事件先工作。

<html>
    <head>
    <script type="text/javascript">
      // Attach an event handler to the 'topfriends' list to handle click events.
      function attachEventHandlerToList() {
          document.getElementById("#top4list").delegate("li", "click", function(clickEvent) {
              alert(this.innerHTML());
          });
        }
    </script>
</head>

<body>

    <div id="topfriends">
        <h3>Top 4 Most Friendable Friends</h3>
        <ol id="top4list" onload="attachEventHandlerToList()">
            <li>Brady</li>
            <li>Graham</li>
            <li>Josh</li>
            <li>Sean</li>
        </ol>
    </div>
</body>

5 个答案:

答案 0 :(得分:17)

让我们做这样的事情

<ul id="parent-list">
    <li id="a">Item A</li>
    <li id="b">Item B</li>
    <li id="c">Item C</li>
    <li id="d">Item D</li>
    <li id="e">Item E</li>
    <li id="f">Item F</li>
</ul>

现在为此写

的javascript
<script type="text/javascript">
    // locate your element and add the Click Event Listener
    document.getElementById("parent-list").addEventListener("click",function(e) {
        // e.target is our targetted element.
                    // try doing console.log(e.target.nodeName), it will result LI
        if(e.target && e.target.nodeName == "LI") {
            console.log(e.target.id + " was clicked");
        }
    });
</script>

请参阅Javascript事件代表的这篇文章 http://davidwalsh.name/event-delegate

此外,链接下面是我创建的小提琴 http://jsfiddle.net/REtHT/

希望这有帮助!

答案 1 :(得分:7)

delegate()是一个不推荐使用的jQuery方法,普通JS中不存在这样的方法 要在JS中附加事件处理程序,您需要使用addEventListener,对于旧版本的IE,您还需要attachEvent,这就是为什么跨浏览器事件处理程序有点棘手。
onclickonmouseenter等适用于所有浏览器,但使用addEventListener / attachEvent会更好。

此外,您必须在将元素添加到DOM后运行脚本,否则它们不可用。通常的方法是在元素之后插入脚本,或者使用DOM ready事件处理程序。

<html>
<head>
    <title>test</title>
</head>

<body>

<div id="topfriends">
  <h3>Top 4 Most Friendable Friends</h3>
  <ol id="top4list">
    <li>Brady</li>
    <li>Graham</li>
    <li>Josh</li>
    <li>Sean</li>
  </ol>
</div>

<script type="text/javascript">
    var lis = document.getElementById("top4list").getElementsByTagName('li');

    for (var i=0; i<lis.length; i++) {
        lis[i].addEventListener('click', doStuff, false);
    }

    function doStuff() {
        alert( this.innerHTML );
    }
</script>
</body>

FIDDLE

答案 2 :(得分:0)

尝试一下。它也将与子节点和父节点一起工作。

buildscript {
    repositories {
        jcenter()
        maven {
            url 'https://maven.fabric.io/public'
        }
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.google.gms:google-services:3.2.1'
        classpath 'io.fabric.tools:gradle:1.25.4'


        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
 var visitorList = document.getElementById("visitor");
        visitorList.addEventListener("click", function (e) {
            var visitorId;
            if (e.target && e.target.nodeName == "LI") {
                visitorId = e.target.id;
                console.log(e.target.id);
            }
            if(e.target && e.target.nodeName == "H1") {
                visitorId = e.srcElement.parentElement.id;
                console.log(e.srcElement.parentElement.id);
            }
            //console.log(visitorId);
        });

答案 3 :(得分:0)

您也可以使用 querySelectorAll

  <ul class="stuffList">
    <li>Stuff 1</li>
    <li>Stuff 2</li>
    <li>Stuff 3</li>
    <li>Stuff 4</li>
    <li>Stuff 5</li>
  </ul>
    
<script type="text/javascript">
    document.querySelectorAll('ul.stuffList li').forEach((item) => {
        item.addEventListener('click', (e) => {
            console.log(e.target)
        })
    });
</script>

答案 4 :(得分:-1)

您好,为什么不通过onClick

替换onLoad directy来更轻松
<script type="text/javascript">
function olClicked(){
alert(this.innerHTML());
}
</script>
<ol id="top4list" onClick="olClicked()">