JavaScript动态删除元素! removeChild

问题描述 投票:0回答:2

我对编码非常陌生!!我使用的技术是物化和原始js。我创建了一个物化按钮来打开模型。模型中的表单是接受用户输入的表单,然后在触发Submit btn时将输入文本放置到主页上。然后我有一个按钮,应该删除/删除发布的输入。因此,我遇到的问题是链接到应该删除/删除儿童的按钮的javascript无法正常工作。请帮助:)

// ----------------Models Materialize Framework----------------
document.addEventListener('DOMContentLoaded', () => {
    var elems = document.querySelectorAll('.modal');
    var instances = M.Modal.init(elems);
  });




//Delete From The Dom
const delExerciseBtn = document.querySelector('.del-exercise-btn');

delExerciseBtn.addEventListener('click', (e) => {
if(e.target.className == 'delete'){
  const h6 = e.target.parentElement;
  delExerciseBtn.removeChild(h6);
}

});

// Add User's To the Dom.
const addExerciseDom = document.querySelector('.exercise-dom');
const exerciseForm = document.querySelector('.exercises-form');
const disabledExersiceBtn = document.querySelector('.disabled-exersicebtn');


exerciseForm.addEventListener('submit', (e) => {
e.preventDefault();

  // Get Input Value
  const value = exerciseForm.querySelector('input[type="text"]').value;

  // Create Elements
  const h6 = document.createElement('h6');
  
  // Add Content
  h6.textContent = value;
  
  // Append To Dom
  addExerciseDom.appendChild(h6);  

  //Disable Btn
  disabledExersiceBtn.setAttribute('disabled', 'disabled');


});
<html lang="en">
<head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
      <title></title>

      <!-- Google icons -->
      <link href="https://fonts.googleapis.com/icon?family=Material+Icons"
      rel="stylesheet">

      <!-- Compiled and minified CSS -->
      <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css">
  
      <!-- Sytle.css -->
      <link rel="stylesheet" type="text/css" href="style.css">
      
    
</head>
<body>
   
<!----- user's input ------->
<div class="row">
  <div class="col s12 center valign-wrapper center-align">
   <div class=" exercise-dom delete"> <!--Users text input h6----> </div>
   </div>
</div>


<!-- Btn/Modals/form -->
   <div class="row">
   <!-- Dom Btn -->
    <div class="col s12 center ">
      <a href="#exercise" class="btn-floating btn-small darken-4 z-depth-2 black center modal-trigger disabled-exersicebtn">
        <i class="material-icons white-text">add </i>
      </a>
    </div>
    
   <!-- Modal/form -->
  <div class="modal modal-position" id="exercise">
   <div class="modal-content">

    <div class="row exercises-padding">
     <form class="col s12 exercises-form" autocomplete="off">
       <div class="input-field col s10"> 
         <i class="material-icons prefix">fitness_center</i>
          <input type="text" id="autocomplete-input"  class="autocomplete center">
            <label for="autocomplete-input" ><h6>Exercises</h6></label>
       </div>
       <div class="modal-footer">
         <input class="modal-close btn black" type="submit" value="Submit">
       </div>
     </form>
    </div>     
   </div>
  </div>
  
  
<!-- Remove Users Btn -->
  <div class="col s12 center remove-padding">
    <a href="#" class="btn-floating btn-small darken-4 z-depth-2 black center modal-trigger del-exercise-btn">
      <i class="material-icons white-text ">remove </i>
    </a>
  </div>
  
  
     <!-- Compiled and minified JavaScript -->
    <script src="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/js/materialize.min.js"></script>
       
     <!-- app.JavaScript -->
    <script src="app.js"></script>
</body>
</html>
javascript forms button materialize removechild
2个回答
0
投票

更新:

  • 您的HTML中存在嵌套错误,缺少</div>,这就是DOM不包含表单的原因
    1. [通过检查元素使用开发人员工具检查DOM,您会发现结构错误
    2. 例如,您还可以在HTML窗格中使用Codepen的“分析HTML”功能来检查HTML
  • <form>的类为Exercises-form,因此选择器.exercises-form(来自const exerciseForm = document.querySelector('.exercises-form');)找不到该元素,因为CSS类名区分大小写。 exerciseForm然后变为null,这将导致错误Uncaught TypeError: Cannot read property 'addEventListener' of null
  • 删除按钮仍然不起作用。我建议你自己尝试。使用浏览器开发人员工具,尤其是DOM元素检查器和控制台,可以对选择器查询进行交互式测试(并且您可以在控制台中以$0的形式访问在元素检查器中选择的元素)。 Google搜索了很多教程。

附加说明:我监督文件的顶部已经有一个document.addEventListener('DOMContentLoaded', () => {...。您可以将代码放在此处,无需其他DOMContentLoaded事件侦听器(尽管它也不会造成任何伤害)。


原始答案:

您得到

Uncaught TypeError: Cannot read property 'addEventListener' of null

这意味着

const delExerciseBtn = document.querySelector('.del-exercise-btn');

找不到节点并返回null

可能的原因:代码运行太早,浏览器尚未构建DOM。

解决方案:将代码包装在DOMContentLoaded event处理程序中:

window.addEventListener('DOMContentLoaded', (event) => {
    const delExerciseBtn = document.querySelector('.del-exercise-btn');
    // ...
});


0
投票
const h6 = e.target.parentElement;
delExerciseBtn.removeChild(h6);

您正在尝试从按钮中删除其父项。并且您需要从父项中删除按钮。

const h6 = e.target.parentElement;
h6.removeChild(e.target);
© www.soinside.com 2019 - 2024. All rights reserved.