10

这是我第一次尝试将 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>

4

5 回答 5

21

让我们做这样的事情

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

希望这可以帮助 !

于 2013-07-14T03:04:50.823 回答
9

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

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

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

小提琴

于 2013-07-14T02:45:57.920 回答
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>
于 2021-06-21T12:20:34.680 回答
0

尝试这个。它也适用于子节点和父节点。

 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);
        });
<ul id="visitor">
        <li id="a" style="background: #CCCCCC; padding: 10px;"><h1 style="background: #437ba9;">Visitor A</h1></li>
        <li id="b"><h1>Visitor B</h1></li>
        <li id="c"><h1>Visitor C</h1></li>
        <li id="d"><h1>Visitor D</h1></li>
        <li id="e"><h1>Visitor E</h1></li>
        <li id="f"><h1>Visitor F</h1></li>
    </ul>

于 2019-01-14T11:03:37.020 回答
-1

您好,为什么不通过 onClick 直接替换 onLoad 来更轻松

<script type="text/javascript">
function olClicked(){
alert(this.innerHTML());
}
</script>
<ol id="top4list" onClick="olClicked()">
于 2013-07-14T02:41:00.767 回答