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

如何用纯JavaScript实现输入框键入时自动添加不可删除的固定前后缀

纯JavaScript固定前后缀输入框实现方案

核心逻辑

  • 预定义固定前后缀,限制光标仅可在前后缀之间的区域移动、编辑
  • 拦截删除、选中操作,禁止修改前后缀内容
  • 实时校验输入内容,仅保留前后缀时自动清空输入框
  • 无需额外表单校验弹窗,前后缀直接显示在输入框内

完整实现代码

HTML部分

<!-- 用户名输入框 -->
<input type="text" id="usernameInput" placeholder="请设置用户名">

JavaScript部分

const usernameInput = document.getElementById('usernameInput');
// 可自定义固定前后缀
const FIXED_PREFIX = '用户_';
const FIXED_SUFFIX = '_官方';
const FIXED_TOTAL_LENGTH = FIXED_PREFIX.length + FIXED_SUFFIX.length;

// 重置输入框为空
const resetEmpty = () => {
  usernameInput.value = '';
};

// 拼接完整输入内容并定位光标
const setInputContent = (userContent) => {
  usernameInput.value = `${FIXED_PREFIX}${userContent}${FIXED_SUFFIX}`;
  // 光标自动定位到用户输入内容的末尾
  const cursorPos = FIXED_PREFIX.length + userContent.length;
  usernameInput.setSelectionRange(cursorPos, cursorPos);
};

// 聚焦时强制光标落在可编辑区域
usernameInput.addEventListener('focus', () => {
  const valLength = usernameInput.value.length;
  if (valLength === 0) return;
  const cursorPos = valLength - FIXED_SUFFIX.length;
  usernameInput.setSelectionRange(cursorPos, cursorPos);
});

// 拦截按键操作,禁止修改前后缀
usernameInput.addEventListener('keydown', (e) => {
  const selectStart = usernameInput.selectionStart;
  const selectEnd = usernameInput.selectionEnd;
  const valLength = usernameInput.value.length;
  const editableEndPos = valLength - FIXED_SUFFIX.length;

  // 处理全选操作:仅选中中间可编辑部分
  if ((e.ctrlKey || e.metaKey) && e.key === 'a') {
    e.preventDefault();
    usernameInput.setSelectionRange(FIXED_PREFIX.length, editableEndPos);
    return;
  }

  // 禁止删除前后缀
  if (
    (e.key === 'Backspace' && selectStart <= FIXED_PREFIX.length) ||
    (e.key === 'Delete' && selectEnd >= editableEndPos)
  ) {
    e.preventDefault();
    return;
  }

  // 禁止光标移动到前后缀区域
  if (['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) {
    setTimeout(() => {
      const newSelectStart = usernameInput.selectionStart;
      const newSelectEnd = usernameInput.selectionEnd;
      const adjustStart = Math.max(FIXED_PREFIX.length, newSelectStart);
      const adjustEnd = Math.min(editableEndPos, newSelectEnd);
      usernameInput.setSelectionRange(adjustStart, adjustEnd);
    }, 0);
  }
});

// 实时校验输入内容合法性
usernameInput.addEventListener('input', () => {
  const currentVal = usernameInput.value;
  if (currentVal.length === 0) return;

  // 校验前后缀是否完整
  const hasValidPrefix = currentVal.startsWith(FIXED_PREFIX);
  const hasValidSuffix = currentVal.endsWith(FIXED_SUFFIX);

  if (!hasValidPrefix || !hasValidSuffix) {
    // 提取用户实际输入的内容
    let userContent = currentVal;
    if (userContent.startsWith(FIXED_PREFIX)) userContent = userContent.slice(FIXED_PREFIX.length);
    if (userContent.endsWith(FIXED_SUFFIX)) userContent = userContent.slice(0, -FIXED_SUFFIX.length);
    
    // 无实际内容则清空输入框
    if (userContent.trim().length === 0) {
      resetEmpty();
      return;
    }
    setInputContent(userContent);
    return;
  }

  // 仅剩下前后缀时清空输入框
  if (currentVal.length === FIXED_TOTAL_LENGTH) {
    resetEmpty();
    return;
  }
});

// 提交时直接取value即可得到完整用户名
const getFinalUsername = () => usernameInput.value;

使用说明

  • 自行修改FIXED_PREFIX和FIXED_SUFFIX的值即可设置你需要的固定前后缀
  • 所有编辑操作都会自动保留前后缀,用户无法删除或修改前后缀内容
  • 用户删除全部自定义内容后,输入框会自动清空,不会残留前后缀
  • 提交表单时直接读取输入框的value属性即可得到完整的带前后缀的用户名,无需额外拼接

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 23:54:04