一个网站如何即时检测到JavaScript已被禁用?

通常情况下,当一个页面被加载,浏览器禁用JavaScript,我们使用<noscript>标签来写一些警告,并告诉客户端启用Javascript。 但是,即使您使用JS加载页面之后 ,Facebook一旦被禁用,您将收到通知。 我怎么能做这样的事情?

更新:这种机制已经不再在Facebook上使用了,但是之前,我提出这个问题太晚了,但是如果find答案的话,我会非常感激。

我曾经尝试过

我想我的页面里面有一个段,一直检查Javascript是否被禁用,如果是的话,显示<noscript>的内容。

为了达到这个目的,我创build了一个CheckJS.html页面。

 <!DOCTYPE html> <html> <head> <meta http-equiv="refresh" content="0"> </head> <body> <noscript> JS is disabled! </noscript> </body> </html> 

这个页面不断刷新 ,当JS被禁用, JS被禁用! 会出现。

在我的原始页面中添加此页面。 我尝试了以下内容:

1- .load()

我使用JQuery.load('CheckJS.html')在一个div 。 但是,似乎.load()只加载CheckJS.html<body>内容 。 意思是<head>元素,里面的东西不会被加载到div

2 iframe

经过一番search之后,我发现加载完整 html页面( 包括<head> )的唯一可能方法是使用<iframe>

 <iframe src="CheckJS.html"></iframe> 

但是, CheckJS.html<meta http-equiv="refresh" content="0">会影响父页面,原始页面本身开始刷新。

如果我们能够使用这个<iframe>而不强制原始页面刷新,那么这可能是一个解决scheme,但即使find了这个解决scheme,我觉得它更像是一个技巧,而不是一个真正的解决scheme。


UPDATE

安东尼的答案certificate,我错了,该iframe刷新原来的页面,浏览器显示刷新,但实际上它不是,如果是这样,那么Javascript是可以避免的,我提供的CheckJS.html做的工作,甚至更好的是,当JS被重新启用时, <noscript>将被隐藏。 仍然这整个iframe的方法是不是很方便用户(可以冻结浏览器),除非刷新每10秒钟左右,这不是一个即时检测

CSS解决scheme

请参阅DEMO 。 也可以作为一个JS库 。

通过不断用JavaScript代替元素来停止CSSanimation。 一旦JavaScript被禁用,CSSanimation就会启动并显示一条消息。

@keyframes 浏览器兼容性 :Chrome,Firefox 5.0 +,IE 10+,Opera 12+,Safari 4.0+

 <style> .nojs_init { position: relative; animation:nojs-animation 0.2s step-end; -moz-animation:nojs-animation 0.2s step-end; /* Firefox */ -webkit-animation:nojs-animation 0.2s step-end; /* Safari and Chrome */ -o-animation:nojs-animation 0.2s step-end; /* Opera */ } @keyframes nojs-animation { from {visibility:hidden;opacity:0;} to {visibility:visible;opacity:1;} } @-moz-keyframes nojs-animation /* Firefox */ { from {visibility:hidden;opacity:0;} to {visibility:visible;opacity:1;} } @-webkit-keyframes nojs-animation /* Safari and Chrome */ { from {visibility:hidden;opacity:0;} to {visibility:visible;opacity:1;} } @-o-keyframes nojs-animation /* Opera */ { from {visibility:hidden;opacity:0;} to {visibility:visible;opacity:1;} } </style> 
 <body> <div id="content"></div> <div id="nojs" class="nojs_init"><noscript>JavaScript is <span style="font-weight:bold;">disabled</span>.</noscript></div> </body> <script> document.getElementById("content").innerHTML = 'JavaScript is <span style="font-weight:bold;">enabled</span>. Try disabling JavaScript now.'; var elm = document.getElementById("nojs"), animation = false, animationstring = 'animation', keyframeprefix = '', domPrefixes = 'Webkit Moz O ms Khtml'.split(' '), pfx = ''; if( elm.style.animationName ) { animation = true; } if( animation === false ) { for( var i = 0; i < domPrefixes.length; i++ ) { if( elm.style[ domPrefixes[i] + 'AnimationName' ] !== undefined ) { pfx = domPrefixes[ i ]; animationstring = pfx + 'Animation'; keyframeprefix = '-' + pfx.toLowerCase() + '-'; animation = true; break; } } } // Continuously replace element function jsdetect() { var elm = document.getElementById("nojs"); var newone = elm.cloneNode(true); elm.parentNode.replaceChild(newone, elm); } // Only apply to browsers that support animation if (animation) { elm.innerHTML = 'JavaScript is <span style="font-weight:bold;">disabled</span>.'; setInterval(jsdetect, 0); } </script> 

恩,我认为这取决于浏览器。 HTML5支持HEAD元素中的<noscript> ,因此您可以尝试如下所示:

 <style> .noscriptMessage { display: none; } </style> <noscript> <style> .noscriptMessage { display: block } </style> </noscript> <body> <div class=".noscriptMessage">Foo bar baz</div> ... </body> 

规格: http : //dev.w3.org/html5/markup/noscript.html

从规格:

允许的内容:零个或多个:一个链接元素,或者一个元素http-equiv =默认样式元素,或者一个元素http-equiv =刷新元素或者一个样式元素

编辑:嘿偷窥,所以这样做! 试试关掉JS吧。

怎么样的JavaScript代码,不断延期http-equiv =刷新(每次更换meta元素?)只要JavaScriptclosures,meta元素不再被replace,刷新最终会发生。 这只是一个想法,我不知道如果元素插入甚至是可能的。

我build议看看HTML5 Boilerplate和Modernizr是如何完成的。

如果您查看HTML5 Boilerplate的HTML,则会在第7行中看到<html>标记被赋予了一个no-js类。 然后,当Modernizr的JavaScript运行时,它所做的第一件事是删除no-js类。

这样做,你可以应用CSS规则,只有在no-js类的情况下才显示内容:

 #no-script-message { display: none; } .no-js #no-script-message { display: block; } 

扩展@ JoshMock的答案,这里是一个简单的方法(通过Paul Irish )来检测客户端是否启用了JS:

HTML

 <html class="no-js"> <head> <script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script> 

这应该与所有浏览器兼容,速度相当快。 然后你可以使用.js.no-js类在css中隐藏/显示元素。

如果你正在做任何其他function检测,我会build议使用Modernizr与html class="no-js"标记(modernizr会自动为您添加js类,以及css3检测)。

实际上,如果浏览器支持java脚本,则比较容易。

当然,这是在“一个网站即时检测JavaScript”的情况下。 巫婆是从浏览器到服务器的第一个http请求< – >响应。 你只是'不能'。 确定浏览器function后,您将不得不向服务器发送另一个请求。

现在, 没有办法检查在第一个请求中是否从服务器端启用了JavaScript 。 所以,如果JavaScript被禁用,你必须做一个回传或redirect到一个非JavaScript页面,使用其他build议(女巫是无效的,但似乎工作):

 <head> <noscript><meta http-equiv="refresh" content="0; url=whatyouwant.html"></noscript> ... </head> 

有一些“浏览器function”和浏览器“插件”可以通过http请求获得,所以你需要一个好的“服务器端”脚本来实现你的目标。

请参阅browserhawk或quirksmode关于javascript的某些信息来检测浏览器。

此外,还有一个“保护”的问题,不知道如何检测,如果JavaScript是禁用的