如何检测JavaScript是否被禁用?
今天早上有一篇帖子问有多少人禁用了JavaScript。然后我开始想知道可以使用什么技术来确定用户是否禁用了它 有人知道一些短/简单的方法来检测JavaScript是否被禁用吗?我的意图是警告,如果浏览器没有启用JS,站点将无法正常运行如何检测JavaScript是否被禁用?,javascript,html,code-snippets,Javascript,Html,Code Snippets,今天早上有一篇帖子问有多少人禁用了JavaScript。然后我开始想知道可以使用什么技术来确定用户是否禁用了它 有人知道一些短/简单的方法来检测JavaScript是否被禁用吗?我的意图是警告,如果浏览器没有启用JS,站点将无法正常运行 最终,我希望将它们重定向到在没有JS的情况下可以工作的内容,但我需要将此检测作为占位符开始。您可以使用简单的JS代码段设置隐藏字段的值。发回后,您知道JS是否已启用 或者您可以尝试打开一个弹出窗口,快速关闭(但可能可见) 您还可以使用NOSCRIPT标记为禁用J
最终,我希望将它们重定向到在没有JS的情况下可以工作的内容,但我需要将此检测作为占位符开始。您可以使用简单的JS代码段设置隐藏字段的值。发回后,您知道JS是否已启用 或者您可以尝试打开一个弹出窗口,快速关闭(但可能可见) 您还可以使用NOSCRIPT标记为禁用JS的浏览器显示文本。块在禁用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的浏览器,因此如果您的用户群主要转向该领域,这可能不是最好的方法。用什么方法检测它?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脚本。。。
访问
如果禁用javascript,客户端代码将无法运行,因此我假设您的意思是希望服务器端可以使用这些信息。在这种情况下,noscript就没那么有用了。相反,我会有一个隐藏的输入,并使用javascript来填充一个值。在下一个请求或回发之后,如果该值在那里,您就知道javascript已打开
要小心像noscript这样的东西,第一个请求可能会显示javascript已禁用,但将来的请求会打开它。我过去使用的一种技术是使用javascript编写会话cookie,它只是作为一个标志来表示javascript已启用。然后服务器端代码查找此cookie,如果未找到,则采取适当的操作。当然,这项技术确实依赖于启用cookies 我建议您换一种方式,编写不引人注目的JavaScript 为禁用JavaScript的用户提供项目功能,完成后,实现JavaScript UI增强
我认为您可以在noscript标记中插入一个图像标记,然后查看站点的加载次数和此图像的加载频率的统计信息。我假设您正在尝试决定是否提供JavaScript增强的内容。最好的实现可以干净地降级,因此站点仍然可以在没有JavaScript的情况下运行。我还假设您的意思是检测,而不是出于无法解释的原因使用元素
没有一种很好的方法来执行服务器端JavaScript检测。作为一种替代方法,可以在后续页面查看时使用服务器端脚本测试cookie。但是,这不适合决定交付什么内容,因为它无法区分没有cookie的访问者与新访问者或阻止cookie的访问者 例如,您可以使用document.location='java_page.html'之类的东西将浏览器重定向到一个新的、充满脚本的页面。重定向失败意味着JavaScript不可用,在这种情况下,您可以求助于CGI例程或在标记之间插入适当的代码。(注意:NOSCRIPT仅在Netscape Navigator 3.0及更高版本中可用。) 功劳
人们已经发布了一些示例,这些示例是很好的检测选项,但基于您的要求:“如果浏览器未启用JS,则警告网站无法正常运行”。基本上,您添加了一个元素,该元素以某种方式出现在页面上,例如,当您获得徽章时,堆栈溢出上的“弹出窗口”带有适当的消息,然后使用一些Javascript删除该元素,该Javascript在页面加载后立即运行(我指的是DOM,而不是整个页面)。如果您的用例是您有一个表单(例如,登录表单)服务器端脚本需要知道用户是否启用了JavaScript,您可以这样做:
<form onsubmit="this.js_enabled.value=1;return true;">
<input type="hidden" name="js_enabled" value="0">
<input type="submit" value="go">
</form>
<!DOCTYPE html>
<html lang="en">
<head>
<noscript>
<meta http-equiv="refresh" content="0; /?javascript=false">
</noscript>
<meta charset="UTF-8"/>
<title></title>
</head>
</html>
<?
include_once("[DB connection file].php");
mysql_query("UPDATE log_JS SET JS_ON = 1 WHERE session_id = '" . mysql_real_escape_string(session_id()) . "'");
这将在提交表单之前将js_enabled的值更改为1。如果服务器端脚本得到0,则没有JS。如果它得到1,JS noscript标签工作得很好,但需要每个额外的页面请求才能继续提供无用的JS文件,因为noscript本质上是一个客户端检查 您可以使用JS设置cookie,但正如其他人指出的,这可能会失败。理想情况下,您希望能够检测JS客户端,并且在不使用cookie的情况下,为该用户设置一个会话服务器端,指示启用了JS 一种可能性是使用JavaScript动态添加1x1映像,其中src属性实际上是服务器端脚本。此脚本所做的只是将JS保存到当前启用的用户会话($\u会话['JS\u enabled'])。然后,您可以将1x1空白图像输出回浏览器。脚本不会为禁用JS的用户运行,因此不会设置$\u会话['JS\u enabled']。然后,对于提供给该用户的其他页面,您可以决定是否包含所有外部JS文件,但您将始终
<span name="jsOnly" style="display: none;"></span>
<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 {
display: none;
}
function load() {
document.getElementById('noscriptmsg').style.display = "none";
document.getElementById('load').style.display = "block";
/* rest of 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>
<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>
document.body.className = document.body.className.replace("no-js","js");
// Jquery
$('body').addClass('js-enabled');
/* CSS */
.menu-mobile {display:none;}
body.js-enabled .menu-mobile {display:block;}
<!DOCTYPE html>
<html lang="en">
<head>
<noscript>
<meta http-equiv="refresh" content="0; /?javascript=false">
</noscript>
<meta charset="UTF-8"/>
<title></title>
</head>
</html>
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;
<? 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>
<?
}
?>
<?
include_once("[DB connection file].php");
mysql_query("UPDATE log_JS SET JS_ON = 1 WHERE session_id = '" . mysql_real_escape_string(session_id()) . "'");
<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>
<script>
function jsOn() {
var chgID = document.getElementById('jsDis');
chgID.setAttribute('id', 'jsEn');
}
</script>
<body id="jsDis" onLoad="jsOn()">
<!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>
<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>
<body>
<div id="main_body" style="display: none;">
website content.
</div>
</body>
<script type="text/javascript">
document.getElementById("main_body").style.display="block";
</script>