javascript: URL

警告: 在 Web 上使用 javascript: URL 是不被推荐的,因为它可能导致任意代码执行,类似于使用 eval() 的后果。它还可能降低 可访问性,因为它偏离了正常的链接行为。

JavaScript URL,即以 javascript: scheme 作为前缀的 URL,被用作假的导航目标,当浏览器尝试导航时会执行 JavaScript。如果 URL 计算结果为字符串,它将被视为 HTML 并由浏览器渲染。

语法

url
javascript:<script>
javascript

URL 的 scheme。

<script>

要执行的 JavaScript 代码。代码将被解析为脚本。

描述

javascript: URL 可以在任何 URL 是导航目标的地方使用。这包括但不限于:

  • <a><area> 元素的 href 属性。
  • <form> 元素的 action 属性。
  • <iframe> 元素的 src 属性。
  • window.location JavaScript 属性。
  • 浏览器地址栏本身。

注意: 其他一些使用 URL 的上下文,例如 <link> 元素的 href 属性,不允许使用 javascript: URL,因为它们是资源位置,而不是导航目标。对于这些情况,如果您想嵌入 JavaScript,请使用带有 text/javascript MIME 类型的 data: URL。

当浏览器尝试导航到这样的位置时,它会解析并执行脚本体。脚本可能有一个完成值(而不是返回值),它与使用 eval() 执行脚本时的值相同。如果最后一个语句是表达式,则完成值是该表达式的值。如果此完成值为字符串,则该字符串被视为 HTML 文档,并且浏览器导航到一个具有该内容的新文档,使用与当前页面相同的 URL。不会创建历史记录条目。如果完成值不是字符串,浏览器仅执行代码而不导航。因此,通常建议如果脚本以像 javascript:foo() 这样的函数调用结束,您应该在其前面加上 void,以防止函数恰好返回字符串时意外导航。

javascript: 导航可能会被 内容安全策略 设置阻止,特别是 script-src

示例

javascript: URL 用作 href 目标

在此示例中,<a> 元素的 href 属性被设置为一个 javascript: URL,在单击时会弹出一个消息

html
<a href="javascript:alert('Hello, world!')">Click me</a>

由于 alert() 返回 undefined,浏览器不会导航到新页面。这是一个糟糕的实践,因为链接实际上不是一个超链接。考虑改用按钮。

html
<button id="btn">Click me</button>
<script>
  document.getElementById("btn").addEventListener("click", () => {
    alert("Hello, world!");
  });
</script>

在此示例中,<a> 元素的 href 属性被设置为一个 javascript: URL,该 URL 导航到一个内容为“Hello, world!”的新页面。

html
<a href="javascript:pageContent">Click me</a>
<script>
  // Use a var so it becomes a global variable and can be read elsewhere
  var pageContent = "Hello, world!";
</script>

请注意,由于 javascript: URL 不会创建历史记录条目,因此在刷新之前无法返回上一页。

javascript: URL 用作表单操作

在此示例中,<form> 元素的 action 属性被设置为一个 javascript: URL,在提交时会弹出一个消息。

html
<form action="javascript:alert(myInput.value)">
  <input id="myInput" />
  <input type="submit" value="Submit" />
</form>

与其这样做,不如考虑监听表单的 submit 事件并用 JavaScript 处理它。

html
<form id="myForm">
  <input id="myInput" />
  <input type="submit" value="Submit" />
</form>
<script>
  document.getElementById("myForm").addEventListener("submit", (event) => {
    event.preventDefault();
    alert(document.getElementById("myInput").value);
  });
</script>

javascript: URL 用作 iframe 源

在此示例中,<iframe> 元素的 src 属性被设置为一个 javascript: URL,该 URL 导航到一个内容为“Hello, world!”的新页面。

html
<iframe src="javascript:pageContent"></iframe>
<script>
  // Use a var so it becomes a global variable and can be read elsewhere
  var pageContent = "Hello, world!";
</script>

与其这样做,不如考虑使用 srcdoc 属性。

html
<iframe id="myFrame"></iframe>
<script>
  document.getElementById("myFrame").srcdoc = "Hello, world!";
</script>

javascript: URL 与 window.location 一起使用

在此示例中,window.location 属性被设置为一个 javascript: URL,该 URL 导航到一个内容为“Hello, world!”的新页面。

js
window.location = "javascript:'Hello world!'";

与其这样做,不如考虑使用 DOM API 来修改页面内容。例如:

js
document.body.textContent = "Hello, world!";

规范

规范
HTML
# the-javascript:-url-special-case

另见