移动体验 / 方法解读

移动端脚本加载失败?检查 script 标签的 type 属性

在 HTML 中为 script 标签添加 type 属性时,如果包含非标准关键字或参数,脚本内容会被视为数据块而不会执行。

展示 HTML attribute 和 DOM property 的对比图示
主题资料配图,非新闻现场照片 · 配图:详解 html attribute 和 dom property

检查 type 属性是否包含非标准关键字

在 HTML 中,script 元素的 type 属性只能包含 JavaScript MIME 类型的本质值,即 text/javascript,或者 module 和 importmap 等关键字。如果添加了任何其他非标准关键字,浏览器会将脚本内容视为数据块,从而阻止其执行。例如,将 type 设置为 application/javascript 或 text/ecmascript 是不正确的,因为它们不是 HTML 规范中允许的关键字。在移动端开发中,这种错误可能导致页面交互功能失效,如点击事件无法触发或数据无法加载。

排查时,首先检查所有 script 标签的 type 属性。确保没有使用 application/javascript、text/ecmascript 等非标准关键字。如果发现使用了这些关键字,应将其更改为 text/javascript 或直接移除 type 属性,因为 text/javascript 是 script 元素的默认值。在移动端调试工具中,查看控制台是否有关于脚本解析失败的警告信息,这通常能直接指向问题所在。

检查 type 属性是否包含参数或编码设置

在 HTML 中,type 属性不能包含任何参数,例如 charset=utf-8。如果 type 属性中包含参数,浏览器会将其视为一个未识别的值,并将脚本内容视为数据块,而不是可执行的 JavaScript 代码。这意味着即使脚本文件本身是有效的 JavaScript,也会因为 type 属性的错误设置而被忽略。在移动端页面中,这会导致关键逻辑无法运行,影响用户体验。

验证方法是在浏览器开发者工具中查看网络请求或控制台输出。如果脚本被当作数据块处理,控制台通常会显示“script element with type X is ignored”之类的错误。此时,需要移除 type 属性中的所有参数,只保留标准的 text/javascript 或 module 关键字。对于 HTTP 响应头中的 Content-Type,可以包含 charset 参数,但 HTML 属性中的 type 属性必须保持纯净。

验证脚本是否被正确识别为可执行代码

确保脚本内容被正确识别为可执行的 JavaScript 代码是验证修复的关键步骤。可以通过在脚本中添加 console.log 语句或定义一个全局函数来测试。如果脚本被正确执行,这些语句或函数将在控制台中可见或可被调用。如果脚本被当作数据块,这些测试将不会产生任何效果,表明脚本仍然未被正确加载或执行。

在移动端设备上,可以使用浏览器内置的调试功能或日志工具来验证。例如,在脚本中添加 console.log('test'),然后在控制台中查看是否输出了 'test'。如果未输出,说明脚本未被执行。此外,还可以检查页面的交互功能是否恢复正常,如按钮点击事件是否触发,表单提交是否工作。这些实际操作的结果是判断脚本是否被正确执行的最直接依据。

确认 HTTP 响应头中的 Content-Type 设置

除了 HTML 属性中的 type 设置,HTTP 响应头中的 Content-Type 也必须正确设置。虽然 HTML 属性中的 type 属性可以省略,因为 text/javascript 是默认值,但服务器发送的 Content-Type 头必须明确指定为 text/javascript。如果服务器发送了错误的 MIME 类型,如 text/plain 或 application/octet-stream,浏览器可能会忽略脚本内容,即使 HTML 属性设置正确。

检查方法是在浏览器开发者工具的网络面板中查看脚本的响应头。确认 Content-Type 是否为 text/javascript。如果服务器配置错误,需要修改服务器配置以发送正确的 MIME 类型。对于移动端优化,确保服务器正确配置 MIME 类型可以避免脚本加载失败,从而提升页面的性能和稳定性。

资料与延伸阅读

你可以通过以下原始资料核对文中概念,并继续深入阅读。

  1. Media types (MIME types) - HTTP | MDN ↗
  2. 配图:详解 html attribute 和 dom property ↗
← 更多移动体验文章返回顶部 ↑