支持JavaScript的检查例程适用于Chrome / Opera / IE但不适用于Firefox / Safari

时间:2016-04-25 07:20:42

标签: javascript php ajax google-chrome firefox

我写了一个简短的例程来检查浏览器是否启用了JavaScript。

适用于Chrome,Opera和IE11。它不适用于Firefox或Safari;在这些浏览器上它会导致无限刷新循环。我想了解为什么它在Firefox和Safari上失败,以及如何使它在这些浏览器上运行。

我已将其缩小为4个单独的php文件,如下所示,您可以复制并运行它们。幸运的是,您将获得与Chrome,Opera和IE相同的成功,以及Firefox和Safari上的相同失败。

简而言之:index.php使用纯JavaScript编写AJAX调用(即,不需要JQuery)。默认情况下,首先,false.php被复制到body_message.php,后来作为index.php消息包含在<body>中。如果在浏览器中启用了JavaScript,则<script>部分会调用ajax_copy_file.php,而body_message.php会使用true.php覆盖index.php。结果是<?php session_start(); ?> <!DOCTYPE html> <head> <title>JavaScript Test</title> <?php if (!isset($_SESSION['JavaScript'])) { copy('false.php', 'body_message.php'); ?> <script>var ajax={},hasAX=window.hasOwnProperty("ActiveXObject");ajax.x=function(){if(hasAX){for(var a="MSXML2.XmlHttp.6.0 MSXML2.XmlHttp.5.0 MSXML2.XmlHttp.4.0 MSXML2.XmlHttp.3.0 MSXML2.XmlHttp.2.0 Microsoft.XMLHTTP".split(" "),b,c=0;c<a.length;){try{b=new ActiveXObject(a[c]);break}catch(f){alert(f)}c+=1}return b}return new XMLHttpRequest};ajax.send=function(a,b,c,f,d){void 0===d&&(d=!0);var e=ajax.x();e.open(c,a,d);e.onreadystatechange=function(){4===e.readyState&&b(e.responseText)};"POST"===c&&e.setRequestHeader("Content-type","application/x-www-form-urlencoded");e.send(f)};ajax.post=function(a,b,c,f){var d=[];Object.keys(b).forEach(function(a){d.push(encodeURIComponent(a)+"="+encodeURIComponent(b[a]))});ajax.send(a,c,"POST",d.join("&"),f)};function logStuff(a){"string"===typeof a?console.log(a):"object"===typeof a&&Object.keys(a).forEach(function(b){console.log(b+": "+a[b])})}ajax.post("ajax_copy_file.php",{copy_file:"true.php"},logStuff,!0);location.replace("index.php");</script> <?php } ?> </head> <body> <?php unset($_SESSION['JavaScript']); include('body_message.php'); ?> </body> </html> 将显示一条短消息,指示是否在浏览器上启用了JavaScript。

JavaScript被缩小了,但运气好的话,看不到完整的例行程序(即使在缩小时也可以获得主要的jist)。

这是index.php:

<?php
session_start();
copy($_POST['copy_file'], 'body_message.php');
$_SESSION['JavaScript'] = 'true';
echo 0;
exit;
?>

这是ajax_copy_file.php:

<p>TRUE: JavaScript enabled</p>

这是真的.php:

<p>FALSE: JavaScript disabled</p>

这是false.php:

(require '[clojure.string :as str])

(def s "C\nB\nA")

(->> s
  (str/split-lines) ; split your string into sequence of lines
  (sort) ; sort the sequence using natural order (for strings it will be alphabetical order)
  (str/join "\n")) ; join elements of the sorted sequence using \n producing a multiline string

;; => "A\nB\nC"

为什么这适用于Chrome,Opera和IE,但在Firefox和Safari上无效(导致无限循环)?

1 个答案:

答案 0 :(得分:0)

问题是您的location.replace("index.php")代码是在使用ajax.post发送XHR之后放置的,但XHR请求是异步的,因此您会在true.php / {{1之前重定向回来文件已被复制。我猜这是与Firefox和Safari隔离的,因为其他浏览器要么对XHR进行大量优化,要么因性能原因而延迟false.php。如果您将location.replace放在XHR location.replace事件处理程序或成功函数中,它可以在Firefox中运行。请参阅更新的jsFiddle:

https://jsfiddle.net/j5qpwy9f/1/

附加说明:

  • 您的对象序列化方法稍有不正确;在浏览readystate后,将所有encodeURIComponent替换为%20,因为这是规范。
  • 我假设这不是最终版或生产代码,但请坚持+。您的方法存在许多缺陷,其中最少的缺点是使用AJAX,会话,cookie,PHP,JS,3个HTTP连接以及重定向来加载单个页面。

仅在禁用JavaScript时才使用<noscript>标记来解析HTML。

<noscript>

https://developer.mozilla.org/en/docs/Web/HTML/Element/noscript

如果您想要一个示例,请查看http://enable-javascript.com/及其来源。