如何检测是否禁用了JavaScript?
今天早上有一篇帖子问有多少人禁用JavaScript。然后,我开始想知道可以使用什么技术来确定用户是否禁用了它。
有谁知道一些简短/简单的方法来检测JavaScript是否被禁用?我的目的是警告我们,如果没有启用JS的浏览器,站点将无法正常运行。
最终,我想将它们重定向到可以在没有JS的情况下运行的内容,但是我需要将此检测作为占位符才能启动。
解决方案
我们可以使用一个简单的JS代码段来设置隐藏字段的值。回发后,我们知道是否启用了JS。
或者,我们可以尝试打开一个快速关闭的弹出窗口(但是可能会看到)。
另外,我们还有NOSCRIPT标记,可用于为禁用JS的浏览器显示文本。
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>
没有JS的用户将获得next_page
链接,我们可以在此处添加参数,以便在下一页上知道他们是否通过JS /非JS链接来访问,或者尝试通过JS设置cookie,而没有表示JS已禁用。这两个示例都相当琐碎并且易于操作,但是我们明白了。
如果我们要纯粹统计一下用户中有多少人禁用了javascript,可以执行以下操作:
<noscript> <img src="no_js.gif" alt="Javascript not enabled" /> </noscript>
然后检查访问日志以查看该图像被击中了多少次。稍微粗略的解决方案,但可以为用户群提供一个百分比的好主意。
上面的方法(图像跟踪)在纯文本浏览器或者根本不支持js的浏览器中效果不佳,因此,如果用户群主要转向该领域,则可能不是最佳方法。
在什么地方检测到它? JavaScript?那是不可能的。如果只想将其用于记录目的,则可以使用某种跟踪方案,其中每个页面都有JavaScript,这些JavaScript会请求特殊资源(可能是很小的" gif"或者类似的资源)。这样,我们就可以区分唯一页面请求和跟踪文件请求之间的区别。
我们将要看一下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>
如果禁用了javascript,则无论如何客户端代码都不会运行,所以我认为我们是想让该信息在服务器端可用。在这种情况下,noscript的帮助较小。取而代之的是,我将有一个隐藏的输入并使用javascript来填充一个值。在下一个请求或者回发之后,如果该值在那里,则表示我们已打开javascript。
注意noscript之类的东西,第一个请求可能显示为javascript禁用,但以后的请求会打开它。
我过去使用的一种技术是使用JavaScript编写会话cookie,该cookie只是充当表示启用JavaScript的标志。然后,服务器端代码将查找此cookie,如果找不到,则将采取适当的措施。当然,此技术确实依赖于启用cookie!
我建议我们通过编写不引人注目的JavaScript进行其他选择。
使项目功能对禁用了JavaScript的用户有效,完成后,实现JavaScript UI增强。
https://en.wikipedia.org/wiki/Unobtrusive_JavaScript
我认为我们可以在noscript标签中插入图片标签,然后查看统计信息,网站已加载了多少次,以及该图片的加载频率。
我假设我们正在尝试确定是否提供JavaScript增强的内容。最好的实现会明显降级,因此该站点仍可以在没有JavaScript的情况下运行。我还假设意思是服务器端检测,而不是出于无法解释的原因使用<noscript>
元素。
没有一种执行服务器端JavaScript检测的好方法。作为替代方案,可以使用JavaScript设置cookie,然后在后续的页面浏览中使用服务器端脚本来测试该cookie。但是,这将不适合确定要传递的内容,因为它将无法区分没有cookie的访问者和新访问者或者阻止cookie的访问者。
例如,我们可能使用诸如document.location ='java_page.html'之类的东西将浏览器重定向到一个新的,满载脚本的页面。重定向失败表示JavaScript不可用,在这种情况下,我们可以诉诸CGI例程或者在标记之间插入适当的代码。 (注意:NOSCRIPT仅在Netscape Navigator 3.0及更高版本中可用。)
信用
http://www.intranetjournal.com/faqs/jsfaq/how12.html
人们已经发布了一些示例,这些示例是检测的不错选择,但是基于"警告警告,如果没有启用JS的浏览器,站点将无法正常运行"。我们基本上会添加一个在页面上以某种方式显示的元素,例如,当我们获得徽章时,在Stack Overflow上显示"弹出式窗口",并显示一条适当的消息,然后使用一些Javascript将其删除,该Javascript会在页面加载后立即运行(我的意思是DOM,而不是整个页面)。
<form onsubmit="this.js_enabled.value=1;return true;"> <input type="hidden" name="js_enabled" value="0"> <input type="submit" value="go"> </form>
如果用例是我们拥有一个表单(例如,登录表单),并且服务器端脚本需要知道用户是否启用了JavaScript,则可以执行以下操作:
提交表单之前,这会将js_enabled的值更改为1. 如果服务器端脚本得到0,则没有JS。如果得到1,则JS!
noscript标记效果很好,但由于本质上noscript是客户端检查,因此将需要每个添加的页面请求才能继续提供无用的JS文件。
我们可以使用JS设置cookie,但是正如其他人指出的那样,这可能会失败。理想情况下,我们希望能够检测JS客户端,并且不使用cookie,而是为该用户设置一个会话服务器端,以指示已启用JS。
一种可能性是使用JavaScript动态添加1x1图像,其中src属性实际上是服务器端脚本。该脚本所做的全部工作就是保存到启用了JS的当前用户会话中($ _SESSION ['js_enabled'])。然后,我们可以将1x1的空白图像输出回浏览器。该脚本不会为禁用了JS的用户运行,因此不会设置$ _SESSION ['js_enabled']。然后,对于向该用户提供的其他页面,我们可以决定是否包括所有外部JS文件,但是我们总是会希望包括该检查,因为某些用户可能正在使用NoScript Firefox添加组件或者安装了JS由于其他原因暂时停用。
我们可能希望将此检查包括在页面末尾附近,以便其他HTTP请求不会减慢页面的呈现速度。
<noscript><meta http-equiv="refresh" content="0; url=whatyouwant.html" /></noscript>
这是对我有用的方法:如果禁用了javascript,它将重定向访客
- 因为noscript标签不符合XHTML
- 属性值" Refresh"是非标准的,不应使用。 "刷新"使页面的控制权脱离用户。使用"刷新"将导致W3C的Web内容可访问性指南---参考http://www.w3schools.com/TAGS/att_meta_http_equiv.asp失败。
在noscript中的meta中添加刷新不是一个好主意。
为什么不只是放置一个劫持的onClick()事件处理程序,该事件处理程序仅在启用JS时才触发,并使用该事件处理程序将参数(js = true)添加到单击/选择的URL(我们还可以检测到下拉列表并更改valueof添加一个隐藏的表单字段)。因此,现在服务器看到此参数(js = true)时,便知道已启用JS,然后在服务器端执行了高级逻辑。
不利的一面是,用户首次访问网站,书签,URL,搜索引擎生成的URL时,我们将需要检测到这是新用户,因此不要寻找添加在URL上的NVP,服务器将必须等待下一次单击才能确定用户已启用JS /已禁用JS。另外,另一个缺点是该URL最终会出现在浏览器URL上,并且如果该用户随后将该URL标记为书签,即使该用户未启用JS,它也会具有js = true NVP,尽管在下一次单击时,服务器会明智的做法是了解用户是否仍启用了JS。 igh ..这很有趣...
只需使用noscript标记并要求用户启用javascript
http://www.w3schools.com/TAGS/tag_noscript.asp
因为我总是想给浏览器一些值得一看的东西,所以我经常使用这个技巧:
首先,在页面上需要JavaScript才能正常运行的任何部分(包括通过getElementById调用等进行修改的被动HTML元素)都被设计为可以按原样使用,并假定ISN没有javaScript可用。 (设计为似乎不存在)
<span name="jsOnly" style="display: none;"></span>
任何需要JavaScript的元素,我都会在标签中放置以下内容:
然后在我的文档开始处,我在getElementsByName('jsOnly')循环中使用.onload或者document.ready来设置.style.display ="";
来旋转与JS相关的元素回来。这样,非JS浏览器就不必看到站点的JS依赖部分,并且如果有的话,它会在就绪时立即显示。
一旦我们习惯了这种方法,就可以很容易地将代码进行混合以处理这两种情况,尽管我现在才尝试使用noscript
标签,并期望它会具有其他一些优点。
为了强制用户启用JavaScript,我将每个链接的'href'属性设置为同一文档,该属性通知用户启用JavaScript或者下载Firefox(如果他们不知道如何启用JavaScript)。我将实际的链接URL存储到链接的'name'属性,并定义了一个全局onclick事件,该事件读取'name'属性并在那里重定向页面。
这对我的用户群来说效果很好,尽管有点法西斯主义;)。
我想在这里添加我的.02. 它不是100%防弹的,但我认为它已经足够了。
对我来说,问题是出现"没有Java脚本,该站点无法正常运行"消息的首选示例,那么我们就需要确保站点在没有Java脚本的情况下也可以正常工作。一旦走上了这条路,我们就开始意识到该站点应该在关闭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>
因此,我们真正想要的是一个"重定向"到一个页面,该页面显示"傻傻地打开JS"。但是,当然,我们不能可靠地执行元重定向。所以,这是建议:
...我们网站中的所有内容都被一个" pagecontainer"类的div包裹。然后,noscript标记内的CSS将隐藏所有页面内容,而是显示我们想要显示的任何" no JS"消息。这实际上就是Gmail的功能……如果对Google足够好,那么对我的小网站也足够好。
对于那些只想跟踪是否启用了js的人,如何使用ajax例程存储状态?例如,我将所有访客/访问记录在一组表中。可以将JSenabled字段设置为默认值FALSE,并且如果启用了JS,则ajax例程会将其设置为TRUE。
有点难,但是(发型给了我这个主意)
.pagecontainer { display: none; }
CSS:
function load() { document.getElementById('noscriptmsg').style.display = "none"; document.getElementById('load').style.display = "block"; /* rest of js*/ }
JS:
<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>
HTML:
段落数量不匹配