jQuery Mobile动态列表项上的点击事件

4

我无法从列表项中获取点击事件。在这个页面:

http://bec-systems.com/list-click.html

列表中的前几个条目会触发点击事件。但是,如果通过点击“刷新更新列表”按钮动态添加3个事件,接下来的3个列表条目将不会生成点击事件。

感谢任何关于如何使其正常工作或改进代码的建议。

谢谢, Cliff

以下是代码:

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Status</title> 
    <meta name="viewport" content="width=device-width, initial-scale=1"> 
  <link rel="stylesheet" href="http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.css" />
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    <script src="http://code.jquery.com/mobile/1.1.1/jquery.mobile-1.1.1.min.js"></script>
  <script type="text/javascript">
$(document).ready(function() {
  $("#refreshUpdateButton").on("click", function(event, ui) {
    console.log("refreshUpdateButton")

    versions = ["0.3", "0.4", "0.5"]

    for (var i=0; i < versions.length; i += 1) {
      $("#updateVersionsList").append('<li><a id="updateVersionItem-' + (i+3) + '">' + versions[i] + '</a></li>');
      if ($("#updateVersionsList").hasClass('ui-listview')) {
        $("#updateVersionsList").listview("refresh");
      } else {
        $("#updateVersionsList").trigger('create');
      }
    }

  })

  $('[id^=updateVersionItem]').on("click", function(event, ui) {
    console.log("updateVersion, selected = " + $(this).attr('id'));
  })

});

  </script>
</head> 
<body> 

<!-- Software update page -->
<div data-role="page" id="software-update-page">
    <div data-role="header">
        <h1>Software Update</h1>
    </div><!-- /header -->
    <div data-role="content">   
    <h1>Select Software version:</h1>
    <ul data-role="listview" id="updateVersionsList">
      <li><a id="updateVersionItem-0">0.0</a></li>
      <li><a id="updateVersionItem-1">0.1</a></li>
      <li><a id="updateVersionItem-2">0.2</a></li>
    </ul>
    <br>
    <a data-role="button" class="ui-btn-left" id="refreshUpdateButton">Refresh Update list</a>
    </div><!-- /content -->
</div>

</body>
</html>

点击后应该发生什么?我在前三个上没有看到任何反应。 - zod
@zod,请在浏览器上打开开发者工具并切换到控制台选项卡。点击前三个选项卡以查看相关信息。 - saluce
2个回答

7
使用这种形式的.on()(如下所述的评论)。
  $(document).on("click", '[id^=updateVersionItem]', function(event, ui) {
    console.log("updateVersion, selected = " + $(this).attr('id'));
  })

示例: http://jsfiddle.net/saluce/YaAEJ/

否则,每当您动态添加新元素时,需要将点击事件附加到这些项。

假设以下代码:

function doThisOnClick(event, ui) {
    console.log("updateVersion, selected = " + $(this).attr('id'));
}

$('[id^=updateVersionItem]').on("click", doThisOnClick);

你可以解除处理程序绑定并重新附加到所有匹配的项:
$('[id^=updateVersionItem]').off("click", doThisOnClick);
$('[id^=updateVersionItem]').on("click", doThisOnClick);

或者只需在您添加它时动态地将其添加到新项目中:
$("#updateVersionsList").append('<li><a id="updateVersionItem-' + (i+3) + '">' + versions[i] + '</a></li>').on("click", doThisOnClick);

.live() 已经在 jQuery 1.7 中被弃用,目前仍然打包在 jQuery 中,但将会被移除。不过你可以像这样使用 .on() 来完全替代 .live()$(document).on('click', '[id^=updateVersionItem]', function () {...})。此外,委托事件处理程序绑定到根选择的元素,在 .live() 的情况下,即为 document 元素。因此,.live() 不会自动绑定到添加到 DOM 中的元素,它会绑定到始终存在于 DOM 中的元素,并检查 event.target 属性以检测是否对委托元素进行了操作。 - Jasper
@Jasper 谢谢,很有用的信息!我已经相应地更新了我的答案。 - saluce
还有一件事,.unbind()已经被替换为.off()以保持与新的.on()方法的一致性。.unbind()并没有被计划移除,但现在它只是.off()的一个快捷方式。 - Jasper
@Jasper 再次感谢,目前我一直在使用 jQuery 1.4.4,因为这是我们应用程序使用的版本,所以我还没有熟悉 1.7+ 版本中的内容。 - saluce

0
创建一个新的函数并调用它来处理默认和动态元素。
<a onclick="myfunction()">

你的意思是将它添加到你为他们生成的HTML中吗?我认为被接受的答案更整洁。 - Rup
通过从 DOM(原始或附加的)调用函数,您可以跳过附加 jQuery 处理程序。编辑:我同意已接受的答案,只是发布了一个不同的解决方案。 - George-Paul B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接