什么时候应该<script>标签可见,为什么他们可以?
呈现为display:block
script
元素显示为可见。 为什么这是可能的,是否有任何真正的用例在哪里?
td > * { display: block; }
<table> <tr> <td> <script type="text/javascript"> var test = 1; </script>von 1 </td> </tr> </table>
HTML5规范定义了用户代理(如浏览器)预期使用的样式表 。 第10.3.1节列出了“隐藏元素”的样式:
@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
元素之间唯一的“障碍”。 它非常好,并且能够覆盖作者样式表中的用户代理样式表(当然也包括用户样式表)。
为什么有人可能想要使用它? 一个用例是显示内容而不必像<
/ >
那样转义字符 ,类似于旧的xmp
元素。 script
元素不仅可以用于脚本, 也可以用于数据块 (即任何具有MIMEtypes的东西)。
为什么
<script>
标签可见?
因为它们是HTML元素,所以没有理由在HTML规范中编写特殊的规则(这会增加复杂性)来阻止CSS应用到它们。
任何元素都可以被devise。 拿,例如:
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); }
有什么用途的地方,它是想要的?
当然,没有共同的东西,但一般的规则并不是为了适用于所有的东西而devise的。 它们是为常见情况而devise的。
另一个(不常见)用例:
我有时在样式指南中使用<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>
可能的用例:用于debugging目的。
你可以在文档级应用一个类,例如。 <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); }
通过使用display:none;
,默认隐藏脚本标记display:none;
。 Unor 1解释了底层语言规范。 但是,它们仍然是DOM的一部分,可以相应地进行devise。
也就是说,记住脚本标记正在做什么是非常重要的。 虽然以前是伴随着types和语言,不再需要。 现在假定JavaScript在那里,因此浏览器将会解释并执行脚本,因为脚本是从这些标记中遇到(或加载)的。
一旦脚本执行完毕,标签的内容就只是页面上的文本(通常是隐藏的)。 这个文本可以被显示出来,但是它也可以被删除,因为它只是文本。
在页面底部的</html>
标记之前,您可以非常轻松地将这些标记与其文本一起移除,而且页面也不会发生变化。
例如:
(function(){ var scripts = document.querySelectorAll("script"); for(var i = 0; i < scripts.length; i++){ scripts[i].parentNode.removeChild(scripts[i]); } })()
这不会删除任何function,因为页面的状态已被更改,并反映在当前的全局执行上下文中。 例如,如果页面已经加载了像jQuery这样的库,删除标签并不意味着jQuery不再被公开,因为它已经被添加到页面的运行时环境中。 实质上只是让DOM检查工具不显示脚本元素,但它确实强调了脚本元素一次执行实际上只是文本。
1. unor,Thu Jul 07 2016,wutzebaer,“什么时候应该标记可见,为什么可以?”,7月1日10:53, https: //stackoverflow.com/a/38147398/1026459