如何检测JavaScript是否被禁用?

时间:2008-09-23 14:07:13

标签: javascript html code-snippets

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

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

最终我想将它们重定向到能够在缺少JS的情况下工作的内容,但我需要将此检测作为占位符来启动。

38 个答案:

答案 0 :(得分:349)

我想在这里添加.02。它不是100%防弹,但我认为它已经足够好了。

问题,对我而言,首选的例子是“在没有Javascript的情况下使用此网站效果不佳”的消息是,您需要确保您的网站在没有Javascript的情况下正常工作。一旦你开始走这条路,那么你就会开始意识到这个网站应该是防弹的,关闭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>

...其中您网站中所有的内容都包含了一个div类“pagecontainer”。然后,noscript标记内的CSS将隐藏您的所有页面内容,而是显示您想要显示的任何“无JS”消息。这实际上就是Gmail的目的......如果它对谷歌来说足够好,那对我的小网站来说已经足够了。

答案 1 :(得分:277)

我认为您正在尝试决定是否提供JavaScript增强的内容。最好的实现会干净利落地降低,因此该站点仍然可以在没有JavaScript的情况下运行。我还假设您的意思是服务器端检测,而不是出于无法解释的原因使用<noscript>元素。

没有一种好方法可以执行服务器端JavaScript检测。作为替代方案,可以使用JavaScript设置cookie,然后在后续页面查看时使用服务器端脚本来测试该cookie。但是,这不适合决定要传送的内容,因为它无法区分没有cookie的访问者与阻止cookie的新访问者或访问者。

答案 2 :(得分:193)

禁用JavaScript时会执行

noscript个块,通常用于显示您在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链接,还是尝试通过以下方式设置cookie JS,缺少这意味着JS被禁用。这两个例子都是相当微不足道的,可以操纵,但你明白了。

如果您想要了解有多少用户禁用javascript的纯粹统计信息,您可以执行以下操作:

<noscript>
    <img src="no_js.gif" alt="Javascript not enabled" />
</noscript>

然后检查您的访问日志以查看此图片被点击的次数。一个稍微粗略的解决方案,但它会为您的用户群提供百分比的好主意。

上述方法(图像跟踪)不适用于纯文本浏览器或根本不支持js的浏览器,因此如果您的用户群主要向该区域摆动,这可能不是最好的方法。

答案 3 :(得分:45)

这对我有用:如果禁用了javascript,它会重定向访问者

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

答案 4 :(得分:44)

如果您的用例是您有表单(例如,登录表单)并且您的服务器端脚本需要知道用户是否启用了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!

答案 5 :(得分:41)

我建议你通过编写不引人注目的JavaScript来反过来。

让禁用JavaScript的用户使用您的项目功能,并在完成后实施JavaScript UI增强功能。

https://en.wikipedia.org/wiki/Unobtrusive_JavaScript

答案 6 :(得分:32)

在正文上使用.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标签没问题,但为什么在你的html中有额外的东西可以用css完成

答案 7 :(得分:30)

<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!如果有效,则启用,如果没有,那么它不是......

答案 8 :(得分:13)

您可以使用简单的JS代码段来设置隐藏字段的值。回发后,您知道JS是否已启用。

或者您可以尝试打开一个快速关闭的弹出窗口(但可能会显示)。

此外,您还可以使用NOSCRIPT标记来显示已禁用JS的浏览器的文本。

答案 9 :(得分:12)

noscript标签运行良好,但是需要每个额外的页面请求继续提供无用的JS文件,因为基本上noscript是客户端检查。

您可以使用JS设置cookie,但正如其他人指出的那样,这可能会失败。理想情况下,您希望能够检测JS客户端,并且不使用cookie,为该用户设置会话服务器端,以指示JS已启用。

可能是使用JavaScript动态添加1x1图像,其中src属性实际上是服务器端脚本。所有这个脚本都会保存到当前启用了JS的用户会话($ _SESSION ['js_enabled'])。然后,您可以将1x1空白图像输出回浏览器。对于已禁用JS的用户,该脚本不会运行,因此不会设置$ _SESSION ['js_enabled']。然后,对于提供给该用户的其他页面,您可以决定是否包含所有外部JS文件,但是您始终希望包含该检查,因为您的某些用户可能正在使用NoScript Firefox附加组件或具有JS由于其他原因暂时禁用。

您可能希望在靠近页面末尾的位置包含此检查,以便额外的HTTP请求不会降低页面呈现的速度。

答案 10 :(得分:12)

将其添加到每个页面的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>

感谢周杰伦。

答案 11 :(得分:12)

有点难,但(发型给了我这个想法)

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解决方案吗?

答案 12 :(得分:12)

您需要查看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>

答案 13 :(得分:11)

因为我总是想给浏览器一些值得一看的东西,所以经常使用这个技巧:

首先,需要JavaScript才能正常运行的页面的任何部分(包括通过getElementById调用等进行修改的被动HTML元素)都可以原样使用,并假设没有可用的javaScript。 (设计好像不在那里)

任何需要JavaScript的元素,我将其置于标记内:

<span name="jsOnly" style="display: none;"></span>

然后在我的文档开头,我在.onload的循环中使用document.readygetElementsByName('jsOnly')来设置.style.display = "";重新启用JS依赖元素。这样,非JS浏览器就不必看到网站的JS依赖部分,如果有的话,它会立即出现。

一旦习惯了这种方法,就可以很容易地混合代码来处理这两种情况,尽管我现在只是在试验noscript标记,并期望它会有一些额外的优势。

答案 14 :(得分:9)

一个常见的解决方案是将元标记与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版本的网站。

答案 15 :(得分:9)

这是使用“最干净”的解决方案:

<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>

答案 16 :(得分:8)

如果禁用了javascript,则无论如何都不会运行客户端代码,因此我认为您的意思是希望服务器端提供该信息。在这种情况下, noscript 不太有帮助。相反,我有一个隐藏的输入并使用javascript来填充值。在您下次请求或回发后,如果值已存在,则表示已启用javascript。

小心noscript之类的内容,第一个请求可能会显示javascript已禁用,但未来的请求会将其打开。

答案 17 :(得分:5)

例如,您可以使用类似document.location ='java_page.html'的内容将浏览器重定向到新的带脚本的页面。无法重定向意味着JavaScript不可用,在这种情况下,您可以使用CGI ro utines或在标记之间插入适当的代码。 (注意:NOSCRIPT仅适用于Netscape Navigator 3.0及更高版本。)

信用 http://www.intranetjournal.com/faqs/jsfaq/how12.html

答案 18 :(得分:4)

人们已经发布了一些很好的检测选项示例,但是根据您的要求“在没有启用JS的浏览器的情况下发出网站无法正常运行的警告”。您基本上添加了一个以某种方式出现在页面上的元素,例如,当您获得徽章时,Stack Overflow上的“弹出窗口”,以及相应的消息,然后使用在加载页面时运行的一些Javascript删除它(我指的是DOM,而不是整个页面。

答案 19 :(得分:4)

我认为您可以将图片标记插入到noscript标记中,并查看统计信息您网站的次数以及此图片的加载频率。

答案 20 :(得分:4)

我过去使用的一种技术是使用JavaScript编写一个会话cookie,它只是作为一个标志来表示启用了JavaScript。然后服务器端代码查找此cookie,如果找不到,则采取适当的操作。当然,这种技术确实依赖于启用cookie!

答案 21 :(得分:3)

我已经找到了另一种使用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.使用#jsDis的ID命名BODY元素属性。
2.使用函数名称添加onLoad事件。 (JSON())。

<body id="jsDis" onLoad="jsOn()">

由于BODY标签已被赋予#jsDis的身份证号:
- 如果启用了Javascript,它将自行更改BODY标记的属性 - 如果Javascript被禁用,它将显示css'内容:'规则文本。

您可以使用#wrapper容器,也可以使用任何使用JS的DIV。

希望这有助于实现这个想法。

答案 22 :(得分:3)

在某些情况下,向后做这件事就足够了。使用javascript添加课程:

// Jquery
$('body').addClass('js-enabled');

/* CSS */
.menu-mobile {display:none;}
body.js-enabled .menu-mobile {display:block;}

这可能会在任何复杂的问题上产生维护问题,但对某些事情来说这是一个简单的修复。而不是试图检测何时没有加载,只需根据加载时间进行设置。

答案 23 :(得分:3)

使用纯服务器端解决方案检查cookie我已经介绍here然后通过使用Jquery.Cookie删除cookie来检查javascript,然后通过这种方式检查cookie,检查cookie和javascript

答案 24 :(得分:3)

您无法检测用户是否已禁用javascript(服务器端或客户端)。相反,您假设javascript已禁用,并在禁用javascript的情况下构建您的网页。这样就不需要noscript了,你应该避免使用它,因为它不能正常工作而且是不必要的。

例如,只需将您的网站构建为<div id="nojs">This website doesn't work without JS</div>

即可

然后,您的脚本将只执行document.getElementById('nojs').style.display = 'none';并继续正常的JS业务。

答案 25 :(得分:3)

答案 26 :(得分:3)

为什么不把一个被劫持的onClick()事件处理程序只在启用JS时触发,并使用它将参数(js = true)附加到单击/选中的URL(你也可以检测到下拉列表并更改添加隐藏表单字段的值。所以现在当服务器看到这个参数(js = true)时,它知道JS已启用,然后做你喜欢的逻辑服务器端。
  不利的一面是,当用户第一次访问您的网站,书签,URL,搜索引擎生成的URL时,您需要检测到这是一个新用户,因此不要寻找附加到URL中的NVP,并且服务器必须等待下一次单击以确定用户是否启用了JS。此外,另一个缺点是URL将最终在浏览器URL上,如果该用户然后为此URL添加书签,它将具有js = true NVP,即使用户未启用JS,但在下次单击时服务器将明智地知道用户是否仍然启用了JS。叹息......这很有趣......

答案 27 :(得分:3)

检测它是什么? JavaScript的?那是不可能的。如果您只是想将其用于日志记录,则可以使用某种跟踪方案,其中每个页面都有JavaScript,可以请求特殊资源(可能是非常小的gif或类似的)。这样,您就可以区分唯一页面请求和跟踪文件请求。

答案 28 :(得分:2)

当浏览器中没有启用js时,将执行<noscript>标签内的

代码。 我们可以使用noscript标签来显示msg以打开JS,如下所示。<noscript> <h1 style="text-align: center;">enable java script and reload the page</h1> </noscript> 同时将我们的网站内容保持在隐藏的内部。如下

<body>
<div id="main_body" style="display: none;">
website content.
</div>
</body>

现在如果打开JS,你可以让你的main_body内的内容可见,如下所示

<script type="text/javascript">
document.getElementById("main_body").style.display="block";
</script>

答案 29 :(得分:2)

对于那些只想跟踪js是否已启用的人,如何使用ajax例程来存储状态?例如,我在一组表中记录所有访客/访问。 JSenabled字段可以设置为默认值FALSE,如果启用了JS,则ajax例程会将其设置为TRUE。

答案 30 :(得分:2)

我想添加我的解决方案,以获取有关真实用户访问我网站的数量的可靠统计数据,并且对整个用户禁用了javascript。检查仅在每次会话中进行一次,具有以下好处:

  • 访问100页或仅1页的用户每人计数1。这样可以专注于单个用户,而不是页面。
  • 无论如何都不会破坏页面流,结构或语义
  • 可以记录用户代理。这允许从统计数据中排除机器人,例如通常禁用JS的google bot和bing bot!还可以记录IP,时间等......
  • 每次会话只需一次检查(最小过载)

我的代码使用PHP,mysql和jquery与ajax但可以适应其他languanges:

在您的数据库中创建一个像这样的表:

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()) . "'");

答案 31 :(得分:2)

在noscript中添加元数据刷新并不是一个好主意。

  1. 因为noscript标记不符合XHTML

  2. 属性值“Refresh”是非标准的,不应使用。 “刷新”控制页面远离用户。使用“刷新”将导致W3C的Web内容可访问性指南失败 ---参考http://www.w3schools.com/TAGS/att_meta_http_equiv.asp

答案 32 :(得分:1)

这是一个PHP脚本,可以在生成任何输出之前包含一次。它并不完美,但在大多数情况下它运行良好,以避免提供客户端不会使用的内容或代码。标题注释解释了它是如何工作的。

<?php
/*****************************************************************************
 * JAVASCRIPT DETECTION                                                      *
 *****************************************************************************/

// Progressive enhancement and graceful degradation are not sufficient if we
// want to avoid sending HTML or JavaScript code that won't be useful on the
// client side.  A normal HTTP request will not include any explicit indicator
// that JavaScript is enabled in the client.  So a "preflight response" is
// needed to prompt the client to provide an indicator in a follow-up request.
// Once the state of JavaScript availability has been received the state of
// data received in the original request must be restored before proceding.
// To the user, this handshake should be as invisible as possible.
// 
// The most convenient place to store the original data is in a PHP session.
// The PHP session extension will try to use a cookie to pass the session ID
// but if cookies are not enabled it will insert it into the query string.
// This violates our preference for invisibility.  When Javascript is not
// enabled the only way to effect a client side redirect is with a "meta"
// element with its "http-equiv" attribute set to "refresh".  In this case
// modifying the URL is the only way to pass the session ID back.
//
// But when cookies are disabled and JavaScript is enabled then a client side
// redirect can be effected by setting the "window.onload" method to a function
// which submits a form.  The form has a "method" attribute of "post" and an
// "action" attribute set to the original URL.  The form contains two hidden
// input elements, one in which the session ID is stored and one in which the
// state of JavaScript availability is stored.  Both values are thereby passed
// back to the server in a POST request while the URL remains unchanged.  The
// follow-up request will be a POST even if the original request was a GET, but
// since the original request data is restored, the containing script ought to
// process the request as though it were a GET.

// In order to ensure that the constant SID is defined as the caller of this
// script would expect, call session_start if it hasn't already been called.
$session = isset($_SESSION);
if (!$session) session_start();

// Use a separate session for Javascript detection.  Save the caller's session
// name and ID.  If this is the followup request then close the caller's
// session and reopen the Javascript detection session.  Otherwise, generate a
// new session ID, close the caller's session and create a new session for
// Javascript detection.
$session_name = session_name();
$session_id = session_id();
session_write_close();
session_name('JS_DETECT');
if (isset($_COOKIE['JS_DETECT'])) {
    session_id($_COOKIE['JS_DETECT']);
} elseif (isset($_REQUEST['JS_DETECT'])) {
    session_id($_REQUEST['JS_DETECT']);
} else {
    session_id(sha1(mt_rand()));
}
session_start();

if (isset($_SESSION['_SERVER'])) {
    // Preflight response already sent.
    // Store the JavaScript availability status in a constant.
    define('JS_ENABLED', 0+$_REQUEST['JS_ENABLED']);
    // Store the cookie availability status in a constant.
    define('COOKIES_ENABLED', isset($_COOKIE['JS_DETECT']));
    // Expire the cookies if they exist.
    setcookie('JS_DETECT', 0, time()-3600);
    setcookie('JS_ENABLED', 0, time()-3600);
    // Restore the original request data.
    $_GET = $_SESSION['_GET'];
    $_POST = $_SESSION['_POST'];
    $_FILES = $_SESSION['_FILES'];
    $_COOKIE = $_SESSION['_COOKIE'];
    $_SERVER = $_SESSION['_SERVER'];
    $_REQUEST = $_SESSION['_REQUEST'];
    // Ensure that uploaded files will be deleted if they are not moved or renamed.
    function unlink_uploaded_files () {
        foreach (array_keys($_FILES) as $k)
            if (file_exists($_FILES[$k]['tmp_name']))
                unlink($_FILES[$k]['tmp_name']);
    }
    register_shutdown_function('unlink_uploaded_files');
    // Reinitialize the superglobal.
    $_SESSION = array();
    // Destroy the Javascript detection session.
    session_destroy();
    // Reopen the caller's session.
    session_name($session_name);
    session_id($session_id);
    if ($session) session_start();
    unset($session, $session_name, $session_id, $tmp_name);
    // Complete the request.
} else {
    // Preflight response not sent so send it.
    // To cover the case where cookies are enabled but JavaScript is disabled,
    // initialize the cookie to indicate that JavaScript is disabled.
    setcookie('JS_ENABLED', 0);
    // Prepare the client side redirect used when JavaScript is disabled.
    $content = '0; url='.$_SERVER['REQUEST_URI'];
    if (!$_GET['JS_DETECT']) {
        $content .= empty($_SERVER['QUERY_STRING']) ? '?' : '&';
        $content .= 'JS_DETECT='.session_id();
    }
    // Remove request data which should only be used here.
    unset($_GET['JS_DETECT'],$_GET['JS_ENABLED'],
            $_POST['JS_DETECT'],$_POST['JS_ENABLED'],
            $_COOKIE['JS_DETECT'],$_COOKIE['JS_ENABLED'],
            $_REQUEST['JS_DETECT'],$_REQUEST['JS_ENABLED']);
    // Save all remaining request data in session data.
    $_SESSION['_GET'] = $_GET;
    $_SESSION['_POST'] = $_POST;
    $_SESSION['_FILES'] = $_FILES;
    $_SESSION['_COOKIE'] = $_COOKIE;
    $_SESSION['_SERVER'] = $_SERVER;
    $_SESSION['_REQUEST'] = $_REQUEST;
    // Rename any uploaded files so they won't be deleted by PHP.  When using
    // a clustered web server, upload_tmp_dir must point to shared storage.
    foreach (array_keys($_FILES) as $k) {
        $tmp_name = $_FILES[$k]['tmp_name'].'x';
        if (move_uploaded_file($_FILES[$k]['tmp_name'], $tmp_name))
            $_SESSION['_FILES'][$k]['tmp_name'] = $tmp_name;
    }
// Have the client inform the server as to the status of Javascript.
?>
<!DOCTYPE html>
<html>
<head>
    <script>
        document.cookie = 'JS_ENABLED=1';
// location.reload causes a confirm box in FireFox
//      if (document.cookie) { location.reload(true); }
        if (document.cookie) { location.href = location; }
    </script>
    <meta http-equiv="refresh" content="<?=$content?>" />
</head>
<body>
    <form id="formid" method="post" action="" >
        <input type="hidden" name="<?=$session_name?>" value="<?=$session_id?>" />
        <input type="hidden" name="JS_DETECT" value="<?=session_id()?>" />
        <input type="hidden" name="JS_ENABLED" value="1" />
    </form>
    <script>
        document.getElementById('formid').submit();
    </script>
</body>
</html>
<?php
    exit;
}
?>

答案 33 :(得分:1)

这是扭曲! 可能有客户端浏览器启用了Javascript并且使用了JS兼容的浏览器。但是因为Javascript在浏览器中不起作用的原因(例如:防火墙设置)。根据统计,这种情况在93个场景中每1个发生一次。所以服务器检测到客户端能够执行Javascript但实际上并没有!

作为解决方案,我建议我们在客户端站点设置一个cookie然后从服务器读取它。如果设置了cookie,那么JS工作正常。有什么想法吗?

答案 34 :(得分:0)

我昨天必须解决同样的问题,所以我只是在这里添加.001。该解决方案至少在主页(index.php)

对我有用

我喜欢在根文件夹中只有一个文件:index.php。然后我使用文件夹来构建整个项目(代码,css,js等)。所以index.php的代码如下:

<head>
    <title>Please Activate Javascript</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <script type="text/javascript" src="js/jquery-1.3.2.min.js"></script> 
</head>

<body>

<script language="JavaScript">
    $(document).ready(function() {
        location.href = "code/home.php";
    });   
</script>

<noscript>
    <h2>This web site needs javascript activated to work properly. Please activate it. Thanks!</h2>
</noscript>

</body>

</html>

希望这有助于任何人。最诚挚的问候。

答案 35 :(得分:0)

当然,Cookie和HTTP标头是不错的解决方案,但是两者都需要服务器端的明确参与。

对于简单的网站,或者我没有后端访问权限的地方,我更喜欢客户端解决方案。

-

我使用以下代码为HTML元素本身设置类属性,因此我的CSS可以处理几乎所有其他显示类型逻辑。

方法:

1)放置在<script>document.getElementsByTagName('html')[0].classList.add('js-enabled');</script>元素上<html> 上方

警告!!!! 此方法将覆盖所有<html>类属性,更不用说可能不是“有效的” HTML,但在所有浏览器中都有效,我已经对其进行了测试。

*注意:由于运行脚本的时间,在处理<html>标记之前,它最终会得到一个没有节点的空classList集合,因此,在脚本完成时,{ {1}}元素将仅获得您添加的类。

2)保留所有其他<html>类属性,只需将脚本<html>放在打开<script>document.getElementsByTagName('html')[0].classList.add('js-enabled');</script>标签之后。

在两种情况下,如果都禁用了JS,则不会对<html>类属性进行任何更改。

替代品

这些年来,我还使用了其他一些方法:

<html>

//缩小为:

    <script type="text/javascript">
    <!-- 
        (function(d, a, b){ 
            let x = function(){
                // Select and swap
                let hits = d.getElementsByClassName(a);
                for( let i = hits.length - 1; i >= 0; i-- ){
                    hits[i].classList.add(b);
                    hits[i].classList.remove(a);
                }
            };
            // Initialize Second Pass...
            setTimeout(function(){ x(); },0);
            x();
        })(document, 'no-js', 'js-enabled' );
    -->
</script>
  • 这将在页面中循环两次,一次到达页面中的某个位置,通常在<script type="text/javascript"> <!-- (function(d, a, b, x, hits, i){x=function(){hits=d.getElementsByClassName(a);for(i=hits.length-1;i>=0;i--){hits[i].classList.add(b);hits[i].classList.remove(a);}};setTimeout(function(){ x(); },0);x();})(document, 'no-js', 'js-enabled' ); --> </script> 之后 页面加载后再次。需要两次,因为我将CMS的header.tpl文件注入了我没有后端访问权限,但想为no-js代码段提供样式选项。

第一遍将设置设置为.js的类,以允许使用任何全局样式,并阻止大多数进一步的重排。第二遍是所有以后包含的内容的统筹。

原因:

主要原因是,我关心是否启用JS是出于“样式”目的,隐藏/显示表单,启用/禁用按钮或重新设置样式以及需要JS的滑块,表格和其他样式的布局可以“正确”运行,并且如果没有JS来动画化或处理交互,将无用或无法使用。

此外,您不能直接使用javascript进行检测,如果javascript是“ disabled”(禁用)...,则只有通过启用某些javascript才能启用它,因此您可以依靠<html>或依靠在CSS上切换样式,如果执行javascript,则切换到“启用js”模式。

答案 36 :(得分:0)

如果启用了 JavaScript,为什么您需要知道服务器端?浏览器支持哪种变体重要吗?是否例如需要了解关键字 let 还是只是 var 可以?

我建议发送不需要任何 JavaScript 即可访问的可读内容,然后尝试加载 JS 文件以添加您想要的所有 JS 行为。

例如,如果未启用 JS,UI 最终可能会缺少登录或修改按钮,并且它可能在底部包含一个小文本(使用 <noscript> 或某些带有 CSS 的元素animation,如果 JS 代码没有足够快地删除整个元素,则在一小段延迟后显示文本)说“要登录/修改此内容,您必须在浏览器中启用 JavaScript 支持。”如果您做得好,读者甚至可能不会注意到缺少任何内容,除非他或她尝试登录或修改内容。

作为优化,您可以使用 JavaScript 设置 cookie,如果您出于某种原因希望异步获取非 JavaScript 可读内容,服务器可以避免发送非 JavaScript 可读内容。只需确保仅在 JS 代码至少运行一次完成后才设置此 cookie,而不是在 JS 代码开始运行时立即设置它,以确保最终用户不会在 (不是如果!)JS 代码因任何原因失败。

(请注意,异步加载初始页面状态不会更快地将该内容提供给最终用户。但是,您只能在没有 JavaScript 的情况下发送全部内容的一部分。这可以允许更快地然后异步地呈现“首屏”使用 JS 代码加载页面的其余部分。)

另外一个好处是,搜索引擎仍然可以在不启用任何 JavaScript 的情况下为您的网站编制索引。

答案 37 :(得分:-3)

可能听起来很奇怪,但你可以尝试一下:

<?php $jsEnabledVar = 0; ?>    

<script type="text/javascript">
var jsenabled = 1;
if(jsenabled == 1)
{
   <?php $jsEnabledVar = 1; ?>
}
</script>

<noscript>
var jsenabled = 0;
if(jsenabled == 0)
{
   <?php $jsEnabledVar = 0; ?>
}
</noscript>

现在在整个页面中使用'$ jsEnabledVar'的值。您也可以使用它来显示一个块,指示用户已关闭JS。

希望这会有所帮助