将函数的逻辑应用于最初不在HTML脚本中的新创建的HTML

问题描述

我已经为跟踪日常任务的小型应用程序编写了一些代码。我正在使用id = 'active'克隆节点,该节点具有将其传输到另一列的按钮。用于执行此操作的逻辑不适用于从createNewButton1创建的新克隆节点。

<!DOCTYPE html>
<html lang="en">
  <head>
    <Meta charset="UTF-8" />
    <Meta name="viewport" content="width=device-width,initial-scale=1.0" />
    <Meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>Project Board</title>
    <link rel="stylesheet" href="assets/styles/app.css" />
    <script src="assets/scripts/app.js" defer></script>
  </head>
  <body>
  
    <header id="main-header">
      <h1>Project Planner</h1>
    </header>

  <div>
    <section id="active">
      <header>
        <h2>Days</h2>
      </header>
      <ul>
        <li
          id="p4"
          data-extra-info="Super important conference! Fictional but still!"
          class="card"
        >
          <h2>Monday</h2>
        </li>
    </ul>
 </section>
Class ProjectItem {
  constructor(id,updateProjectListsFunction,type) {
    this.id = id;
    this.updateProjectListsHandler = updateProjectListsFunction;
    this.connectMoreInfoButton();
    this.connectSwitchButton(type);
    this.createNewButton1();
  }

  createNew () {
    const newItem = document.getElementById('active').querySelector('li');
    const cln = newItem.cloneNode(true);
    document.getElementById('active').appendChild(cln);
  }


createNewButton1 () {

  const addNewButton = document.getElementById('addButton');
    addNewButton.addEventListener( 'click',this.createNew);
}

导致切换到另一列的按钮使用事件侦听器,这不适用于新克隆的节点。

connectSwitchButton(type) {
    const projectItemElement = document.getElementById(this.id);
    let switchBtn = projectItemElement.querySelector('button:last-of-type');
    switchBtn = DOMHelper.clearEventListeners(switchBtn);
   
    switchBtn.textContent = type === 'active' ? 'Finish' : 'Activate';
    switchBtn.addEventListener(
      'click',this.updateProjectListsHandler.bind(null,this.id)
    );
  }

解决方法

您需要创建一个click事件处理程序,该事件处理程序将调用moveElement。您还需要注意ID,以避免重复:

  createNew () {
    const newItem = document.getElementById('active').querySelector('li');
    const cln = newItem.cloneNode(true);
    cln.id = "p" + (document.querySelectorAll("#active > li").length + 1);
    document.getElementById('active').appendChild(cln);
    cln.addEventListener("click",function() {DOMHelper.moveElement(cln.id,"#finished-projects ul")});
  }

在这里测试:https://jsfiddle.net/gcL6e3kz/

观察:这与您所询问的问题无关,但是如果我在所有卡上单击“完成”,然后单击“添加新”,则它将失败,因为没有要克隆的内容。为此,最好通过模板文字创建一些模板,然后可以使用它们而不必假设至少有一张卡片。编码愉快!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...