0

我有一个看起来像这样的页面..

<!DOCTYPE html>
<html>
<head>
  <title>JQM</title>
  <meta charset=utf-8 />
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="http://code.jquery.com/mobile/latest/jquery.mobile.css"> 
  <script src="http://code.jquery.com/jquery-1.8.1.min.js"></script>
  <script src="http://code.jquery.com/mobile/latest/jquery.mobile.js"></script>
  <script>
    $(function(){
      $('[data-role="list-divider"]').toggle(function(){
        $('.'+$(this).attr('data-link')).addClass('show');
        $(this).children().removeClass('ui-icon-plus').addClass('ui-icon-minus');

      },function(){
        $('.'+$(this).attr('data-link')).removeClass('show');
        $(this).children().removeClass('ui-icon-minus').addClass('ui-icon-plus');
      });
    });
  </script>
</head>
<body>

<div data-role="page">
    <div data-role="header">

    </div>
    <div data-role="content">   


    </div>
</div>

</body>
</html>

我正在从内容区域的服务器中动态添加 html。问题是当我动态添加内容时,我在页面上静态创建的 jquery 函数不参与..

<script>
        $(function(){
          $('[data-role="list-divider"]').toggle(function(){
            $('.'+$(this).attr('data-link')).addClass('show');
            $(this).children().removeClass('ui-icon-plus').addClass('ui-icon-minus');

          },function(){
            $('.'+$(this).attr('data-link')).removeClass('show');
            $(this).children().removeClass('ui-icon-minus').addClass('ui-icon-plus');
          });
        });
      </script>

如果我静态添加 html,所有代码都可以正常工作,一切都很好。我的问题是,一旦将 html 从服务器添加到页面,如何使该 jquery 可以运行?

我做了这个并且它工作了,有没有更优雅的方式使用 .on 或者这很好?

//got html blob
  deferred.success(function (res) {

   $(function () {
                $('[data-role="list-divider"]').toggle(function () {
                    $('.' + $(this).attr('data-link')).addClass('show');
                    $(this).children().removeClass('ui-icon-plus').addClass('ui-icon-minus');

                }, function () {
                    $('.' + $(this).attr('data-link')).removeClass('show');
                    $(this).children().removeClass('ui-icon-minus').addClass('ui-icon-plus');
                });
            });
 });
4

5 回答 5

0

您必须使用 jquery.On()方法将处理程序附加到动态添加到页面的内容。检查这个 - .on

像这样的东西可能会起作用(没有测试):-

  $(function(){
      $('[data-role="list-divider"]').on('toggle' ,function(event){
        $('.'+$(this).attr('data-link')).addClass('show');
        $(this).children().removeClass('ui-icon-plus').addClass('ui-icon-minus');

      },function(event){
        $('.'+$(this).attr('data-link')).removeClass('show');
        $(this).children().removeClass('ui-icon-minus').addClass('ui-icon-plus');
      });
    });
于 2012-11-01T18:54:54.570 回答
0

由于 jquery 当前在文档准备好并且您的内容尚未加载但它不会找到元素并连接事件时运行。将您的脚本添加到ajax.success应该可以解决您的问题。

于 2012-11-01T18:59:44.320 回答
0

尝试这个:

    $(function(){
      $(document).on('toggle', '[data-role="list-divider"]', function(){
        $('.'+$(this).attr('data-link')).addClass('show');
        $(this).children().removeClass('ui-icon-plus').addClass('ui-icon-minus');

      },function(){
        $('.'+$(this).attr('data-link')).removeClass('show');
        $(this).children().removeClass('ui-icon-minus').addClass('ui-icon-plus');
      });
    });

虽然没有测试过。对于 on('click') 这通常有效。

您所做的是将“切换”触发器绑定到整个文档( $(document) ),然后检查触发了什么元素。通过这种方式,您可以检测在 DOM 初始化之后创建的元素。

于 2012-11-01T19:00:22.287 回答
0

查看您的代码,我看不到您在哪里动态加载内容。但是,如果您希望该脚本运行。您应该在该脚本前面尝试一个 document.ready()

于 2012-11-01T18:53:46.350 回答
0

您不能将事件处理程序绑定到尚未创建的元素。看看这个:

http://api.jquery.com/on/

于 2012-11-01T18:54:49.530 回答