【问题标题】:Jquery .click not working after adding html programatically以编程方式添加 html 后,Jquery .click 不起作用
【发布时间】:2013-12-11 07:22:49
【问题描述】:

我正在用 asp.net 开发一个网络应用程序。我正在使用 jquery 以编程方式在#messages-list 中添加/附加消息,它显示得很好,但是我想在单击消息时显示一个从右侧流出的 div。我添加了 .click 事件,但它不起作用。奇怪的是,当我粘贴静态/手动 html 代码并注释以编程方式附加 html 的 jquery 部分时,单击工作正常,我不知道问题出在哪里。此外,chrome控制台没有错误。请帮忙。我的代码如下。

我的 html 代码

<ul id="messages-list">
</ul>
<div id="MessagePane" style="height: 666px; display: none;">
   <div class="inner-pane">
      <div style="overflow: hidden;">
         <a href="#" class="floatleft next-step message-close" data-pane="MessagePane">Close</a>
         <a class="floatright" id="message-detail-date">July 9, 2013</a>
      </div>
      <div class="clear"></div>
      <h4 id="message-detail-title">Important Message: Pinapple Shortage</h4>
      <p id="message-detail-content">
         Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla fermentum ornare dui sed commodo. Class aptent taciti sociosqu ad litora torquent. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla fermentum ornare dui sed commodo. Class aptent taciti sociosqu ad litora torquent. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla fermentum ornare dui sed commodo. Class aptent taciti sociosqu ad litora torquent. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla fermentum ornare dui sed commodo. Class aptent taciti sociosqu ad litora torquent.<br>
      </p>
      <p>
         Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla fermentum ornare dui sed commodo. Class aptent taciti sociosqu ad litora torquent.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla fermentum ornare dui sed commodo. Class aptent taciti sociosqu ad litora torquent.Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla fermentum ornare dui sed commodo. Class aptent taciti sociosqu ad litora torquent.
      </p>
   </div>
</div>

我的 javascript/jquery 部分

  $("ul#messages-list").append('<li><a href="#" class="arrow-list message" data-pane="MessagePane"><div><div msgggggg</div></a></li>');

  $('.arrow-list.message').click(function () {
      alert('dsad');
      $(this).parent().siblings().find('a').removeClass('transparent');
      $(this).addClass('transparent');
      var height = $('#body_inner').outerHeight();

      if ($('#' + $(this).data('pane')).is(":visible")) {

          $('#' + $(this).data('pane')).hide('slide', {
              direction: 'right'
          }, 300).css('height', height).show('slide', {
              direction: 'right'
          }, 500);
      } else {
          $('#' + $(this).data('pane')).css('height', height).show('slide', {
              direction: 'right'
          }, 500);
      }
  });

  $('.message-close').click(function () {
      $('.message').removeClass('transparent')
      $('#' + $(this).data('pane')).hide('slide', {
          direction: 'right'
      }, 500);
  });

【问题讨论】:

标签: javascript jquery asp.net html jquery-ui


【解决方案1】:

由于 .arrow-list.message 元素是动态创建的,因此您需要使用事件委托将事件处理程序注册到这些元素。

当您使用$('.arrow-list.message').click(....); 注册事件处理程序时,它将仅将句柄注册到在代码执行时已存在于 dom 中的那些元素,在您的情况下,因为这些元素是在处理程序之后创建的不会附加到新创建的元素上

试试这个

    $(document).on('click','.arrow-list.message',function () {
            alert('dsad');
            $(this).parent().siblings().find('a').removeClass('transparent');
            $(this).addClass('transparent');
            var height = $('#body_inner').outerHeight();

            if ($('#' + $(this).data('pane')).is(":visible")) {

                $('#' + $(this).data('pane')).hide('slide', {
                    direction: 'right'
                }, 300).css('height', height).show('slide', {
                    direction: 'right'
                }, 500);
            } else {
                $('#' + $(this).data('pane')).css('height', height).show('slide', {
                    direction: 'right'
                }, 500);
            }
        });

        $(document).on('click','.message-close',function () {
            $('.message').removeClass('transparent')
            $('#' + $(this).data('pane')).hide('slide', {
                direction: 'right'
            }, 500);
        });

【讨论】:

  • @Sridhar R 非常感谢您!我是 jQuery 和 Javascript 的新手。您能否建议我提供有关事件处理程序如何在以编程方式修改的 dom 上工作的信息链接?即究竟为什么 .on() 有效,为什么 .click() 无效?
【解决方案2】:

使用on 方法:

$(document).on('click','.arrow-list.message', function() {...

【讨论】:

  • 为什么 OP 应该使用这种方法?请解释问题以及您的答案如何解决问题。
【解决方案3】:

使用 Jquery Live 点击

$('document').live('click', function {...});

【讨论】:

  • jQuery .live 自 jQuery 1.9 以来已被弃用并且不再存在。
  • 它已被弃用,所以不要使用它
  • live() 已弃用。
  • 使用 $(document).bind('click', function {...});而是
【解决方案4】:

也试试这个..

$(function(){
    $('.arrow-list.message').click(function () {

    });

    $('.message-close').click(function () {

    });
});

【讨论】:

  • 为什么 OP 应该尝试这个?请解释问题以及您的答案如何解决问题。
猜你喜欢
  • 1970-01-01
  • 2015-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 2016-02-02
  • 2020-05-12
  • 2011-11-08
相关资源
最近更新 更多