【问题标题】:Dynamically writing out li with jquery. Element is not clickable after being written用 jquery 动态写出 li。元素写入后不可点击
【发布时间】:2011-06-02 21:59:58
【问题描述】:

我有一个函数,当检查复选框时,我动态地将li写入为空的OL。

代码:

$(":checkbox").click(function() {
    var checkedState = $(this).is(':checked');
    if (checkedState == true) {
       var productName = $(this).attr("title");
       $("#selectedProductsList").append("<li class=\"productList " + this + "\"><p class=\"removeIcon\"><img src=\"images/remove-icon.png\" alt=\"Remove Product\" /></p><span class=\"productName\">"+ productName +"</span></li>");
    };
});

然后,当它写出来时,会出现一个删除图标,单击该图标会从 ol 中删除该项目。这个移除图标有一个 removeIcon 类,可以在上面的动态 li 中看到。

我有一个处理删除调用的函数,然后执行一些操作: 代码:

$('.removeIcon').click(function() {
 alert("starting");
});

现在我有删除操作只是试图提醒它被调用的消息。但似乎它没有进入功能。

除了 .click 方法之外,我是否需要通过某种方式访问​​这些动态 li?我看到了这个帖子: Dynamically Inserted DOM Elements are not Clickable using $.click()

他们在哪里添加 .live 和 .click,但这似乎也不起作用。

有什么想法吗?

【问题讨论】:

    标签: jquery dynamic checkbox click html-lists


    【解决方案1】:

    尝试使用直播活动...

    $(".removeIcon").live("click", function () {
        alert("starting");
    }
    

    【讨论】:

    • 这行得通,我没有实时功能的“点击”部分。
    • @estern 太好了,这是我处理此问题的首选方法
    【解决方案2】:

    您需要将live() 用于动态添加的元素($(":checkbox").live('click', ...)),因为click() 只会运行一次,并且只会捕获到此时存在的元素。

    【讨论】:

      【解决方案3】:

      使用.delegate() 而不是live()

      $('#selectedProductsList').delegate('.removeIcon','click',function() {
         alert("starting");
      });
      

      使用.live() 会非常浪费,因为您的目标元素似乎都在同一个容器中。

      【讨论】:

      • @estern:当然。它们几乎相同,因为它们都使用“事件委托”,这意味着事件处理程序放置在容器上,并且该处理程序处理冒泡到该容器的事件。但是.delegate()只需要处理#selectedProductsList的点击,而.live()需要处理整个页面的点击。 live() 方法非常流行,在我看来,它是 API 中最不幸的部分之一,因为它并不能真正描述实际发生的事情。在我看来,永远不要使用.live()
      • 哇,感谢您提供的所有这些重要信息。感谢您花时间为我解释这些。
      【解决方案4】:

      如果有想法,为什么不将按钮放在对象中?这里有一个小例子(没有测试它可以帮助你提出一个想法,但应该可以)

      $(":checkbox").click(function() {
          var checkedState = $(this).is(':checked');
          if (checkedState == true) {
             var productName = $(this).attr("title");
             var product = $('<li class="productList"><span class="productName">'+ productName +'</span></li>"'); // create a object off the product
             var removeButton = $('<p class="removeIcon"><img src="images/remove-icon.png" alt="Remove Product" /></p>'); // create a object off the image aswell
             // now i can add a event to the object 'removeButton', in the same way what u did earlier(like $('.removeIcon'))
             removeButton.bind('click', function() {
                  alert("This click function works");
             });
      
             // now add the remove button in front off the <span class="productName">
             // im using prepend because that function adds HTML in front off the object
             // append adds HTML at the end.
      
             product.prepend(removeButton);
      
      
             // put the product in your HTML
             $("#selectedProductsList").append(product);
          };
      });
      

      【讨论】:

      • 感谢您的想法,我认为我现在将与类保持相同的图像方法,但这听起来也可以。
      • @estern,谢谢.. 这样您就可以将所有代码放在 :checked click 函数中,这样它就有条理了。 $('.removeIcon').click(function.... 的问题是,当你设置这个时,每个 removeIcon 点击​​都会被覆盖/重置(因为它已经存在于 HTML 中),这就是你想要的吗?但如果另一个对你有用,应该这样做:) 祝你好运
      猜你喜欢
      • 1970-01-01
      • 2013-10-06
      • 2011-01-25
      • 2015-03-14
      • 1970-01-01
      • 2011-10-09
      • 2013-05-27
      • 2016-05-03
      • 2011-04-02
      相关资源
      最近更新 更多