开发者问题收集

addEventListener 无法在表单上运行 - vanilla JS

2021-04-14
606

我在一个简单的 rails 项目上制作表单时遇到了麻烦。

基本思路是从表单中获取姓名和日期,然后使用 JS 在同一页面上重新使用它们。稍后我会处理这些信息,确定是否是您的生日,以及距离您的下一个生日还有多少天。

在 localhost 中第一次加载页面时,JS 似乎无法正确加载。它找不到表单。 我在控制台中看到此消息,指的是表单 ID:

Uncaught TypeError: Cannot read property 'addEventListener' of null

如果我第一次填写表单,什么也不会发生。 如果我只是刷新页面,或者第二次提交表单,表单和 JS 就可以正常工作。我的 URI 从 localhost:3000/page 更改为 localhost:3000/page?。 我不知道为什么,我已经在 J​​S 上设置了阻止默认值。

我尝试在 JS 脚本的开头设置一个条件,如果表单存在,则执行您的操作。我没有遇到第一个控制台错误,但脚本在第一次加载页面时仍然不起作用。

感谢您的建议。

表单的 HTML 代码:

<div class="js-form">
        <form id= "new_test_form">
            <div class="mb-3">
                <label for="username" class="form-label"> Your Name</label>
                <input type="text" class="form-control" id="username">
            </div>
            <div class="mb-3">
                <label for="dateinput" class="form-label">Your birth date</label>
                <input type="date" class="form-control" id="dateinput">
            </div>
            <button type="submit" class="btn btn-primary">Submit</button>
        </form>
    </div>
    <div class="results">
    Here will be displayed the results
    </div>

和 JS

console.log('Hello from My bdtest')

const form2 = document.querySelector("#new_test_form");
const result = document.querySelector(".results"); // CSS id selector

if (form2) {
  form2.addEventListener("submit", (event) => {
  event.preventDefault();
  const fn_form = document.querySelector("#username").value
  const age_form = document.querySelector("#dateinput").value
  const nd = new Date(age_form)
  console.log(fn_form);
  console.log(age_form);
  console.log(nd.toDateString());
  result.insertAdjacentHTML("beforeend", `<p> Your Name is <strong>${fn_form}</strong></p>` );
  result.insertAdjacentHTML("beforeend", `Your date of birth is ${age_form}` );
  });
}
2个回答

JS 是否在您的 HTML 之前加载?因此 JS 找不到 #new_test_form。尝试将您的 JS 代码包装在:

document.addEventListener("DOMContentLoaded", function(event) { 
  //do work
});
tihu
2021-04-14

感谢 @tihu 的贡献。 我找到了正确的方向。经过深入研究,我发现了一个更具体的事件需要监听:

document.addEventListener("turbolinks:load", (event) => {
      console.log("Turbolinks turboed ✌");
    });

现在表单一直有效👍,即使在第一页渲染时也是如此。

ioups
2021-04-14