如何检测JavaScript是否被禁用?
今天早上有一个post询问有多less人禁用JavaScript。 然后我开始想知道用什么技术来确定用户是否禁用了它。
有谁知道一些简短的方法来检测JavaScript是否被禁用? 我的意图是给出一个警告:如果浏览器没有启用JS,网站将无法正常运行。
最后我想redirect到能够在没有JS的情况下工作的内容,但是我需要将此检测作为占位符来启动。
我假设你正在决定是否提供JavaScript增强的内容。 最好的实现降低干净,使该网站仍然运行没有JavaScript。 我还假定你的意思是服务器端检测,而不是用一个无法解释的原因使用<noscript>
元素。
没有一个好的方法来执行服务器端的JavaScript检测。 作为替代,可以使用JavaScript设置cookie,然后在随后的页面查看时使用服务器端脚本testing该cookie。 然而,这将不适合决定要传送什么内容,因为如果没有Cookie,来自新的访问者或阻止Cookie的访问者将无法区分访问者。
我想在这里添加我的.02。 这不是100%防弹,但我认为这是够好的。
这个问题对我来说,举一些“这个网站不能很好地运行没有Javascript”的消息的首选例子是,你需要确保你的网站没有Javascript的工作正常。 一旦你开始了这条道路,那么你就开始意识到,在JSclosures的情况下,该站点应该是防弹的,这是一大块额外的工作。
所以,你真正想要的是一个“redirect”页面,说“打开JS,傻”。 但是,当然,你不能可靠地进行元redirect。 所以,这里的build议是:
<noscript> <style type="text/css"> .pagecontainer {display:none;} </style> <div class="noscriptmsg"> You don't have javascript enabled. Good luck with that. </div> </noscript>
…您网站上的所有内容都包含“pagecontainer”类的div。 noscript标签内的CSS会隐藏你所有的页面内容,而是显示你想要显示的任何“无JS”消息。 实际上,Gmail似乎是这样做的…如果Google足够好,对我的小站点来说已经足够了。
当禁用JavaScript时会执行noscript
块,通常用于显示您在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>
没有js的用户将得到next_page
链接 – 你可以在这里添加参数,这样你就可以在下一页看到他们是否通过JS /非JS链接,或者尝试通过JS设置cookie,缺less这些意味着JS被禁用。 这两个例子都是相当微不足道的,可以操纵,但是你明白了。
如果你想要一个纯粹的统计概念,你的用户有多less个JavaScript被禁用,你可以这样做:
<noscript> <img src="no_js.gif" alt="Javascript not enabled" /> </noscript>
然后检查您的访问日志,看看这个图像被击中了多less次。 一个稍微粗糙的解决scheme,但它会为您的用户群提供一个好主意百分比。
上述方法(图像跟踪)对于纯文本浏览器或者根本不支持js的浏览器来说效果不好,所以如果你的用户基础主要朝着那个方向摆动,这可能不是最好的方法。
这是什么对我有用:它redirect访问者,如果javascript被禁用
<noscript><meta http-equiv="refresh" content="0; url=whatyouwant.html" /></noscript>
如果你的用例是你有一个表单(例如,login表单),并且你的服务器端脚本需要知道用户是否启用了JavaScript,那么你可以这样做:
<form onsubmit="this.js_enabled.value=1;return true;"> <input type="hidden" name="js_enabled" value="0"> <input type="submit" value="go"> </form>
在提交表单之前,这会将js_enabled的值更改为1。 如果你的服务器端脚本得到一个0,没有JS。 如果得到1,JS!
我build议你通过编写不引人注目的JavaScript来反过来。
使JavaScript项目的function无效,完成后,实施JavaScript UI增强function。
在主体上使用.no-js类,并根据.no-js父类创build非javascript样式。 如果JavaScript被禁用,您将获得所有非javascript样式,如果有JS支持,则.no-js类将被replace,从而为您提供所有样式。
document.body.className = document.body.className.replace("no-js","js");
通过modernizr在HTML5样板http://html5boilerplate.com/中使用的技巧,但是您可以使用一行javascript代替类;
noscript标签是好的,但为什么有额外的东西在你的HTML时,可以用CSS来完成
甚至不需要<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>
在这个例子中,如果JavaScript被启用,那么你就可以看到这个网站。 如果没有,那么你看到“请启用JavaScript”消息。 testingJavaScript是否启用的最好方法是简单地尝试和使用JavaScript! 如果它起作用,如果不起作用,那么它不是…
你可以使用一个简单的JS代码片段来设置隐藏字段的值。 当发回你知道,如果JS被启用或不。
或者你可以尝试打开一个快速closures的popup窗口(但这可能是可见的)。
此外,您还可以使用NOSCRIPT标签来显示禁用JS的浏览器的文本。
noscript标记效果很好,但是会要求每个额外的页面请求继续提供无用的JS文件,因为基本上noscript是一个客户端检查。
你可以用JS设置一个cookie,但正如其他人指出的,这可能会失败。 理想情况下,您希望能够检测到JS客户端,并且不使用cookie,为该用户设置一个会话服务器端,表示JS已启用。
一种可能性是使用JavaScriptdynamic添加1×1图像,其中src属性实际上是服务器端脚本。 这个脚本所做的就是保存到当前的用户会话,JS被启用($ _SESSION ['js_enabled'])。 然后,您可以将1×1的空白图像输出回浏览器。 该脚本将不会运行的JS禁用的用户,因此$ _SESSION ['js_enabled']将不会被设置。 然后,为了给这个用户提供更多的页面,你可以决定是否包含所有的外部JS文件,但是你总是希望包含这个检查,因为你的一些用户可能使用了NoScript Firefox插件,或者使用JS由于其他原因暂时停用。
您可能希望在接近页面末尾的位置包含此检查项,以便额外的HTTP请求不会减慢页面的呈现速度。
将其添加到每个页面的HEAD标签。
<noscript> <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" /> </noscript>
所以你有:
<head> <noscript> <meta http-equiv="refresh" runat="server" id="mtaJSCheck" content="0;logon.aspx" /> </noscript> </head>
感谢Jay。
你会想看看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>
只是有点艰难,但(发型给了我这个想法)
CSS:
.pagecontainer { display: none; }
JS:
function load() { document.getElementById('noscriptmsg').style.display = "none"; document.getElementById('load').style.display = "block"; /* rest of js*/ }
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>
会在任何情况下工作的权利? 即使noscript标签不被支持(只有一些css需要)任何人都知道一个非css解决scheme?
因为我总是想给浏览器一些值得看的东西,我经常用这个技巧:
首先,需要JavaScript才能正常运行的页面的任何部分(包括通过getElementById调用等修改的被动HTML元素)被devise为可用的,假定没有可用的javaScript。 (devise好像不在那里)
任何需要使用JavaScript的元素,我都会在标签内放置如下内容:
<span name="jsOnly" style="display: none;"></span>
然后在我的文档的开始处,我使用getElementsByName('jsOnly')
循环中的.onload
或document.ready
来设置.style.display = "";
重新开始依赖于JS的元素。 这样,非JS浏览器就不必查看该站点的JS依赖部分,如果他们有,它就会立即出现。
一旦习惯了这种方法,将代码混合处理这两种情况是相当容易的,尽pipe我现在只是在试验noscript
标签,并希望它有一些额外的优势。
如果javascript被禁用,则客户端代码将无法运行,所以我假定您的意思是您希望将此信息用于服务器端。 在这种情况下, noscript不太有用。 相反,我会有一个隐藏的input,并使用JavaScript来填写一个值。 在您的下一个请求或回发后,如果值是在那里你知道JavaScript打开。
注意事项,如无脚本,第一个请求可能会显示JavaScript禁用,但未来的请求将其打开。
一个常见的解决scheme是将meta标记与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>
在上面的示例中,当JavaScript被禁用时,浏览器将在0秒内redirect到网站的主页。 另外它还会将参数javascript = false发送到服务器。
然后,服务器端脚本(如node.js或PHP)可以parsing参数,并知道JavaScript已禁用。 然后,它可以将一个特殊的非JavaScript版本的网站发送给客户端。
例如,你可以使用类似document.location ='java_page.html'的方式将浏览器redirect到一个新的脚本页面。 未能redirect意味着JavaScript不可用,在这种情况下,您可以使用CGIpath或在标签之间插入适当的代码。 (注:NOSCRIPT仅在Netscape Navigator 3.0及更高版本中可用。)
这是“最干净”的解决schemeID使用:
<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>
我过去使用的一种技术是使用JavaScript来编写一个会话cookie,它只是作为一个标志来说明JavaScript被启用。 然后服务器端代码查找这个cookie,如果没有find适当的操作。 当然,这个技术确实依靠cookies被启用!
我认为你可以插入一个图片标签到一个noscript标签,并查看你的网站的多less次以及这个图片的加载频率。
人们已经发布了一些很好的检测选项的例子,但是根据您的要求,“在没有启用JS的浏览器的情况下,给出警告,说明网站无法正常运行”。 你基本上会添加一个以某种方式出现在页面上的元素,例如,当你获得一个徽章并带有适当的消息时,Stack Overflow上的“popup窗口”,然后用加载该页面时运行的一些Javascript删除它(我的意思是DOM,而不是整个页面)。
检测它在什么? JavaScript的? 那是不可能的。 如果你只是为了logging的目的,你可以使用某种跟踪scheme,其中每个页面都有JavaScript,会请求一个特殊的资源(可能是一个非常小的gif
或类似的)。 这样你就可以把唯一的页面请求和你的跟踪文件的请求区别开来。
你为什么不直接放置一个被劫持的onClick()事件处理程序,只有当JS被启用时才会触发,并使用它将一个参数(js = true)附加到被点击/选定的URL上(你也可以检测到一个下拉列表并更改添加隐藏表单字段的值)。 所以,现在当服务器看到这个参数(js = true)它知道JS被启用,然后做你的花哨的逻辑服务器端。
不利的一面是,用户第一次访问您的网站,书签,URL,search引擎生成的URL,您将需要检测到这是一个新用户,因此不要查找附加到URL中的NVP,服务器将不得不等待下一次单击以确定用户是否启用了JS。 此外,另一个缺点是,URL将在浏览器URL上结束,如果此用户为此URL书签,则将具有js = true的NVP,即使用户没有启用JS,虽然在下一次单击服务器时明智地知道用户是否仍然有JS启用。 叹息..这很有趣…
为了强制用户启用JavaScript,我将每个链接的“href”属性设置为相同的文档,通知用户启用JavaScript或下载Firefox(如果他们不知道如何启用JavaScript)。 我将实际链接url存储到链接的“name”属性中,并定义了一个全局的onclick事件,该事件读取“name”属性并在那里redirect页面。
这对我的用户基础很好,虽然有点法西斯)。
您不检测用户是否禁用JavaScript(服务器端或客户端)。 相反,您认为JavaScript已禁用,并且禁用JavaScript来构build您的网页。 这避免了无noscript
,你应该避免使用无论如何,因为它不正确的工作,是没有必要的。
例如,只要build立你的网站说<div id="nojs">This website doesn't work without JS</div>
然后,你的脚本将只是做document.getElementById('nojs').style.display = 'none';
并去其正常的JS业务。
在某些情况下,倒退就足够了。 使用javascript添加一个类:
// Jquery $('body').addClass('js-enabled'); /* CSS */ .menu-mobile {display:none;} body.js-enabled .menu-mobile {display:block;}
这可能会造成任何复杂的维护问题,但是对于某些事情来说这是一个简单的修复。 而不是试图检测什么时候没有加载,只是根据何时加载样式。
我已经想出了使用CSS和JavaScript本身的另一种方法。
这只是开始修补类和id。
CSS片段:
1.创build一个css ID规则,并将其命名为#jsDis。
2.使用“content”属性在BODY元素之后生成文本。 (你可以按照你的意愿devise)。
3创build第二个CSS ID规则并将其命名为#jsEn,并对其进行风格化。 (为了简单起见,我给了我的#jsEn规则一个不同的背景颜色。
<style> #jsDis:after { content:"Javascript is Disable. Please turn it ON!"; font:bold 11px Verdana; color:#FF0000; } #jsEn { background-color:#dedede; } #jsEn:after { content:"Javascript is Enable. Well Done!"; font:bold 11px Verdana; color:#333333; } </style>
JavaScript片段:
1.创build一个函数。
2.使用getElementById获取BODY ID并将其分配给一个variables。
3.使用JS函数“setAttribute”,更改BODY元素的ID属性的值。
<script> function jsOn() { var chgID = document.getElementById('jsDis'); chgID.setAttribute('id', 'jsEn'); } </script>
HTML部分。
1.命名ID为#jsDis的BODY元素属性。
2.添加函数名称的onLoad事件。 (JSON())。
<body id="jsDis" onLoad="jsOn()">
由于BODY标记已被赋予#jsDis的ID:
– 如果启用Javascript,则会自行更改BODY标签的属性。
– 如果Javascript被禁用,它将显示CSS的内容:规则文本。
你可以玩一个#wrapper容器,或任何使用JS的DIV。
希望这有助于得到这个想法。
在noscript中添加一个刷新元不是一个好主意。
-
因为noscript标签不符合XHTML标准
-
属性值“刷新”是非标准的,不应该使用。 “刷新”从用户处控制页面。 使用“刷新”将导致W3C的Web内容无障碍指南—参考http://www.w3schools.com/TAGS/att_meta_http_equiv.asp的失败。;
对于那些只想跟踪js是否被启用的用户来说,如何使用ajax例程来存储状态呢? 例如,我将所有访问者/访问logging在一组表中。 JSenabled字段可以设置为默认值FALSE,如果启用了JS,则ajax例程会将其设置为TRUE。
检查cookie使用纯粹的服务器端解决scheme,我已经在这里介绍,然后通过使用Jquery.Cookie删除cookie来检查JavaScript,然后检查cookie这种方式你检查cookie和JavaScript