今天早上有一篇帖子问有多少人禁用JavaScript。然后我开始想知道可以使用什么技术来确定用户是否禁用了它。
有谁知道一些简单/简单的方法来检测JavaScript是否被禁用?我的目的是警告您,如果没有启用JS的浏览器,站点将无法正常运行。
最终,我想将它们重定向到可以在没有JS的情况下运行的内容,但是我需要将此检测作为占位符才能启动。
今天早上有一篇帖子问有多少人禁用JavaScript。然后我开始想知道可以使用什么技术来确定用户是否禁用了它。
有谁知道一些简单/简单的方法来检测JavaScript是否被禁用?我的目的是警告您,如果没有启用JS的浏览器,站点将无法正常运行。
最终,我想将它们重定向到可以在没有JS的情况下运行的内容,但是我需要将此检测作为占位符才能启动。
Answers:
我假设您正在尝试确定是否提供JavaScript增强的内容。最好的实现会明显降级,因此该站点仍然可以在没有JavaScript的情况下运行。我还假设您的意思是服务器端检测,而不是<noscript>
出于无法解释的原因使用该元素。
没有一种执行服务器端JavaScript检测的好方法。作为替代方案,可以使用JavaScript设置cookie,然后在后续页面浏览时使用服务器端脚本测试该cookie。但是,这将不适合确定要传递的内容,因为它将无法区分没有cookie的访问者与新访问者或阻止cookie的访问者。
<style>
块<noscript>
以取消隐藏(如果启用了JS,则不会在此重排)。令人惊讶的是,这适用于所有现代浏览器,甚至在IE6中
我想在这里添加我的.02。它不是100%防弹的,但我认为它足够好。
对我来说,问题是出现“没有Java脚本,该站点无法正常运行”消息的首选示例,那么您需要确保您的站点在没有Java脚本的情况下可以正常工作。一旦走上了这条路,您就开始意识到该站点应该在关闭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>
... 您网站中的所有内容都被一个“ pagecontainer”类的div包裹。然后,noscript标记内的CSS将隐藏您的所有页面内容,而是显示要显示的任何“ no JS”消息。这实际上就是Gmail的功能……如果对Google足够好,对我的小网站也足够好。
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则意味着是JS被禁用。这两个例子都相当简单,易于操作,但是您明白了。
如果您要纯粹统计一下您有多少用户禁用了javascript,可以执行以下操作:
<noscript>
<img src="no_js.gif" alt="Javascript not enabled" />
</noscript>
然后检查您的访问日志以查看该图像被击中了多少次。稍微粗略的解决方案,但可以为您的用户群提供一个百分比的好主意。
上面的方法(图像跟踪)在纯文本浏览器或根本不支持js的浏览器中效果不佳,因此,如果您的用户群主要转向该领域,则可能不是最佳方法。
这是对我有用的方法:如果禁用了javascript,它将重定向访客
<noscript><meta http-equiv="refresh" content="0; url=whatyouwant.html" /></noscript>
如果您的用例是您拥有一个表单(例如,登录表单),并且服务器端脚本需要知道用户是否启用了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!
我建议您通过编写不引人注目的JavaScript进行其他选择。
使项目功能对禁用了JavaScript的用户有效,完成后,实现JavaScript UI增强。
<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”消息。测试是否启用JavaScript的最好方法就是尝试并使用JavaScript!如果有效,则启用,否则无效。
在主体上使用.no-js类,并基于.no-js父类创建非javascript样式。如果禁用了javascript,则将获得所有非javascript样式;如果有JS支持,则将替换.no-js类,从而照常提供所有样式。
document.body.className = document.body.className.replace("no-js","js");
通过modernizr 在HTML5样板http://html5boilerplate.com/中使用的技巧,但您可以使用一行JavaScript来替换类
Noscript标记还可以,但是为什么可以使用CSS完成HTML中的多余内容
.nojs
堂课!这是最无缝的方法之一,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解决方案吗?
您可以使用简单的JS代码段来设置隐藏字段的值。回发后,您知道是否启用了JS。
或者,您可以尝试打开一个快速关闭的弹出窗口(但是可能会看到)。
另外,您还有NOSCRIPT标记,可用于为禁用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请求不会减慢页面的呈现速度。
将此添加到每个页面的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>
感谢杰伊。
因为我总是想给浏览器一些值得一看的东西,所以我经常使用这个技巧:
首先,假设需要ISN没有javaScript,那么页面中需要JavaScript才能正常运行的任何部分(包括通过getElementById调用等进行修改的被动HTML元素)都可以按原样使用。(设计为似乎不存在)
任何需要JavaScript的元素,我都会在标签中放置以下内容:
<span name="jsOnly" style="display: none;"></span>
然后,在文档开始处,我使用.onload
或document.ready
在的循环内getElementsByName('jsOnly')
设置.style.display = "";
重新启用JS依赖元素。这样,非JS浏览器就不必看到站点的JS依赖部分,如果有,它会在准备就绪时立即显示。
一旦您习惯了这种方法,就可以很容易地将您的代码进行混合以处理这两种情况,尽管我现在只是在尝试使用noscript
标签,并期望它会带来更多的优势。
这是“最干净”的解决方案ID用法:
<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>
常见的解决方案是将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秒内重定向到网站的主页。另外,它还将参数javascript = false发送到服务器。
然后,服务器端脚本(例如node.js或PHP)可以解析该参数,并知道JavaScript已被禁用。然后,它可以将网站的特殊非JavaScript版本发送给客户端。
例如,您可能使用诸如document.location ='java_page.html'之类的东西将浏览器重定向到一个新的,满载脚本的页面。重定向失败表示JavaScript不可用,在这种情况下,您可以诉诸CGI例程或在标记之间插入适当的代码。(注意:NOSCRIPT仅在Netscape Navigator 3.0及更高版本中可用。)
为什么不放一个仅在启用JS时才触发的被劫持的onClick()事件处理程序,并使用该事件处理程序将参数(js = true)附加到单击/选择的URL(您还可以检测到一个下拉列表)并更改添加隐藏表单字段的值)。因此,现在服务器看到此参数(js = true)时,便知道已启用JS,然后在服务器端执行了高级逻辑。
不利的一面是,用户首次访问您的网站时,书签,URL,搜索引擎生成的URL –您将需要检测到这是新用户,因此不要寻找附加在URL上的NVP,并且服务器将必须等待下一次单击才能确定用户已启用/禁用了JS。另外,另一个缺点是该URL最终会出现在浏览器URL上,并且如果该用户随后将该URL加为书签,即使该用户未启用JS,它也会具有js = true NVP,尽管在下一次单击时,服务器会明智的做法是了解用户是否仍启用了JS。igh ..这很有趣...
为了强制用户启用JavaScript,我将每个链接的'href'属性设置为同一文档,该属性通知用户启用JavaScript或下载Firefox(如果他们不知道如何启用JavaScript)。我将实际的链接URL存储到链接的“名称”属性,并定义了一个全局onclick事件,该事件读取“名称”属性并在那里重定向页面。
这对我的用户群来说效果很好,尽管有点法西斯主义;)。
您不会检测到用户是否禁用了javascript(服务器端或客户端)。相反,您假定已禁用javascript,并在禁用javascript的情况下构建网页。这样就消除了对的需要noscript
,您无论如何都应避免使用它,因为它工作不正确并且是不必要的。
例如,只要建立您的网站来说 <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;}
这可能会在任何复杂的问题上造成维护问题,但这只是对某些问题的简单解决。与其尝试检测未加载的时间,不如根据加载的时间来设置样式。
我想添加我的解决方案,以获取关于禁用了javascript的实际用户访问我网站的可靠统计数据,占总数的百分比。每次检查仅执行一次此检查,具有以下好处:
我的代码使用带有ajax的PHP,mysql和jquery,但可以适用于其他语言:
像这样在数据库中创建一个表:
CREATE TABLE IF NOT EXISTS `log_JS` (
`logJS_id` int(11) NOT NULL AUTO_INCREMENT,
`data_ins` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`session_id` varchar(50) NOT NULL,
`JS_ON` tinyint(1) NOT NULL DEFAULT '0',
`agent` varchar(255) DEFAULT NULL,
PRIMARY KEY (`logJS_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
使用session_start()或同等功能(需要jquery)后,将其添加到每个页面:
<? if (!isset($_SESSION["JSTest"]))
{
mysql_query("INSERT INTO log_JS (session_id, agent) VALUES ('" . mysql_real_escape_string(session_id()) . "', '" . mysql_real_escape_string($_SERVER['HTTP_USER_AGENT']). "')");
$_SESSION["JSTest"] = 1; // One time per session
?>
<script type="text/javascript">
$(document).ready(function() { $.get('JSOK.php'); });
</script>
<?
}
?>
这样创建页面JSOK.php:
<?
include_once("[DB connection file].php");
mysql_query("UPDATE log_JS SET JS_ON = 1 WHERE session_id = '" . mysql_real_escape_string(session_id()) . "'");
我想出了另一种使用CSS和JavaScript本身的方法。
这只是开始修改类和id。
CSS片段:
1.创建一个CSS ID规则,并将其命名为#jsDis。
2.使用“ content”属性在BODY元素之后生成文本。(您可以根据需要设置样式)。
3创建第二个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.创建一个函数。
2.使用getElementById获取BODY ID,并将其分配给变量。
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中的meta中添加刷新不是一个好主意。
因为noscript标签不符合XHTML
属性值“ Refresh”是非标准的,不应使用。“刷新”使页面的控制权脱离用户。使用“刷新”会导致W3C的Web内容可访问性指南---参考http://www.w3schools.com/TAGS/att_meta_http_equiv.asp失败。