函数适用于普通 <li> 但不适用于脚本创建的

Function works for the normal <li> but doesn't work for the ones created by script

这是一个html的站点

<!DOCTYPE html>
<html>

<head>
<title>Login Page</title>

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.11.3.min.js"></script>
<script src="jquery.cookie.js"></script>
<link rel="stylesheet" type="text/css" href="loginStyle.css">
</head>

<body>
<div class="login">
    <input type="text" value="Please, give us your name" id="name">
    <h3 id="name_txt">Log in</h3>
    <h4 id="pilot_txt">Choose your pilot.</h4>
    <ul id="pilots">
    </ul>
</div>
<script src="loginScript.js"></script>
</body>

</html>

这里是 loginScript.js :

var uriPilots = '../api/pilots';


$("ul#pilots li").click(function(){
        var t = $(this).text();
        $.cookie("pilot", t);
        $("#pilot_txt").text(t);
    })


$(document).ready(function () {
  // Send an AJAX request
  $.getJSON(uriPilots)
      .done(function (data) {
        // On success, 'data' contains a list of products.
        $.each(data, function (key, item) {
          // Add a list item for the product.
          $('<li>', { text: formatItemProduct(item) }).appendTo('#pilots');
        });
      });
});

function formatItemProduct(item) {
  return item.Name;
}

现在,问题出在第一个函数上。它应该是,当用户单击在第二个函数中从服务器加载的 <li> 元素时,创建一个 cookie 来存储被单击的 <li> 的文本(我更改 "#pilot_txt" 只是为了能够更容易地检查它是否有效)。

有趣的是,如果我手动添加一个 <li> 元素,一切都会完美无缺,但对于从服务器加载的元素,它不会。

如有任何帮助,我将不胜感激。

在处理由 javascript 生成的新鲜 DOM 时,您应该使用事件委托 on() :

$('body').on('click', "ul#pilots li", function(){
    var t = $(this).text();
    $.cookie("pilot", t);
    $("#pilot_txt").text(t);
})

希望对您有所帮助。

您还应该将事件与该元素的父元素绑定,即在您的情况下为 ul#pilot。

$('ul#pilots').on('click', 'li', function(e) {
    var t = $(this).text();
    $.cookie("pilot", t);
    $("#pilot_txt").text(t);});

使用事件委托

$('body').on('click', "ul#pilots li", function () {
    var t = $(this).text(); $.cookie("pilot", t);
    ("#pilot_txt").text(t);
})