<script> 标签什么时候应该可见,为什么可以?

When should <script> tags be visible and why can they?

样式设置为 display:blockscript 元素显示为可见。为什么可行,是否有需要的实际用例?

td > * {
  display: block;
}
<table>
  <tr>
    <td>
      <script type="text/javascript">
        var test = 1;
      </script>von 1
    </td>
  </tr>
</table>

Why can <script> Tags be visible?

因为它们都是 HTML 与其他任何元素一样的元素,因此没有理由在 HTML 规范中编写特殊情况规则(这会增加复杂性)以防止 CSS 应用给他们。

任何元素都可以设置样式。举个例子:

head { display: block; }
title { display: block; }
meta { display: block; }
meta[charset]:after { display: block; content: attr(charset); }
meta[content]:after { display: block; content: attr(content); }

Is there any Usecase where it is wanted?

当然没有常见的,但一般规则的设计目的不是为了让您可以应用它们的一切有意义。它们是为常见情况设计的。

可能的用例:用于调试目的。

您可以在文档级别应用 class,例如。 <body class="debugscript">,然后使用一些 CSS:

body.debugscript script {
    display: block;
    background: #fcc;
    border: 1px solid red;
    padding: 2px;
}
body.debugscript script:before {
    content: 'Script:';
    display: block;
    font-weight: bold;
}
body.debugscript script[src]:before {
    content: 'Script: ' attr(src);
}

另一个(不常见)用例:

我有时会在风格指南中使用 <script> 标签作为简短的 HTML 代码示例。这样我就不必转义 HTML 标签和特殊字符。文本编辑器标签自动完成和语法高亮仍然有效。但是没有简单的方法可以在浏览器中添加语法高亮。

script[type="text/example"] {
    background-color: #33373c;
    border: 1px solid #ccc;
    color: #aed9ef;
    display: block;
    font-family: monospace;
    overflow: auto;
    padding: 2px 10px 16px;
    white-space: pre-wrap;
    word-break: break-all;
    word-wrap: break-word;
}
<p>Here comes a code example:</p>
<script type="text/example">
  <div class="cool-component">
     Some code example
  </div>
</script>

HTML5 规范 defines a style sheet that user agents (like browsers) are expected to use. Section 10.3.1 列出了 "Hidden elements" 的样式:

@namespace url(http://www.w3.org/1999/xhtml);

[hidden], area, base, basefont, datalist, head, link,
meta, noembed, noframes, param, rp, script, source, style, template, track, title {
  display: none;
}

embed[hidden] { display: inline; height: 0; width: 0; }

如您所见,它将 display: none; 应用于 script

这是您的用户和隐藏的 script 元素之间唯一的 "barrier"。 它非常好,旨在能够覆盖用户的样式-作者样式表中的代理样式表(当然也在用户样式表中)。

为什么有人可能想要使用它?一个用例是 displaying content without having to escape characters like </>, similar to the old xmp element. The script element can be used not only for scripts, but also for data blocks(即,对于具有 MIME 类型的任何内容)。

使用 display:none; 默认隐藏脚本标签。 Unor1 解释了底层语言规范。但是,它们仍然是 DOM 的一部分,可以相应地设置样式。

也就是说,请务必牢记脚本标签的确切作用。虽然它曾经伴随着类型和语言,但现在不再需要了。现在假定 JavaScript 在那里,因此浏览器将在遇到(或加载)来自这些标记的脚本时解释和执行脚本。

脚本执行后,标签的内容只是页面上的文本(通常是隐藏的)。此文本可以显示,但它也可以被删除 因为它只是文本。

在页面底部,就在结束 </html> 标记之前,您可以非常轻松地删除这些标记及其文本,并且页面不会发生任何变化。

例如:

(function(){
    var scripts = document.querySelectorAll("script");
    for(var i = 0; i < scripts.length; i++){
        scripts[i].parentNode.removeChild(scripts[i]);
    }
})()

这不会删除任何功能,因为页面的状态已经更改并反映在当前的全局执行上下文中。例如,如果页面加载了诸如 jQuery 之类的库,删除标记并不意味着 jQuery 不再公开,因为它已经添加到页面的运行时环境中。它本质上只是让 DOM 检查工具不显示脚本元素,但它确实强调了一旦执行的脚本元素实际上只是文本。

1. unor,2016 年 7 月 7 日星期四,wutzebaer,"When should tags be visible and why can they?",7 月 1 日在 10:53,