前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库HTML input type url validation protocol
HTML表单与输入

input type="url" 提交前怎么校验?必须带协议头吗?

必须带协议头。浏览器内置的校验规则要求值是一个绝对 URL,像 https://example.com 这样的才算合法,只写 example.com 会触发 validity.typeMismatch,表单提交会被拦截。

前端进阶之旅 · 一题精讲更新于 2026.09.29
HTML#表单与输入#HTTP#表单
先看核心答案读代码示例
理解线索

URL 校验的三层结构

  1. 协议头必须有http://、https://、ftp:// 等 scheme 是合法的前提
  2. typeMismatch 拦提交格式不对时浏览器自动阻止提交并弹出提示
  3. pattern 再收窄在合法 URL 的基础上可以只允许特定域名或路径

校验发生在提交时,输入过程中不会报错。想实时反馈需要监听 input 事件自己调 checkValidity()。

核心回答

先记住这个答案

浏览器对 type="url" 的校验规则很简单:值必须是一个带协议头的绝对 URL。用户输入 example.com 提交时会被拦截,必须写成 https://example.com 才行。这个校验由约束验证 API 完成,不合法时 validity.typeMismatch 变成 true,浏览器会弹出默认提示框。

  • 值必须是带协议头的绝对 URL
  • typeMismatch 标记 URL 格式错误
  • pattern 可进一步限制域名或路径格式
  • 非 required 时空值也能通过校验

什么样的值能通过校验

合法值必须是一个格式正确的绝对 URL,通常有协议名和后续地址。只输入 example.com 不够;只写 https:// 也没有主机地址,不能把它当作可用网址。浏览器负责基础语法校验,但不保证地址存在或安全。

合法与不合法的对比HTML
<form id="demo">
  <input type="url" id="link" required />
  <button type="submit">提交</button>
</form>
<script>
  const input = document.getElementById('link')
  input.addEventListener('input', () => {
    // 输入 example.com 时可观察到 true
    console.log(input.validity.typeMismatch)
  })
  document.getElementById('demo').addEventListener('submit', event => {
    event.preventDefault() // 仅供页面演示,不发请求
  })
</script>

需要注意的是,type="url" 不要求值是一个真正能访问的地址。https://abc 也能通过,因为从格式上它是合法的。浏览器做的是格式校验,不是连通性检查。 如果字段没有加 required,空值也能通过校验。只有填了内容,格式校验才会生效。

用 pattern 进一步收窄范围

内置校验只管「是不是合法 URL」,不管用户填的是你想要的 URL。比如你只想接受 https 开头的地址,或者只允许某个域名下的链接,就需要加 pattern。

只允许 HTTPS 链接HTML
<input
  type="url"
  pattern="https://.*"
  title="请输入 https 开头的地址"
  required
/>
<!-- 输入 http://example.com 会被 pattern 拦截 -->
<!-- 输入 https://example.com 才能通过 -->

内置的 URL 格式约束和 pattern 约束都必须满足,表单才能正常提交。不匹配时可读取 validity.patternMismatch;浏览器可能使用 title 帮助组成提示文案,但不能保证各环境的提示相同,重要规则应另有可见说明。

回答前,多想一步

容易答错的地方

以为手机端一定显示同一种提示
校验气泡的外观和文字会因浏览器而异,不能把桌面截图当成所有移动端的效果。无论浏览器怎样提示,后端都必须再验证一次,因为请求可以绕过页面直接发送。
以为不安全的协议会被拦
javascript:、data: 这类协议头也能通过 type="url" 的校验。浏览器只检查格式,不判断安全性。如果你的场景需要过滤掉这些协议,得用 pattern 或 JavaScript 逻辑自己处理。
试着用自己的话回答

面试官还会怎么问?

type="url" 和 type="text" 加 pattern 有什么区别?

type="url" 自带一层格式校验,移动端还会弹出带 .com 按钮的键盘。用 type="text" 加 pattern 也能实现同样的校验效果,但少了语义信息和移动端键盘优化。能用原生类型就用原生类型。

怎么拿到浏览器弹出的校验提示文案?

读 input.validationMessage 属性就行。这个属性返回浏览器当前要展示的校验提示字符串,格式和语言跟用户的浏览器设置有关,不同浏览器返回的文案不一样。

想自己控制错误提示的样式怎么做?

不要等到 submit 事件里才检查:表单无效时,浏览器会先拦住提交,submit 监听器根本不会运行。可以监听输入变化,或在自定义提交按钮的点击处理中调用 checkValidity();读取 validity.typeMismatch、patternMismatch 等标志后展示自己的提示。若希望浏览器同时显示原生提示,再调用 reportValidity()。

从一道题,走向一组知识

把知识连起来

表单与输入

email 输入框能保证用户填的邮箱真实有效吗?

type="email" 的校验规则和 type="url" 类似,都是浏览器内置格式校验,可以对比两者的合法判定标准。

表单与输入

date 输入框提交的日期带时区吗?

日期输入的 value 格式同样有严格规范,和 URL 输入一样,不按规范写就拿不到值。

表单与输入

number 输入框的 step=any 和 step=0.1 差在哪?

数字输入的 step 校验也是约束验证 API 的一部分,理解它有助于串起整个表单校验体系。

参考资料

  • <input type="url"> HTML attribute value

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 什么样的值能通过校验
  3. 用 pattern 进一步收窄范围
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑