【问题标题】:How to attach jQuery pop-up event to dynamically created HTML List如何将 jQuery 弹出事件附加到动态创建的 HTML 列表
【发布时间】:2017-12-17 16:50:30
【问题描述】:

有抱负的开发人员,第一次在 StackOverflow 上发布问题。 研究了该主题,但找不到我的问题的确切答案。

  1. 背景:

  2. 问题:我无法确定附加 popover 事件的确切 JavaScript / jQuery 命令。列表中的所有静态项目都会自动附加弹出事件,但动态创建的项目不会。

    • 我尝试使用 addEventListener();但是 jQuery 没有正确连接。

    • 我最初的假设是,如果动态创建的列表项与静态项具有相同的“类”,那么 popoever 事件也会自动应用于它们。

    • 尝试了这些解决方案,但对我来说没有成功,popover 事件没有正确附加。

    一个。动态创建元素的事件绑定? Event binding on dynamically created elements?

    b.使用 jQuery 将事件附加到动态创建的选择 Attach event to dynamically created chosen select using jQuery

    c。使用 JQuery ajax 在 DOM 操作后附加事件 Attaching events after DOM manipulation using JQuery ajax

  3. 这是 HTML 和 JavaScript:

var qrcodelist = document.getElementById('qrdemo_list');

function myFunction() {
// HTML for testing when device is not connected: comment out when device is connected
var x = document.getElementsByClassName("decode-value-offline")[0].innerHTML;

// Qty and Price text values
var qty_text = 1;
var price_text = '$150';

// Create li 
var entry_li = document.createElement('li');
entry_li.setAttribute("class", "row");

// Create quantity span					
var qty_span = document.createElement('span');
qty_span.setAttribute("class", "quantity");
qty_span.appendChild(document.createTextNode(qty_text));

// Create price span					
var price_span = document.createElement('span');
price_span.setAttribute("class", "price");
price_span.appendChild(document.createTextNode(price_text));

// Create pop btn span
var popbtn_span = document.createElement('span');
popbtn_span.setAttribute("class", "popbtn");
popbtn_span.setAttribute("data-original-title", "");
popbtn_span.setAttribute("title", "");
//popbtn_span.addEventListener( );

// Create a tag inside pop btn
var popbtn_a_span = document.createElement('a');
popbtn_a_span.setAttribute("class", "arrow");
popbtn_span.appendChild(popbtn_a_span);

// Create item span and text node					
var item_span = document.createElement('span');
item_span.setAttribute("class", "itemName");

// Append span to li
entry_li.appendChild(qty_span);
entry_li.appendChild(item_span);
entry_li.appendChild(popbtn_span);
entry_li.appendChild(price_span);

// Create text node and insert qr-code result to li span
item_span.appendChild(document.createTextNode(x));

// Get list node and insert 
var list_node = document.getElementById("qrdemo_list").lastChild;
// alert(list_node);
qrdemo_list.insertBefore(entry_li, qrdemo_list.childNodes[3]);

// Write x to console log
console.log(x);
}

// Popover JavaScript 
$(function() {
  var pop = $('.popbtn');
  var row = $('.row:not(:first):not(:last)');


  pop.popover({
    trigger: 'manual',
    html: true,
    container: 'body',
    placement: 'bottom',
    animation: false,
    content: function() {
      return $('#popover').html();
    }
  });


  pop.on('click', function(e) {
    pop.popover('toggle');
    pop.not(this).popover('hide');
  });

  $(window).on('resize', function() {
    pop.popover('hide');
  });

  row.on('touchend', function(e) {
    $(this).find('.popbtn').popover('toggle');
    row.not(this).find('.popbtn').popover('hide');
    return false;
  });

});
<!-- Shopping Cart List HTML -->

<div class="col-md-7 col-sm-12 text-left">
  <ul id="qrdemo_list">
    <li class="row list-inline columnCaptions">
      <span>QTY</span>
      <span>ITEM</span>
      <span>Price</span>
    </li>
    <li class="row">
      <span class="quantity">1</span>
      <span class="itemName">Birthday Cake</span>
      <span class="popbtn"><a class="arrow"></a></span>
      <span class="price">$49.95</span>
    </li>
    <li class="row">
      <span class="quantity">50</span>
      <span class="itemName">Party Cups</span>
      <span class="popbtn"><a class="arrow"></a></span>
      <span class="price">$5.00</span>
    </li>
    <li class="row">
      <span class="quantity">20</span>
      <span class="itemName">Beer kegs</span>
      <span class="popbtn"><a class="arrow"></a></span>
      <span class="price">$919.99</span>
    </li>
    <li class="row">
      <span class="quantity">18</span>
      <span class="itemName">Pound of beef</span>
      <span class="popbtn"><a class="arrow"></a></span>
      <span class="price">$269.45</span>
    </li>
    <li class="row">
      <span class="quantity">1</span>
      <span class="itemName">Bullet-proof vest</span>
      <span class="popbtn" data-parent="#asd" data-toggle="collapse" data-target="#demo"><a class="arrow"></a></span>
      <span class="price">$450.00</span>
    </li>
    <li class="row totals">
      <span class="itemName">Total:</span>
      <span class="price">$1694.43</span>
      <span class="order"> <a class="text-center">ORDER</a></span>
    </li>
    <li class="row">
      <!-- QR Code Images -->
      <span class="itemName"><img src="img/AppleQRCode.png" width="100" height="100"></span>
      <span class="price"><img src="img/OrangeQRCode.png" width="100" height="100"></span>
    </li>
    <li class="row">
      <!-- device offline testing span -->
      <span class="decode-value-offline">Unknown</span>
    </li>
    <li class="row totals">
      <!-- Button to insert qr-code result to list -->
      <span class="order"><a class="text-center" onclick="myFunction()">Insert</a></span>
      <span class="itemName">Insert QR Code Result</span>
    </li>
  </ul>
</div>

<!-- Popover HTML -->

<!-- The popover content -->

<div id="popover" style="display: none">
  <a href="#"><span class="glyphicon glyphicon-pencil"></span></a>
  <a href="#"><span class="glyphicon glyphicon-remove"></span></a>
</div>

<!-- JavaScript includes -->

<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="assets/js/bootstrap.min.js"></script>
<script src="assets/js/customjs.js"></script>

提前感谢您的大力支持,如果需要更多信息以进行澄清,请与我联系。

【问题讨论】:

  • 请点赞和/或接受并回答。

标签: javascript jquery html twitter-bootstrap shopping-cart


【解决方案1】:

JSF 修复之道:https://jsfiddle.net/0phz61w7/

问题是您需要委托该事件。请执行以下操作:

变化:

pop.on('click', function(e) {
    pop.popover('toggle');
    pop.not(this).popover('hide');
});

收件人:

$(document).on('click', '.popbtn', function(e) {
    pop.popover('toggle');
    pop.not(this).popover('hide');
});

此外,您需要从第 54 行中删除 },就在 console.log(x); 之后。这会引发错误。

上述修改有效,但在提供的代码中,.popbtn 不可见,因为节点为空。所以在提供的 jsfiddle 中,我添加了一个 CSS 规则来包含文本 POPBTN。点击它,我添加到点击事件的警报就会触发。

【讨论】:

  • 在新的委托事件中,添加console.log 以查看在单击.popbtn 时是否可以识别单击事件。如果点击事件被识别,则意味着pop.popover('toggle')或pop.not(this).popover('hide')有问题需要查看。
  • 您的代码存在问题:第 54 行,您有一个结束 } 没有左大括号 - 这是在 console.log(x); 之后应该删除。
  • 嗨!感谢回复。我搞砸了 javascript 并且没有包含按钮单击功能。更新了上面的代码。你认为你可以修改 jsFiddle 代码来适应这种变化吗?尝试了自己,但无法重现预期的结果。非常感谢。 var qrcodelist = document.getElementById('qrdemo_list');函数 myFunction() {
  • 我想几乎就在那里,按照建议修改代码后,我看到事件是通过 Firefox / Firebug 附加的。这是一个屏幕截图。 oi63.tinypic.com/a4wsvq.jpg“点击”警报触发,但按钮添加的“未知”列表项不会出现弹出框。将继续努力。非常感谢。
【解决方案2】:

您需要将 jquery 函数委托给动态创建的 HTML 元素,如下所示:

更改以下行

var pop = $('.popbtn');
var row = $('.row:not(:first):not(:last)');

就像这里给出的:

var pop = $(document).find('.popbtn');
var row = $(document).find('.row:not(:first):not(:last)');

【讨论】:

  • 嗨!真的很感谢回复。尝试了上述更改,但对我没有效果。这是我从 Firefox 开发者版查看时得到的结果。静态内容(生日蛋糕)显示“EV”,但通过“插入按钮”显示的动态内容(未知)没有。 oi68.tinypic.com/33kf820.jpg
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2016-07-29
  • 1970-01-01
相关资源
最近更新 更多