2016-04-25 68 views
0

我寫了一個簡短的例程來檢查瀏覽器是否啓用了JavaScript。啓用JavaScript的檢查例程適用於Chrome/Opera/IE,但不適用於Firefox/Safari

它適用於Chrome,Opera和IE11。它不適用於Firefox或Safari;在這些瀏覽器上它會導致無限的刷新循環。我想了解爲什麼它在Firefox和Safari上失敗,以及如何使它在這些瀏覽器上工作。

我已經削減到4個單獨的PHP文件,下面提供了,您可以複製和運行。幸運的是,您將獲得與Chrome,Opera和IE相同的成功,並且在Firefox和Safari上也會遇到同樣的問題。

簡而言之:index.php使用純JavaScript編寫的AJAX調用(即不需要JQuery)。默認情況下,首先將false.php複製到body_message.php,後者作爲其<body>消息包含在index.php中。如果在瀏覽器中啓用了JavaScript,則<script>部分將調用ajax_copy_file.php,而這又將覆蓋body_message.phptrue.php。結果是index.php將顯示一條短消息,指示瀏覽器是否啓用了JavaScript。

JavaScript被縮小了,但幸運的是,看到完整的例程將不是必需的(即使在縮小主要jist可以得到)。

這是的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> 

這是ajax_copy_file.php:

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

這是true.php:

<p>TRUE: JavaScript enabled</p> 

這是false.php:

<p>FALSE: JavaScript disabled</p> 

爲什麼在Chrome,Opera和IE上可以使用,但是在Firefox和Safari上不起作用(導致無限循環)?

回答

0

的問題是,您發送使用ajax.post的XHR後您的location.replace("index.php")代碼放置,但XHR請求是異步的,所以true.php/false.php文件已被複制,然後重定向回。我猜這與Firefox和Safari是分開的,因爲其他瀏覽器要麼對XHR有很大的優化,要麼只是因爲性能原因延遲了location.replace。如果將location.replace放入XHR readystate事件處理程序或成功函數中,則它可以在Firefox中使用。請參閱更新的jsfiddle:

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

其他注意事項:

  • 你的對象序列化的方法是不正確略;在經過encodeURIComponent後,請將所有%20替換爲+,因爲這是規範。
  • 我假設這不是最終或生產代碼,但請堅持<noscript>。你的方法有很多缺陷,至少它使用AJAX,會話,cookie,PHP,JS,3個HTTP連接和重定向來加載單個頁面。

爲使用HTML標籤<noscript>要解析只有當JavaScript被禁用。

<noscript> 
    <style> 
     #jsOnly { 
      display: none; 
     } 
    </style> 
</noscript> 
<noscript>JavaScript is disabled</noscript> 
<p id="jsOnly">JavaScript is enabled</p> 

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

如果你想要一個例子,看看http://enable-javascript.com/和它的來源。

+0

我完全知道

+0

@Tom我已經更新了答案,但仍強烈建議一種替代方法。 – lerouche

相關問題