【问题标题】:Uncaught TypeError: Cannot read properties of undefined (reading 'childNode')未捕获的类型错误:无法读取未定义的属性(读取“childNode”)
【发布时间】:2022-01-12 04:20:40
【问题描述】:

您好,我正在尝试为我的表单集遵循以下教程,但我发现部分问题:

container.insertBefore (newForm, addButton)

出现的错误如下:

calculos.js: 195 Uncaught TypeError: Cannot read properties of undefined (reading 'childNode')

我已经尝试了所有方法但找不到 childNode

JS

let parteForm = document.querySelectorAll(".part-form")
let container = document.querySelector("#part-form-container")
let addButton = document.querySelector("#add-form")
let totalForms = document.querySelector("#id_form-TOTAL_FORMS")
let formNum = parteForm.length-1 // Get the number of the last form on the page with zero-based indexing


addButton.addEventListener('click', addForm)

function addForm(){
    //e.preventDefault()
    let newForm = parteForm[0].cloneNode(true)
    let formRegex = RegExp(`form-(\\d){1}-`,'g')
    formNum++
    newForm.innerHTML = newForm.innerHTML.replace(formRegex, `form-${formNum}-`)

    container.insertBefore(newForm, addButton)

    //parentnode.insertbefore(newnode,elnodoantesdelcualseinsertanewnode)
    //#part-form-container.insertbefore(div.part-form,)

    totalForms.setAttribute('value', `${formNum+1}`)
}

HTML


<form method="POST" id="part-form-container">
{% csrf_token %}

<div class="row">
<div class="col-12">
   <div class="card">
        <div class="card-body">
            <div class="row mb-3">
                   <div class="col-md-12">
                    <div class="mb-3">
                       <label for="verticalnav-email-input">Summary</label>                                                               
                     {{presupuestosparteform.resumen}}

                   </div>
                 </div>
               </div>


<h4 class="card-title">Parts list</h4>
<p class="card-title-desc">Add the parts that you need to include.</p>

<input type="button" class="btn btn-block btn-default btn-success mb-4" id="add-form" onclick="addForm()" value="+ Add part" />
<div class="table-responsive">
<table class="table table-bordered table-nowrap align-middle" id="childTable1">
                                                                                
<tbody>
{{ formset.management_form }}
{% for form in formset %}
<div class="part-form">
        <tr>
           <td>
                                                                                        
                   {{form.codigo}}

                    </td>
                     <td>
                                                                                        
                   {{form.descripcion}}

                  </td>

                 </tr>
               </div>
             {% endfor %}

           </tbody>
       </table>
</form>

【问题讨论】:

  • 你有container.insertBefore(newForm, addButton) - 只有当addButtoncontainer 的直接子代时才有效,但不是。有一堆未关闭的 div 没有帮助。
  • 谢谢!它奏效了

标签: javascript html jquery django


【解决方案1】:

也许我不明白你的代码,但对我来说似乎缺少一些关闭的“div”标签。我的建议是重组你的代码并清理它。

现在关注这个错误

(https://developer.mozilla.org/en-US/docs/Web/API/Node/insertBefore):

Node接口的insertBefore()方法在之前插入一个节点 引用节点作为指定父节点的子节点。

您只需要确保 cointer 包含您之前要插入的元素,所以我认为只需关闭打开的 div 标签即可解决。 我还注意到没有Id="id_form-TOTAL_FORMS" 的元素,所以setAttribute 不起作用。

let parteForm = document.querySelectorAll(".part-form")
let container = document.querySelector("#part-form-container")
let addButton = document.querySelector("#add-form")
let totalForms = document.querySelector("#id_form-TOTAL_FORMS")
let formNum = parteForm.length-1 // Get the number of the last form on the page with zero-based indexing


addButton.addEventListener('click', addForm)

function addForm(){
    //e.preventDefault()
    let newForm = parteForm[0].cloneNode(true)
    let formRegex = RegExp(`form-(\\d){1}-`,'g')
    formNum++
    newForm.innerHTML = newForm.innerHTML.replace(formRegex, `form-${formNum}-`)

    container.insertBefore(newForm, addButton)

    //parentnode.insertbefore(newnode,elnodoantesdelcualseinsertanewnode)
    //#part-form-container.insertbefore(div.part-form,)
}
<form method="POST" id="part-form-container">



                <label for="verticalnav-email-input">Summary</label>


          <h4 class="card-title">Parts list</h4>
          <p class="card-title-desc">Add the parts that you need to include.</p>

          <input type="button" class="btn btn-block btn-default btn-success mb-4" id="add-form" onclick="addForm()" value="+ Add part" />
          
<tbody>
  <div class="part-form">
          <tr>
             <td>Data-1</td>
             <td>Data-2</td>
          </tr>
  </div>
</tbody>
</table>
</form>

【讨论】:

  • 好的,我刚刚检查了我的代码,你是对的,我有一个不应该存在的 div。我还修复了insertbefore(),我现在看到的问题是,当我单击数字时,如果数字发生变化,则没有出现新表单,也许是您提到的我缺少的内容:Id =“id_form-TOTAL_FORMS”,所以setAttribute;但这不是我的 totalForms 变量吗?如何实现它以便 setAttribute 工作
  • 很抱歉,我很难以这种方式帮助您。我建议您打开一个 now 问题,使用代码的实时示例详细解释您的问题。肯定有人会帮助你。
猜你喜欢
  • 2021-12-22
  • 2021-12-25
  • 2021-11-24
  • 2021-10-31
  • 2021-11-07
  • 2022-01-17
  • 2023-03-13
  • 2022-01-01
  • 2022-01-10
相关资源
最近更新 更多