如何检测JavaScript是否被禁用?

Mik*_*keJ 650 html javascript code-snippets

今天早上有一篇帖子询问有多少人禁用了JavaScript.然后我开始想知道可以使用哪些技术来确定用户是否禁用了它.

有没有人知道一些短/简单的方法来检测JavaScript是否被禁用?我的目的是发出警告,如果没有启用JS的浏览器,该站点将无法正常运行.

最终我想将它们重定向到能够在没有JS的情况下工作的内容,但我需要将此检测作为占位符来启动.

hai*_*rbo 354

我想在这里添加我的.02.它不是100%防弹,但我认为它足够好.

对于我来说,问题是,在没有Javascript的情况下,使用某种"此网站在没有Javascript的情况下工作得不好"的首选示例是您需要确保您的网站在没有Javascript的情况下正常工作.一旦你开始走这条路,那么你就会开始意识到网站应该是防弹的,关闭JS,这是一大堆额外的工作.

所以,你真正想要的是对一个页面的"重定向",即"打开JS,傻".但是,当然,你无法可靠地进行元重定向.所以,这是建议:

<noscript>
    <style type="text/css">
        .pagecontainer {display:none;}
    </style>
    <div class="noscriptmsg">
    You don't have javascript enabled.  Good luck with that.
    </div>
</noscript>
Run Code Online (Sandbox Code Playgroud)

... 您网站中的所有内容包含在"pagecontainer"类的div中.然后,noscript标记内的CSS将隐藏您的所有页面内容,而是显示您想要显示的任何"无JS"消息.这实际上是Gmail似乎要做的......如果它对谷歌来说足够好,那对我的小网站来说已经足够了.

  • @JonasGeiregat如果您的网络应用程序是构建的,强制用户需要Javascript有什么问题 - 并且需要 - Javascript才能运行?我经常听到这个评论,但它只适用于最简单的网站.尝试没有JS的Facebook,看看会发生什么.如果你的应用程序是为Javascript构建的,那么要求99%的用户启用了什么是错的? (69认同)
  • @Lee点击钉子,你只能为用户做很多事情,然后再画上你支持的内容.我们希望所有用户都拥有支持互联网的设备,我是否还应该为那些拒绝访问互联网的人实施我的网站的纸质版本? (18认同)
  • @Kolors,我在2012年3月发表了这个评论,我认为今天它是真实的.从那时起,我们就拥有了Meteor,Angular.Js,Famo.us以及大量令人惊叹的库,这些库都需要Javascript甚至_start_.我确实想知道那些选择禁用JS的用户实际上是在尝试实现...显然,他们不会像我们其他人一样浏览同一个网站,并且公司没有理由需要缩小他们的网站以获得最小的顽固用户的子集...... (14认同)
  • @steve曾试图验证google.com?验证只是确定文档在规范表后面的接近程度,它决不会影响页面的可用性. (12认同)
  • 是的,我想知道为什么我不能回答你的答案,因为我忘了激活我的JS :-))我喜欢并实施你的解决方案!谢谢! (6认同)
  • 我不喜欢强迫用户启用javascript的想法.如果他不能怎么办?我认为不引人注目的Javascript是几乎所有公共网站的方式. (4认同)
  • (9分钟后)但是,它不会验证.好吧,无论如何都要有原创性. (3认同)
  • Facebook实际上也没有js的功能,但你被告知要去移动增强版本(或转js).至于"谁不使用js",实际上有很多.首先,数据连接数量有限的人可能会关闭js,那些喜欢他们的手机工作超过几个小时的人(js处理是手机在线的主要电力消耗之一),更不用说安全性我们,在浏览器中使用noscript-extensions等.当然,如果他们想要使用该服务,这些人已经足够先进,知道如何打开它. (3认同)
  • 一个更好的解决方案是分离样式块:这应该在head部分.@Steve,现在它将验证:) (2认同)
  • 为什么你不能可靠地进行元重定向? (2认同)

Mar*_*ear 280

我假设您正在尝试决定是否提供JavaScript增强的内容.最好的实现会干净利落地降低,因此该站点仍然可以在没有JavaScript的情况下运行.我还假设您的意思是服务器端检测,而不是<noscript>出于无法解释的原因使用该元素.

没有一种很好的方法来执行服务器端JavaScript检测.作为替代方案,可以使用JavaScript设置cookie,然后在后续页面查看时使用服务器端脚本测试该cookie.但是,这不适合决定要传送的内容,因为它无法区分没有cookie的访问者与新访问者或阻止cookie的访问者.

  • <noscript>是指定非javascript内容的最具语义准确性的方式 - 而不是检测是否禁用了javascript,检测是否已启用.因此,默认情况下显示"您需要javascript来正确使用我的网站"消息,但是立即使用javascript函数将其隐藏在onLoad上. (127认同)
  • @matt lohkamp:或者甚至默认隐藏消息,并在`<noscript>`中放置一个`<style>`块来取消隐藏(如果启用了JS则没有重排).令人惊讶的是,这适用于所有现代浏览器,甚至在IE6中 (57认同)
  • ...除了你为什么关心验证?你是否只是为了验证而验证?它可能不是"正确的",但如果它起作用并且"在引擎盖下有一点污垢"完成它,那么问题是什么?别担心,我不会判断;-) (20认同)
  • @matt - 我这样做了一段时间,但是这个消息在缓慢的连接上停留了一段时间,让用户感到困惑.我在这里寻找一个不同的解决方案.@Piskvor - 标题中的<noscript>标记将不会验证,并且正文中的<style>标记将不会验证. (7认同)
  • 如果你只将style属性用于<noscript>标签中的给定元素(例如<noscript> <div style ="color:red;"> blahblah </ div> </ noscript>或sg.),它仍然有效.但是如果你将<style> BLOCK正常放在定义某些.noscript(或类似)类别元素的样式的标题中,并且在<noscript>标记内的正文中,你只需要给出给定的元素,它也会保持有效.以前定义的.noscript类,如下所示:<noscript> <div class ="noscript"> blahblah </ div> </ noscript> (4认同)
  • @Pispirulito如果禁用了javascript,则不会设置cookie,并且检测到其缺席的服务器将提供该页面的非js版本.如果启用了javascript,则将设置cookie,并且检测其存在的服务器将提供该页面的js版本.这种方法的不良副作用是,即使启用了javascript,禁用cookie的用户也将被提供非js版本. (2认同)
  • @Steve你不需要头文件中的<noscript>,也不需要正文中的<style>标签或任何其他内联css.只需将你的noscript元素放入正文,在里面插入一个html元素并给它一个id或类,并通过你的css样式文件控制它的行为.验证就好了.例如:`<noscript> <div id ="noScript"> <h1>此网站依赖于Javascript,因此请启用它.</ h1> </ div> </ noscript>` (2认同)
  • 实际上,这种方法的不良副作用可能更糟。cookie 不会出现在第一页请求中。您必须在页面完全加载后强制客户端刷新才能最终检测到 cookie。 (2认同)

Con*_*oyP 197

noscript 禁用JavaScript时执行块,通常用于显示您在JavaScript中生成的替代内容,例如

<script type="javascript">
    ... construction of ajaxy-link,  setting of "js-enabled" cookie flag, etc..
</script>
<noscript>
    <a href="next_page.php?nojs=1">Next Page</a>
</noscript>
Run Code Online (Sandbox Code Playgroud)

没有js的用户将获得next_page链接 - 你可以在这里添加参数,以便你在下一页上知道他们是通过JS /非JS链接,还是尝试通过JS设置一个cookie,缺少这意味着JS被禁用.这两个例子都是相当微不足道的,可以操纵,但你明白了.

如果你想要一个纯粹统计的想法,你有多少用户禁用了javascript,你可以这样做:

<noscript>
    <img src="no_js.gif" alt="Javascript not enabled" />
</noscript>
Run Code Online (Sandbox Code Playgroud)

然后检查您的访问日志以查看此图像被点击的次数.一个稍微粗略的解决方案,但它会为您的用户群提供百分比的好主意.

上述方法(图像跟踪)不适用于纯文本浏览器或完全不支持js的浏览器,因此如果您的用户群主要向该区域摆动,这可能不是最好的方法.

  • 这不是很有效.例如,它不会计算任何具有纯文本浏览器的人,这些浏览器通常没有JavaScript支持.至少,您应该禁用该图像的缓存. (7认同)
  • 那些不支持JS的browsere不会简单地忽略noscript标签并显示图像吗? (3认同)
  • 您也可以将该图像作为服务器端脚本提供,设置mime类型,并使用它来记录有关用户的一些信息或删除cookie ... http://px.sklar.com/code.html/ ID = 256 (2认同)

小智 46

这对我有用:如果禁用了javascript,它会重定向访问者

<noscript><meta http-equiv="refresh" content="0; url=whatyouwant.html" /></noscript>
Run Code Online (Sandbox Code Playgroud)

  • 这可能是无效的,但看看Facebook的代码,它在<head>部分使用相同的解决方案 - 这并不意味着它是一个非常好的解决方案,因为Facebook的代码远非有效代码,但它可能意味着它适用于许多用户的浏览器,这可能是一个重要方面.但它确实没有真正建议.这是他们的代码:<noscript> <meta http-equiv = refresh content ="0; URL =/about/messages /?_ fb_noscript = 1"/> </ noscript> (15认同)
  • 这是无效的.noscript元素不能包含元素.我不相信这会在所有浏览器(包括您当前无法测试的未来浏览器)中可靠地工作,因为它们可能以不同的方式执行错误恢复. (6认同)

And*_*ges 44

如果您的用例是您有表单(例如,登录表单)并且您的服务器端脚本需要知道用户是否启用了JavaScript,您可以执行以下操作:

<form onsubmit="this.js_enabled.value=1;return true;">
    <input type="hidden" name="js_enabled" value="0">
    <input type="submit" value="go">
</form>
Run Code Online (Sandbox Code Playgroud)

这将在提交表单之前将js_enabled的值更改为1.如果你的服务器端脚本得到0,没有JS.如果它得到1,JS!


cll*_*pse 42

我建议你通过编写不引人注目的JavaScript来反过来.

使用JavaScript禁用的用户可以使用您的项目功能,并在完成后实现JavaScript UI增强功能.

https://en.wikipedia.org/wiki/Unobtrusive_JavaScript

  • 生命太短暂了.这是2012年 - 启用javascript或回家 (143认同)
  • "人生太短了.这是2012年 - 启用javascript或回家!" 在没有JS的情况下显示的完美小消息.登录后告诉你@Yarin (24认同)
  • 我也刚登录说真棒!@Yarin.我正在建立一个通常不会公开的小网站(考虑像内部网,但是朋友聚在一起开展项目).我正在把它变成一个SPA而不打算放弃后备.不引人注目的JavaScript几乎会使我在SPA概念中的工作量增加一倍.使用Knockout,Jquery等现代javascript库,我们必须接受并非每个站点都可以轻松地"不引人注目".Javascript是网络的未来. (5认同)
  • @Yarin我建立了PHP/JS应用程序,我从来没有投入后备......如果它不适合某人他们联系我,我告诉他们过去停止生活并启用JS. (5认同)
  • @ n611x007 - 不道德的东西隐藏在所有代码中,无论是服务器还是客户端.它不是编码错误,它的人为错误.我找到一个反对JS讽刺的运动因为你仍然使用第三方ISP连接到互联网,仍然使用带有第三方硬件/固件的计算机,仍然使用第三方注入可访问的不安全的蜂窝网络,仍然拥有使用的手机第三方未修补的操作系统,仍然使用平板电视,使用第三方开放更新服务等.无论您是否在浏览器中关闭JS,您始终是MITM-ish频道的受害者. (2认同)

Abu*_*zzy 33

在body上使用.no-js类,并根据.no-js父类创建非javascript样式.如果javascript被禁用,你将获得所有非javascript样式,如果有JS支持,.no-js类将被替换为你提供所有样式.

 document.body.className = document.body.className.replace("no-js","js");
Run Code Online (Sandbox Code Playgroud)

HTML5样板中使用的技巧http://html5boilerplate.com/通过modernizr但您可以使用一行javascript来替换类

noscript标签没关系,但为什么在你的html中有额外的东西可以用css完成

  • 在有人提到`.nojs`课之前,不能相信这花了很长时间!这是最无缝的方法之一,让"noscript"感到羞耻. (5认同)

de *_*aad 32

<noscript>甚至没有必要,更不用说XHTML不支持.

工作实例:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
<html>
<head>
    <title>My website</title>
    <style>
      #site {
          display: none;
      }
    </style>
    <script src="http://code.jquery.com/jquery-latest.min.js "></script>
    <script>
      $(document).ready(function() {
          $("#noJS").hide();
          $("#site").show();
      });
    </script>
</head>
<body>
    <div id="noJS">Please enable JavaScript...</div>
    <div id="site">JavaScript dependent content here...</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

在此示例中,如果启用了JavaScript,则会看到该站点.如果没有,那么您会看到"请启用JavaScript"消息.测试JavaScript是否已启用的最佳方法是简单地尝试使用JavaScript!如果它有效,它会启用,如果没有,那么它不是......

  • 哈,XHTML。那些日子......事情发生了很大变化:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/noscript (3认同)

rsl*_*ite 13

您可以使用简单的JS代码段来设置隐藏字段的值.回发后,您知道JS是否已启用.

或者您可以尝试打开一个快速关闭的弹出窗口(但可能是可见的).

您还可以使用NOSCRIPT标记来显示禁用JS的浏览器的文本.


小智 13

你需要看一下noscript标签.

<script type="text/javascript">
...some javascript script to insert data...
</script>
<noscript>
   <p>Access the <a href="http://someplace.com/data">data.</a></p>
</noscript>
Run Code Online (Sandbox Code Playgroud)


bor*_*rel 13

只是有点难,但(发型给了我这个想法)

CSS:

.pagecontainer {
  display: none;
}
Run Code Online (Sandbox Code Playgroud)

JS:

function load() {
  document.getElementById('noscriptmsg').style.display = "none";
  document.getElementById('load').style.display = "block";
  /* rest of js*/
}
Run Code Online (Sandbox Code Playgroud)

HTML:

<body onload="load();">

  <div class="pagecontainer" id="load">
    Page loading....
  </div>
  <div id="noscriptmsg">
    You don't have javascript enabled. Good luck with that.
  </div>

</body>
Run Code Online (Sandbox Code Playgroud)

无论如何都适合吗?即使noscript标签不受支持(只需要一些css),任何人都知道非css解决方案吗?


小智 12

noscript标签运行良好,但需要每个额外的页面请求继续提供无用的JS文件,因为本质上noscript是客户端检查.

您可以使用JS设置cookie,但正如其他人指出的那样,这可能会失败.理想情况下,您希望能够检测JS客户端,并且不使用cookie,为该用户设置会话服务器端,以指示JS已启用.

可能是使用JavaScript动态添加1x1图像,其中src属性实际上是服务器端脚本.所有这个脚本都会保存到当前启用了JS的用户会话($ _SESSION ['js_enabled']).然后,您可以将1x1空白图像输出回浏览器.对于已禁用JS的用户,该脚本不会运行,因此不会设置$ _SESSION ['js_enabled'].然后,对于提供给该用户的其他页面,您可以决定是否包含所有外部JS文件,但是您始终希望包含该检查,因为您的某些用户可能正在使用NoScript Firefox附加组件或具有JS由于其他原因暂时禁用.

您可能希望在靠近页面末尾的位置包含此检查,以便额外的HTTP请求不会减慢页面的呈现速度.


小智 12

将其添加到每个页面的HEAD标记中.

<noscript>
        <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" />
</noscript>
Run Code Online (Sandbox Code Playgroud)

所以你有了:

<head>
    <noscript>
        <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" />
    </noscript>
</head>
Run Code Online (Sandbox Code Playgroud)

谢谢Jay.


小智 11

因为我总是想给浏览器一些值得看的东西,我经常使用这个技巧:

首先,需要JavaScript才能正常运行的页面的任何部分(包括通过getElementById调用等进行修改的被动HTML元素)都可以原样使用,并假设没有可用的javaScript.(设计好像不在那里)

任何需要JavaScript的元素,我都放在一个标签内:

<span name="jsOnly" style="display: none;"></span>
Run Code Online (Sandbox Code Playgroud)

然后在我的文档的开头,我使用.onloaddocument.ready在循环中getElementsByName('jsOnly')设置.style.display = "";转换JS依赖元素.这样,非JS浏览器就不必看到网站的JS依赖部分,如果它们拥有它,它会立即出现.

一旦习惯了这种方法,就可以很容易地混合你的代码来处理这两种情况,虽然我现在只是试验noscript标签并期望它有一些额外的优势.


Ume*_*til 9

一个常见的解决方案是将元标记与noscript结合使用以刷新页面并在禁用JavaScript时通知服务器,如下所示:

<!DOCTYPE html>
<html lang="en">
    <head>
        <noscript>
            <meta http-equiv="refresh" content="0; /?javascript=false">
        </noscript>
        <meta charset="UTF-8"/>
        <title></title>
    </head>
</html>
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,当禁用JavaScript时,浏览器将在0秒内重定向到网站的主页.此外,它还会将参数javascript = false发送到服务器.

然后,服务器端脚本(如node.js或PHP)可以解析参数并了解JavaScript已禁用.然后,它可以向客户端发送特殊的非JavaScript版本的网站.


Alp*_*a2k 9

这是使用的"最干净"的解决方案:

<noscript>
    <style>
        body *{ /*hides all elements inside the body*/
            display: none;
        }
        h1{ /* even if this h1 is inside head tags it will be first hidden, so we have to display it again after all body elements are hidden*/
            display: block;
        }
    </style>
    <h1>JavaScript is not enabled, please check your browser settings.</h1>
</noscript>
Run Code Online (Sandbox Code Playgroud)


Joe*_*orn 8

如果javascript被禁用,您的客户端代码将无法运行,因此我认为您的意思是您希望服务器端提供该信息.在这种情况下,noscript不太有用.相反,我有一个隐藏的输入并使用javascript来填充值.在您的下一个请求或回发后,如果值在那里您知道javascript已打开.

小心noscript之类的东西,第一个请求可能会显示禁用javascript,但未来的请求会启用它.


Bra*_*118 5

例如,您可以使用类似document.location ='java_page.html'的内容将浏览器重定向到新的带脚本的页面.无法重定向意味着JavaScript不可用,在这种情况下,您可以使用CGI ro utines或在标记之间插入适当的代码.(注意:NOSCRIPT仅适用于Netscape Navigator 3.0及更高版本.)

信用 http://www.intranetjournal.com/faqs/jsfaq/how12.html