您现在的位置是:网站首页 > <script>-客户端脚本文章详情

<script>-客户端脚本

<script> 标签是 HTML 中用于嵌入或引用客户端脚本的核心元素,通常用于实现动态交互、数据验证或操作 DOM。它支持多种属性,可直接写入代码或链接外部脚本文件,是现代 Web 开发不可或缺的部分。

<script> 标签的基本语法

<script> 标签的语法非常简单,以下是一个基础示例:

<script>
  console.log("Hello, World!");
</script>

它可以直接包含 JavaScript 代码,浏览器在解析到该标签时会立即执行其中的内容。如果引用外部文件,则使用 src 属性:

<script src="app.js"></script>

属性详解

<script> 标签支持多个属性,用于控制脚本的加载和执行行为。

src 属性

src 用于指定外部脚本文件的路径,可以是相对路径或绝对 URL:

<script src="https://example.com/app.js"></script>

type 属性

早期 HTML 版本中,type 属性用于指定脚本的 MIME 类型(如 text/javascript),但在 HTML5 中已成为可选,默认值为 text/javascript。现代开发中通常省略:

<script type="text/javascript">
  // 传统写法,现在可不写
</script>

asyncdefer 属性

这两个属性用于控制脚本的加载和执行顺序:

  1. async:脚本异步加载,下载完成后立即执行,不保证顺序。

    <script src="script1.js" async></script>
    <script src="script2.js" async></script>
    

    script2.js 可能先于 script1.js 执行。

  2. defer:脚本延迟到文档解析完成后按顺序执行。

    <script src="script1.js" defer></script>
    <script src="script2.js" defer></script>
    

    保证 script1.js 先于 script2.js 执行。

crossorigin 属性

用于控制跨域请求的凭据模式,常见于 CDN 资源加载:

<script src="https://another-domain.com/app.js" crossorigin="anonymous"></script>

内联脚本与外部脚本

内联脚本

直接写在 HTML 文件中的脚本:

<script>
  document.getElementById("demo").innerHTML = "内容已修改";
</script>

外部脚本

通过 src 引入的独立 .js 文件:

<script src="scripts/main.js"></script>

外部脚本的优势:

  • 可缓存,提升加载速度。
  • 代码复用性强。
  • 便于维护和版本控制。

动态加载脚本

通过 JavaScript 动态创建 <script> 标签:

const script = document.createElement('script');
script.src = 'dynamic.js';
document.body.appendChild(script);

这种方式常用于按需加载模块或第三方库。

事件处理

<script> 标签支持 onloadonerror 事件:

<script src="app.js" onload="console.log('加载成功')" onerror="console.log('加载失败')"></script>

模块化脚本

使用 type="module" 支持 ES6 模块:

<script type="module">
  import { func } from './module.js';
  func();
</script>

模块脚本默认启用严格模式,且支持 import/export 语法。

性能优化建议

  1. 将脚本放在 <body> 底部:避免阻塞页面渲染。

    <body>
      <!-- 页面内容 -->
      <script src="app.js"></script>
    </body>
    
  2. 合并脚本文件:减少 HTTP 请求次数。

  3. 使用 deferasync:根据场景选择合适的加载策略。

兼容性与历史问题

  • 早期浏览器可能不支持某些新特性(如 defer/async),需测试降级方案。
  • XHTML 中需将脚本内容包裹在 CDATA 中:
    <script type="text/javascript">
    //<![CDATA[
      alert("Hello");
    //]]>
    </script>
    

实际应用示例

表单验证

<script>
  function validateForm() {
    const email = document.getElementById("email").value;
    if (!email.includes("@")) {
      alert("邮箱格式错误");
      return false;
    }
    return true;
  }
</script>
<form onsubmit="return validateForm()">
  <input type="text" id="email" required>
  <button type="submit">提交</button>
</form>

动态内容加载

// 加载天气数据并显示
fetch('https://api.weather.com/data')
  .then(response => response.json())
  .then(data => {
    document.getElementById('weather').innerHTML = data.temperature;
  });

安全注意事项

  1. 避免内联脚本中的敏感信息:如 API 密钥。
  2. 使用 CSP(内容安全策略):限制脚本来源:
    <meta http-equiv="Content-Security-Policy" content="script-src 'self'">
    
  3. 警惕 XSS 攻击:不要直接插入未处理的用户输入:
    // 错误示例
    document.write(userInput);
    

与其他技术的结合

配合 noscript 标签

为禁用脚本的用户提供备用内容:

<noscript>
  <p>请启用 JavaScript 以获得完整功能</p>
</noscript>

Web Workers

通过脚本创建后台线程:

// main.js
const worker = new Worker('worker.js');
worker.postMessage('Start');
// worker.js
onmessage = function(e) {
  console.log('Worker received:', e.data);
};

我的名片

网名:~川~

岗位:console.log 调试员

坐标:重庆市-九龙坡区

邮箱:cc@qdcc.cn

沙漏人生

站点信息

  • 建站时间:2013/03/16
  • 本站运行
  • 文章数量
  • 总访问量
微信公众号
每次关注
都是向财富自由迈进的一步