我正在尝试使用模板文字在 html 中显示来自 javascript 的文本,但元素未定义,我该怎么办?

i am trying to use template literals to display text from javascript in html but the elements are undefined, what do i do?

我试图在 html 的外部文本 div 中显示名称和选定的形状元素,但它们一直显示为未定义。

here is the Javascript


let ShapeLink = (function(){
//code here!

return {
    initForm: function(frm){
        //code here!
        frm.addEventListener('submit', function(){
          document.getElementById('name').name,
          document.getElementById('shapeSelect').option;
        })
      let display = document.getElementById('outputText').innerHTML = 
  `${this.name} wants to see a ${this.shapeSelect}`;
      console.log(display);
      display.innerHTML =`
        <div id="outputText">
        ${this.name} wants to see a ${this.shapeSelect}
        </div>`

    }
}
})()

这里是 html

<body>
<form>
    <label for="name">Name:</label>
    <input type="text" id="name">
    <label for="shapeSelect">Shape:</label>
    <select name="" id="shapeSelect">
        <option value="">pick a shape</option>
        <option value="square">Square</option>
        <option value="circle">Circle</option>
    </select>
    <input type="submit" value="Submit">
</form>
<div id="outputText"></div>
<svg width=100 height=100></svg>
<script>
    ShapeLink.initForm(document.querySelector("form"));
</script>
</body>

请注意,我需要将所有代码添加到 Javascript 文件中

你应该把所有的 JavaScript 放在一起,没有必要让你的 main 函数成为全局函数。除此之外,依靠 this 会让你陷入痛苦的世界。由于您已经可以通过 frm 访问表单,您也可以直接访问它的 elements 属性 以从您的表单中获取值:

document.addEventListener('DOMContentLoaded', function() {
  const ShapeLink = {
    initForm: function(frm) {
      frm.addEventListener('submit', function(event) {
        event.preventDefault();
        event.stopPropagation();
        let display = document.getElementById('outputText');

        display.innerHTML = `
          <div id="outputText">
            ${frm.elements.name.value} wants to see a ${frm.elements.shapeSelect.value}
          </div>
        `;
      });
    },
  };

  ShapeLink.initForm(document.querySelector('form'));
});
<form>
  <label for="name">Name:</label>
  <input type="text" id="name">
  <label for="shapeSelect">Shape:</label>
  <select name="" id="shapeSelect">
    <option value="">pick a shape</option>
    <option value="square">Square</option>
    <option value="circle">Circle</option>
  </select>
  <input type="submit" value="Submit">
</form>
<div id="outputText"></div>
<svg width=100 height=100></svg>

用变量 value.Here 替换模板文字中的 this this 将指向 form。另外 document.getElementById('name').name, 将给出名称,但你可能需要输入的值 & document.getElementById('shapeSelect').option; 需要替换为 document.getElementById('shapeSelect').value;

表单有一个提交按钮,所以点击它会尝试提交表单。可以使用 event.preventDefault

来阻止表单的默认行为

let ShapeLink = (function() {
  var _name;
  var _selOption;
  return {
    initForm: function(frm) {
      frm.addEventListener('submit', function(e) {
        e.preventDefault();
        // get the value attribute
        _name = document.getElementById('name').value;
        _selOption = document.getElementById('shapeSelect').value;
        //check if name and selected option is not undefined
        if (_name && _selOption) {
          document.getElementById('outputText').innerHTML = `${_name} wants to see a ${_selOption}`;
        }

      })
    }
  }
}())
ShapeLink.initForm(document.querySelector("form"));
ShapeLink.initForm(document.querySelector("form"));
<form>
  <label for="name">Name:</label>
  <input type="text" id="name">
  <label for="shapeSelect">Shape:</label>
  <select name="" id="shapeSelect">
    <option value="">pick a shape</option>
    <option value="square">Square</option>
    <option value="circle">Circle</option>
  </select>
  <input type="submit" value="Submit">
</form>
<div id="outputText"></div>
<svg width=100 height=100></svg>