You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何通过表单获取并保存用户昵称?

自定义元素表单无法获取用户输入的昵称并输出

我正在实现一个功能,允许用户提交昵称并在后续JavaScript代码中保存使用。通过自定义元素创建了表单,显示正常,但点击确认按钮后控制台无输出,无法获取用户输入的昵称,怀疑问题出在saveName()方法,不清楚如何获取用户实际输入的内容。

原代码如下:

const template = document.createElement('template')

template.innerHTML = `
  <div>
  <form id="createName">
    <label for="name">Write your name here:</label>
    <input type="text" id="name">

    <button id="confirm">Confirm</button>
  </form>
  </div>
`

class createName extends HTMLElement {
  constructor() {
    super()

    this.attachShadow({ mode: 'open' });
    this.shadowRoot.appendChild(template.content.cloneNode(true));

  }

  saveName() {
    let nickname = this.shadowRoot.querySelector('#name').value
    console.log(nickname)
  }

  connectedCallback() {
    this.shadowRoot.querySelector('#confirm').addEventListener('click', () => this.saveName())
  }
}

window.customElements.define('name-form', createName)

问题原因

按钮默认的type是submit,点击后会触发表单的默认提交行为,导致页面刷新,console.log的内容还没来得及在控制台显示就被页面刷新覆盖了,并非saveName()方法获取不到输入值。

解决方案

有两种办法解决这个问题:

方法一:阻止表单的默认提交行为

修改saveName方法,添加事件参数并调用preventDefault():

saveName(e) {
  e.preventDefault(); // 阻止表单默认提交行为
  let nickname = this.shadowRoot.querySelector('#name').value
  console.log(nickname)
}

// 同时修改事件监听的传参
connectedCallback() {
  this.shadowRoot.querySelector('#confirm').addEventListener('click', (e) => this.saveName(e))
}

方法二:修改按钮的type为button

直接在模板里给按钮添加type="button",让它不再触发表单提交:

<button id="confirm" type="button">Confirm</button>

两种方法都能解决页面刷新的问题,此时点击确认按钮就能在控制台看到输入的昵称了。如果需要后续保存昵称,可以将nickname存储到localStorage或者组件的属性中,比如:

saveName(e) {
  e.preventDefault();
  let nickname = this.shadowRoot.querySelector('#name').value
  localStorage.setItem('userNickname', nickname); // 保存到localStorage
  console.log('昵称已保存:', nickname)
}

内容的提问来源于stack exchange,提问作者TeaTime

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:40:23