我们不应该使用<noscript>元素吗?

Jit*_*yas 68 javascript xhtml web-standards noscript

我在这里发现了一些好消息:

  • noscript元素仅检测浏览器是否启用了JavaScript.如果在防火墙中而不是在浏览器中禁用JavaScript,则JavaScript将不会运行,并且不会显示noscript元素的内容.

  • 许多脚本依赖于所支持语言的特定功能或特性,以便它们能够运行(例如document.getElementById).如果不支持所需的功能,则JavaScript无法运行,但由于支持JavaScript本身,因此不会显示noscript内容.

  • 使用noscript元素最有用的地方是在页面的头部,它可以有选择地确定在页面加载时应用于页面的样式表和元元素,而不必等到页面加载.不幸的是,noscript元素仅在页面主体内有效,因此不能在头部使用.

  • noscript元素是块级元素,因此只能在禁用JavaScript时显示整个内容块.它不能用于内联.

  • 理想情况下,网页应使用HTML作为内容,使用CSS作为外观,使用JavaScript作为行为.使用noscript元素是在HTML中应用行为而不是从JavaScript应用它.

资料来源:http://javascript.about.com/od/reference/a/noscriptnomore.htm

我非常同意最后一点.有没有办法制作和添加外部<noscript>文件?如果我们把<noscript><head>

Tor*_*amo 46

最好将默认设置为非javascript,然后让javascript代码覆盖启用javascript的页面.不必太多.可以只是一个display:none;块,然后display:block;通过javascript 设置,反之亦然,非js页面.

  • 一个`display:block`*"你的浏览器似乎不支持JavaScript"*由Javascript设置为`display:none`是一个可行的替代`NOSCRIPT`,但是你丢失了语义信息(机器人没有知道你在说什么. (30认同)
  • 你提到*它更好......*.为什么它比`<noscript>`标签更好? (6认同)
  • 为确保此方法在启用javascript时不会导致非JavaScript版本的闪现,请参阅http://stackoverflow.com/questions/3221561/need-help-eliminating-flash-of-unstyled-content-on- my-site/9823468#9823468如何避免闪光灯.(使用head标记中的javascript来隐藏HTML标记,因为该标记在读取正文之前存在.然后在文档准备好后再次显示.) (2认同)
  • 如果您在文档准备好后通过 JS 将某些内容设置为“display: none”,您将在打开的页面上闪烁。后备元素在不到一秒的时间内可见。那是痛苦。本机 noscript 标签不会闪烁。我不知道如何消除眨眼。 (2认同)
  • 由于脚本编写而导致HTML内容显示是危险的.无论脚本依赖性如何,默认情况下都应显示原始内容和HTML.noscript作为元素背后的原始想法仅在浏览器中禁用脚本时出现.通过反转该概念并且现在具有由显式脚本触发的内容和noscript,您可以在没有脚本的情况下删除这些元素的本机显示. (2认同)

Que*_*low 24

在思考了很多天并且来回改变我的代码之后,我想我现在已经有了更清晰的画面,并希望在我忘记之前分享我的两分钱.

<div id='noscript'>show non-js content</div>
<script>document.getElementById('noscript').style.display='none';</script>
<script id='required script'>show js content</script>
Run Code Online (Sandbox Code Playgroud)

VS

<noscript>show non-js content</noscript>
<script id='required script'>//show js content</script>
Run Code Online (Sandbox Code Playgroud)

根据具体情况,有三种情况需要考虑:

案例1 - 如果需要脚本是内联的

禁用JavaScript

  • <noscript>元素中的内容立即出现,显示非js内容
  • <div>元素中的内容立即出现,显示非js内容

已启用JavaScript

  • <noscript>元素中的内容根本不显示,显示的是js内容
  • <div>元素中的内容可能会在隐藏之前暂时出现,显示的是js内容

对于这种情况,使用<noscript>元素是有利的.

情况2 - 如果所需脚本来自外部(第三方)源,但隐藏<div>元素是使用内联脚本完成的

禁用JavaScript

  • <noscript>元素中的内容立即出现,显示非js内容
  • <div>元素中的内容立即出现,显示非js内容

已启用JavaScript但已阻止所需的脚本

  • <noscript>元素中的内容根本不显示,没有显示任何内容!
  • <div>元素中的内容可能会在隐藏之前暂时出现,没有显示任何内容!

已启用JavaScript并且已收到所需脚本

  • <noscript>元素中的内容根本不显示,显示的是js内容
  • <div>元素中的内容可能会在隐藏之前暂时出现,显示的是js内容

对于这种情况,使用<noscript>元素是有利的.

情况3 - 如果需要脚本隐藏<div>元素

禁用JavaScript

  • <noscript>元素中的内容立即出现,显示非js内容
  • <div>元素中的内容立即出现,显示非js内容

已启用JavaScript但已阻止所需的脚本

  • <noscript>元素中的内容根本不显示,没有显示任何内容!
  • <div>元素中的内容出现,显示非js内容

已启用JavaScript并且已收到所需脚本

  • <noscript>元素中的内容根本不显示,显示的是js内容
  • <div>元素中的内容可能会在隐藏之前暂时出现,显示的是js内容

对于这种情况,使用<div>元素是有利的.

综上所述

<noscript>如果HTML内容的呈现取决于第三方脚本或所需脚本是内联的,则使用元素.否则,使用<div>element并确保所需的脚本包含:

document.getElementById('noscript').style.display='none';
Run Code Online (Sandbox Code Playgroud)

  • 安全人员和 CSP 似乎不喜欢内联脚本元素。显然它们可以用于某种注入攻击。他们希望所有脚本都位于单独的文件中,不知道为什么。 (2认同)

小智 8

虽然Tor Valamo对这个问题有一个优雅的答案,但是有一个问题可能导致你选择不使用这种技术.

问题是(通常)IE.它倾向于加载和执行JS比其他浏览器慢一点,导致它有时会闪烁"请启用你的Javascript"div一瞬间然后加载JS并隐藏div.

这很烦人,你可以实现"经典".<noscript>重定向方法.

<head>
<noscript><meta http-equiv="refresh" content="0; URL=/NO_SCRIPT_URL/ROUTE_HERE"/></noscript>
</head>
Run Code Online (Sandbox Code Playgroud)

这是我遇到的关于这个小讨厌的最坚固的技术.


小智 7

我见过的一个有用的noscript应用程序是逐步增强重内容的异步加载(特别是"低于首屏").大图像,iframe等可以包装在HTML源代码中的noscript中,然后在DOM准备好之后,可以使用JavaScript将未展开的元素附加到页面.这会解除对页面的阻塞,并且可以提供更快的初始加载体验,特别是如果您的界面依赖于文档准备就绪后应用的JS/JQ交互(我咨询的投资组合页面为2秒与6秒).


Gre*_*hak 5

这些天似乎几乎每个浏览器都运行Javascript,但你永远不知道谁将访问你的网站.现在,即使是屏幕阅读器网络抓取工具也使用Javascript,有时甚至会发出AJAX请求.

也就是说,如果你要回到no-Javascript,那么有一种比<noscript>标签更好的方法.只需在HEAD您的文档中执行此操作:

<script type="text/javascript">
    document.getElementsByTagName('html')[0].className += ' Q_js'; // better than noscript
</script>
Run Code Online (Sandbox Code Playgroud)

使用这种技术,您可以轻松地引用Q_jsCSS中的类来隐藏内容.使用<noscript>标记,您可以期望的最好的是包含一个额外的CSS文件来覆盖以前的CSS.当一些具有静态内容的元素被认为是立即隐藏(而不是闪烁)时,这变得很重要,直到Javascript可以使它们更具动态性.

简而言之,我建议的技术可以解决你所有的缺点1-5,我相信它比使用它更好<noscript>.


Mal*_*voz 5

在(希望不久)将来您将能够使用css @media 脚本

@media (scripting: none) {
    /* styles for when JS is disabled */
}
Run Code Online (Sandbox Code Playgroud)