Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检测JavaScript是否被禁用?_Javascript_Html_Code Snippets - Fatal编程技术网

如何检测JavaScript是否被禁用?

如何检测JavaScript是否被禁用?,javascript,html,code-snippets,Javascript,Html,Code Snippets,今天早上有一篇帖子问有多少人禁用了JavaScript。然后我开始想知道可以使用什么技术来确定用户是否禁用了它 有人知道一些短/简单的方法来检测JavaScript是否被禁用吗?我的意图是警告,如果浏览器没有启用JS,站点将无法正常运行 最终,我希望将它们重定向到在没有JS的情况下可以工作的内容,但我需要将此检测作为占位符开始。您可以使用简单的JS代码段设置隐藏字段的值。发回后,您知道JS是否已启用 或者您可以尝试打开一个弹出窗口,快速关闭(但可能可见) 您还可以使用NOSCRIPT标记为禁用J

今天早上有一篇帖子问有多少人禁用了JavaScript。然后我开始想知道可以使用什么技术来确定用户是否禁用了它

有人知道一些短/简单的方法来检测JavaScript是否被禁用吗?我的意图是警告,如果浏览器没有启用JS,站点将无法正常运行


最终,我希望将它们重定向到在没有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>