You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何选择动态创建的Button并绑定事件监听器?

问题原因

你当前代码在页面加载完成后就执行了document.querySelector(".journal-list-entry"),但此时提交按钮还未触发,动态列表项和按钮都还没被创建,所以选择器找不到目标元素,返回undefined,无法绑定事件监听器。另外你这里选的是列表项<li>而非编辑按钮,本身也不符合需求。

解决方案

下面提供两种可行的解决方式:

方案一:创建按钮时直接绑定事件

在动态创建按钮的函数handleSubmitJournalEntry里,刚创建完按钮就直接为其绑定事件监听器,这样按钮被添加到DOM时已经带有事件处理逻辑。

修改handleSubmitJournalEntry函数,在创建按钮后添加事件绑定:

function handleSubmitJournalEntry() {
  event.preventDefault()

  var journalEntryListItemEl = document.createElement("li")
  var journalEntryTextEl = document.createElement("p")
  var journalEntryImageEl = document.createElement("img")
  var journalEntryUpdateButton = document.createElement("button")
  var journalEntryDeleteButton = document.createElement("button")

  journalEntryUpdateButton.textContent = "Edit";
  journalEntryDeleteButton.textContent = "Delete";

  journalEntryListItemEl.classList.add("journal-list-entry")
  journalEntryUpdateButton.classList.add("edit-journal-entry")
  journalEntryDeleteButton.classList.add("delete-journal-entry")

  // 新增:直接为按钮绑定事件
  journalEntryUpdateButton.addEventListener("click", handleUpdateJournalEntry)
  journalEntryDeleteButton.addEventListener("click", handleDeleteJournalEntry)

  journalEntryTextEl.innerHTML = journalTextInputEl.value
  var journalEntryImageURL = journalEntryImageURLEl.value
  journalEntryImageEl.setAttribute("src", journalEntryImageURL)

  var newJournalEntryObj = {
    journalText: journalEntryTextEl,
    journalImage: journalEntryImageEl,
    journalImageURL: journalEntryImageURL
  }

  journalEntryListItemEl.appendChild(newJournalEntryObj.journalText)
  journalEntryListItemEl.appendChild(newJournalEntryObj.journalImage)
  journalEntryListItemEl.appendChild(journalEntryUpdateButton)
  journalEntryListItemEl.appendChild(journalEntryDeleteButton)
  journalListEl.appendChild(journalEntryListItemEl)
}

// 新增删除按钮的处理函数示例
function handleDeleteJournalEntry() {
  // 获取当前按钮所在的列表项并删除
  this.parentElement.remove()
  alert("deleted journal entry!")
}

方案二:事件委托(推荐)

利用事件冒泡机制,给已经存在于DOM中的父元素(比如#journal-list)绑定事件,通过判断点击目标的类名来触发对应逻辑。这种方式无需给每个动态元素单独绑定事件,后续新增的元素也能自动生效。

删除你代码中以下部分:

var updateJournalEntryButton = document.querySelector(".journal-list-entry")

updateJournalEntryButton.addEventListener("click", handleUpdateJournalEntry)

替换为事件委托的代码:

// 给父元素绑定事件
journalListEl.addEventListener("click", function(event) {
  // 判断点击的是编辑按钮
  if (event.target.classList.contains("edit-journal-entry")) {
    handleUpdateJournalEntry(event)
  }
  // 判断点击的是删除按钮
  else if (event.target.classList.contains("delete-journal-entry")) {
    handleDeleteJournalEntry(event)
  }
})

// 修改编辑函数,可通过event获取当前按钮上下文
function handleUpdateJournalEntry(event) {
  // 获取当前按钮所在的列表项
  const currentEntry = event.target.closest(".journal-list-entry")
  // 这里可以添加具体的编辑逻辑,比如获取文本内容等
  alert("updated journal entry!")
}

// 删除按钮的处理函数
function handleDeleteJournalEntry(event) {
  const currentEntry = event.target.closest(".journal-list-entry")
  currentEntry.remove()
  alert("deleted journal entry!")
}

内容的提问来源于stack exchange,提问作者Matthew Abebe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:46:08