【问题标题】:Dynamically added element is forcing a reload动态添加的元素正在强制重新加载
【发布时间】:2020-04-21 21:57:50
【问题描述】:

我有一个表格,里面有一系列元素。 我已经注册了一些事件处理程序,并通过注入新的 html 来动态添加这些元素。

一切都适用于原始元素,但是当我添加一个新的(动态创建的元素)并触发一个新创建的事件处理程序时,页面似乎强制重新加载并且我丢失了所有数据/内容。

这是一个简化版:

               <table id="asset-table" border="0" cellpadding="0" cellspacing="0" width="100%">
                  <tr class="asset-row">
                    <td align="center" style="padding-bottom: 32px;">
                      <form id="asset-title" class="asset-title">
                        <input type="text" placeholder="Add Asset Title Here ..." id="title-input1" />
                        <input id="title-submit" class="submit" type="submit">
                      </form>

                      <p id="asset-title-replacement" style="text-align: center; display: none;"><strong></strong></p>
                   </td>
                  </tr>
                </table>

            <button id="add-asset-button">Add Asset</button>

事件处理程序

 // asset title load
  $('#asset-table').on("submit", '.asset-title',  function (event) {
    event.preventDefault();
    console.log("asset-title");
    let text = $(this).find('#title-input1').val();
    let td = $(this).children().first()
    td.find('.asset-title').hide();
    td.find('.asset-title').next('p').text(function () {
      return text
    }).css("font-weight", "Bold");
    td.find('.asset-title').next('p').show()
  });

添加新元素:

$('#add-asset-button').click(function () {
    console.log("adding asset");
    $('#asset-table').append("<tr class='asset-row'><td align='center' style='padding-bottom: 32px;'><form id='asset-title' class='asset-title'><input type='text' placeholder='Add Asset Title Here ...' id='title-input1' /><input id='title-submit' class='submit' type='submit'></form><p id='asset-title-replacement' style='text-align: center; display: none;'><strong></strong></p>/td></tr>")
  })

因此,当动态添加元素时,一切都按计划进行,一旦我与添加新“标题”进行交互并单击提交,页面似乎会重新加载,并且我会丢失之前处理的所有“状态”和内容。

我遇到的问题是 eventHandler 绑定到#asset-table,所以当创建动态元素时,“this”关键字绑定到#asset-table 元素,那么我如何指定哪个我正在为那个活动工作??

【问题讨论】:

  • 在委派事件时'.assetTitle'不应该是'#asset-title',没有具有assetTitle类的元素
  • 加上添加下一行时,您必须再次附加事件。最好创建一个模块来创建您的元素并附加事件侦听器
  • .on() 方法将事件绑定到父级,因此应该处理。
  • @BenMuller true,但如果在附加侦听器后该父级本身以编程方式附加,则不是。
  • 我不是以编程方式附加父母,而是附加孩子......

标签: javascript html jquery eventhandler


【解决方案1】:

您将拥有多个具有相同 id 的表单,尽管这不是主要问题。您也在听 .assetTitle 而不是 .asset-title 并且您的听众错了,这是主要问题。当你这样做时:

 $('.asset-row').on("submit", '.assetTitle',  function (event) {
   ...
 })

jQuery 只会监听 .asset-row 中的表单提交,当监听器被附加时当前存在。以编程方式创建的所有后续带有 .asset-titles(不是 .assetTitle)的 .asset-rows 都没有附加侦听器。相反,您需要将其应用于附加侦听器时存在的元素,然后侦听其中的任何以编程方式创建的元素,如下所示。请注意,我已将 .assetTitle 更改为 .asset-title。

 $('#asset-table').on("submit", '.asset-title',  function (event) {
    ...
 })

Fiddle

【讨论】:

  • 抱歉,打错了。我确实有你说的。
  • @BenMuller 你检查过小提琴吗?表单未提交并且控制台记录“asset-title”,这意味着事件处理程序已正确附加。我不考虑在那之后会发生什么,因为您的问题是关于无意提交的表单。
  • 是的,谢谢,这确实解决了部分问题,如果您可以查看我的上次编辑,我已经添加了与“this”相关的问题的进一步说明
  • @BenMuller mmk,此时已完成帮助。我已经解决了您损坏的处理程序的问题,并将提交的文本应用于相邻的 p (我猜这是您想要做的,因为您的原始问题中没有上下文)。在 Stack Overflow 上学习的关键是提出一个特定的问题(而不是用新信息对其进行编辑),得到一个答案,并在该答案的基础上进行自己的学习。除了您的问题中所述之外,没有人可以“猜测”您正在尝试做什么。您希望事件处理程序阻止表单提交。我的回答不仅如此。
  • @BenMuller $(this) 未绑定到您的处理程序中的#asset-table,顺便说一句,这在小提琴中很明显。祝你好运。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 2023-03-18
  • 2011-12-22
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
相关资源
最近更新 更多