web-dev-qa-db-fra.com

Vérifiez si JavaScript est activé avec PHP

Est-il possible de vérifier si JavaScript est activé avec PHP? Si c'est le cas, comment?

49
Will

Non, ce n'est pas possible car PHP est un langage côté serveur, il n'accède en aucune manière au navigateur du client (les demandes du client du serveur PHP).

Le client peut fournir des méta-informations via des en-têtes HTTP, mais il ne vous dit pas nécessairement si l'utilisateur a JavaScript activé ou non et vous ne pouvez pas vous en remettre à eux de toute façon

47
Waleed Amjad

peut-être une option plus simple ...

<html>
<head>
 <noscript>
   This page needs JavaScript activated to work. 
   <style>div { display:none; }</style>
 </noscript>
</head>
<body>
<div>
my content
</div>
</body>
</html>
59
ozzy432836

Techniquement non, car, comme l'ont dit les autres réponses, PHP est strictement côté serveur, mais vous pouvez le faire ...

Dans la page PHP du serveur, le résultat (beaucoup de HTML a été supprimé pour des raisons de concision)

<html>
   <head>
      <script type="text/javascript" src="jquery1.4.4.js"></script>
      <script type="text/javascript">
        $(document).ready(function(){
           $.get("myPage.php");
         });
      </script>
   </head>
 </html>

Puis, dans myPage.php, définissez une variable de session pour indiquer que le client prend en charge JS.

<?php
   session_start();
   $_SESSION['js'] = true;
?>

Mais vraiment, utilisez simplement les balises <script></script><noscript></noscript>, beaucoup moins d'effort ...

17
Chris Thompson

// Voici une solution: // ça marche parfaitement

<?php

if(!isset($_SESSION['js'])||$_SESSION['js']==""){
  echo "<noscript><meta http-equiv='refresh' content='0;url=/get-javascript-status.php&js=0'> </noscript>";
   $js = true;

 }elseif(isset($_SESSION['js'])&& $_SESSION['js']=="0"){
   $js = false;
   $_SESSION['js']="";

 }elseif(isset($_SESSION['js'])&& $_SESSION['js']=="1"){
   $js = true;
   $_SESSION['js']="";
}

if ($js) {
    echo 'Javascript is enabled';
 } else {
    echo 'Javascript is disabled';
}

?>

// Et ensuite dans get-javascript-status.php: 

$_SESSION['js'] = isset($_GET['js'])&&$_GET['js']=="0" ? "0":"1";
header('location: /');
8
Salman Akhlaqi

Vous ne pouvez pas savoir si JS est activé sur un navigateur, mais vous pouvez également savoir si le navigateur prend en charge JS http://php.net/manual/en/function.get-browser.php

$js_capable = get_browser(null, true)=>javascript == 1

Cela dit, ce n'est probablement pas d'une grande utilité. Vous devriez reconsidérer la détection de JS à partir de PHP. Cela ne devrait pas être nécessaire si vous utilisez amélioration progressive , ce qui signifie que JS n’ajoute que des fonctionnalités à ce qui est déjà sur la page.

6
Juan Mendes

Voici un petit inclus que j'ai constitué en haut de mes pages pour détecter si js est activé. J'espère que ça aide ...

<?php
//Check if we should check for js
if ((!isset($_GET['jsEnabled']) || $_GET['jsEnabled'] == 'true') && !isset($_SERVER['HTTP_X_REQUESTED_WITH'])){

   //Check to see if we already found js enabled
   if (!isset($_SESSION['javaEnabled'])){
      //Check if we were redirected by javascript
      if (isset($_GET['jsEnabled'])){
         //Check if we have started a session
         if(session_id() == '') {
            session_start();
         }

         //Set session variable that we have js enabled
         $_SESSION['javaEnabled'] = true;
      }
      else{
         $reqUrl = $_SERVER['REQUEST_URI'];
         $paramConnector = (strpos($reqUrl, "?"))? "&" : "?";

         echo "
            <script type='text/javascript'>
               window.location = '" . $reqUrl . $paramConnector . "jsEnabled=true'
            </script>
            <noscript>
               <!-- Redirect to page and tell us that JS is not enabled -->
               <meta HTTP-EQUIV='REFRESH' content='0; " . $reqUrl . $paramConnector . "jsEnabled=false'>
            </noscript>
         ";

         //Break out and try again to check js
         exit;
      }
   }
}
?>
4
Andy Braham
<noscript>
    <?php if(basename($_SERVER['REQUEST_URI']) != "disable.html"){ ?>
        <meta http-equiv="Refresh" content="0;disable.html">
    <?php } ?>
</noscript>

Placez le code ci-dessus dans votre fichier d’en-tête après la balise title et définissez-le comme [disable.html] pour la redirection.

3
Anish Bhut

Vous pouvez essayer avec 2 metod:

  • configurer des cookies avec JS et les détecter depuis PHP
  • créer un formulaire avec un champ caché et une valeur vide; puis lui attribuez une valeur avec JS, si le champ obtient la valeur - JS est activé, sinon il est désactivé. Mais le formulaire devait être soumis avant que PHP puisse demander la valeur de ce champ caché.

si vous voulez détecter si le paramètre JS enable enable avant le chargement de la page, vous pouvez essayer ceci (je ne sais pas si cela fonctionne):

<?php
if (isset($_POST['jstest'])) {
  $nojs = FALSE;
  } else {
  // create a hidden form and submit it with javascript
  echo '<form name="jsform" id="jsform" method="post" style="display:none">';
  echo '<input name="jstest" type="text" value="true" />';
  echo '<script language="javascript">';
  echo 'document.jsform.submit();';
  echo '</script>';
  echo '</form>';
  // the variable below would be set only if the form wasn't submitted, hence JS is disabled
  $nojs = TRUE;
}
if ($nojs){
  //JS is OFF, do the PHP stuff
}
?>

il existe un bon tutoriel sur ce problème à l'adresse http://www.inspirationbit.com/php-js-detection-of-javascript-browser-settings/

3
Gianluca Lodigiani

Pour se débarrasser des robots avec JS désactivé:

<?php
session_start();
@$_SESSION['pagecount']++;
?>

<html>
<head>

<?php 
if (!isset($_COOKIE['JSEnabled']) || strlen($_COOKIE['JSEnabled'])!=32 ) {
  $js_cookie=md5(md5(@$_SESSION['pagecount']) . $_SERVER['REMOTE_ADDR']);
  echo '<script language="javascript">';
  echo 'document.cookie="JSEnabled=' . $js_cookie . '"';
  echo '</script>';
  echo '<meta http-equiv="refresh" content="0;url=http://example.com"/>';
}
?>

<?php 
 $js=$_COOKIE['JSEnabled'];
 if ($js!=md5(md5(@$_SESSION['pagecount']-1) . $_SERVER['REMOTE_ADDR'])) {
 $js_cookie=md5(md5(@$_SESSION['pagecount']) . $_SERVER['REMOTE_ADDR']);
  echo '<script language="javascript">';
  echo 'document.cookie="JSEnabled=' . $js_cookie . '"';
  echo '</script>';
     echo "</head><body>Sorry, this website needs javascript and cookies enabled.</body></html>";
     die();
 } else {
  $js_cookie=md5(md5(@$_SESSION['pagecount']) . $_SERVER['REMOTE_ADDR']);
  echo '<script language="javascript">';
  echo 'document.cookie="JSEnabled=' . $js_cookie . '"';
  echo '</script>';    

 }

?>

Personne ne peut utiliser par exemple curl -H "Cookie: JSEnabled = XXXXXXXXXXXXXXXXXX" Car ils ne connaissent pas votre algo de calcul du hachage.

2
Konstantin

avant d'essayer, vous devez désactiver votre navigateur javascript ...

ensuite

Essayez ce code:

<html>
<head>
<noscript><meta http-equiv="refresh"content="0; url=script-disabled.html">
</noscript>
<h1>congrats ! Your Browser Have Java Script Enabled </h1>
</head>
</html>

Ecrivez quelque chose dans script-disabled.html

c'est du travail

2
Ramesh Sorathiya

PHP ne peut pas être utilisé pour détecter si le javascript est activé ou non. Utilisez plutôt <noscript> pour afficher un autre message/faire quelque chose.

2
Shoban
<html>
<head>
<?php
  if(!isset($_REQUEST['JS'])){?>
    <noscript>
      <meta http-equiv="refresh" content="0; url='<?php echo basename($_SERVER['PHP_SELF']);?>?JS='"/>
    </noscript><?php
  }
?>
</head>
<body>    
<?php
  if(isset($_REQUEST['JS'])) echo 'JavaScript is Disabled';
  else echo 'JavaScript is Enabled';
?>
</body>
</html>
2
Adrian Soiman

Malgré toutes les personnes qui vous disent que vous ne pouvez pas rechercher une technologie de script côté client. Si la technologie cible a des fonctions http, vous pouvez toujours le faire, écrivez simplement une étape de vérification. Cela signifie littéralement que le moyen de vérifier javascript est d'exécuter javascript. Si javascript est désactivé côté navigateur, il n'est pas possible de vérifier si le client est compatible avec Javascript (comme Dillo avec sa configuration par défaut ou autres)

UPDATED: J'ai développé ce script parce que je teste certains des exemples ici et que tout le monde semble effectuer une copie en copypast sans aucun type de test. Le code est également sur Gist https://Gist.github.com/erm3nda/4af114b520c7208f8f3f (mis à jour)

//function to check for session after|before PHP version 5.4.0
function start_session() {
    if(version_compare(phpversion(), "5.4.0") != -1){
        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }
    } else {
        if(session_id() == '') {
            session_start();
        }
    }
}

// starting the function
start_session();

// create a script to run on the AJAX GET request from :P Javascript enabled browser
echo 
    '<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function(){
    $.get(document.URL.substring(0, document.URL.length-1) + "?sessionstart=1");
    console.log(document.URL.substring(0, document.URL.length-1) + "?sessionstart=1")}
    </script>;

// Ajax GET request handle
if ($_REQUEST['sessionstart'] == 1){
    $_SESSION['js'] = 1; // save into session variable
  } else {
    session_destroy(); // force reset the test. otherwise session
  }

// If the session variable has not saved by the AJAX call, loads again.
if (!isset($_SESSION['js'])){
    header("Refresh: 1"); // thats only for the first load
    echo "Javascript is not enabled <br>"; // Return false
} else {
    echo "Javascript is enabled <br>"; // Return true
}

Cette solution ne nécessite pas plus de fichiers, mais une simple itération si vous utilisez un navigateur compatible Javascript. La valeur est renvoyée à PHP à l'aide d'un GET avec une variable simple, mais tout le monde peut simuler la sortie en faisant cURL avec url +? Sessionstart = 1, à moins que vous n'y ajoutiez plus de logique.

1
erm3nda

Créez un cookie à l'aide de JavaScript et lisez-le à l'aide de PHP.

1
M_R_K

C'est ainsi que je vérifie si le javascript et les cookies sont activés ou non http://asdlog.com/Check_if_cookies_and_javascript_are_enabled

Je le copie/colle ici

<?
if($_SESSION['JSexe']){     //3rd check js
    if($_COOKIE['JS'])  setcookie('JS','JS',time()-1);//check on every page load
    else            header('Location: js.html');
}               //2nd so far it's been server-side scripting. Client-side scripting must be executed once to set second cookie.
                //Without JSexe, user with cookies and js enabled would be sent to js.html the first page load.
elseif($_COOKIE['PHP'])     $_SESSION['JSexe'] = true;
else{               //1st check cookies
    if($_GET['cookie']) header('Location: cookies.html');
    else{
                setcookie('PHP','PHP');
                header('Location: '.$_SERVER['REQUEST_URI'].'?cookie=1');
    }
}
?>
<head>
<script type="text/javascript">document.cookie = 'JS=JS'</script>
</head>
1
wlf

Avec cet ajax de base, vous pouvez séparer les données que le client voit sur la base de javascript ou non.

index.php

    <!DOCTYPE html>
<html>
<body>
    <script>

function jsCheck() {
  var xhttp;
  if (window.XMLHttpRequest) {
    // code for modern browsers
    xhttp = new XMLHttpRequest();
    } else {
    // code for IE6, IE5
    xhttp = new ActiveXObject("Microsoft.XMLHTTP");
  }
  xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
      document.getElementById("demo").innerHTML = xhttp.responseText;
    }
  };
                       xhttp.open("GET", "jscheckCon.php", true);
                xhttp.send();
}
jsCheck();
</script>
<div id="demo">
    no javascript 
</div>      
</body>
</html>

jscheckCon.php

<?php 
echo 'we have javascript!';//you can do that you like to do with js! 
?>
1
user3510753

Récemment, j'ai eu le dilemme suivant:

J'utilise une fonction PHP qui génère une image QR liée à l'URL actuelle, ce qui est très utile pour les appareils mobiles. La fonction fonctionne bien, mais ayant mon site sur un hébergement partagé, il existe certaines limites pour l'utilisation du processeur et de RAM. Cette fonction est trop lourde et consomme beaucoup de temps de calcul et de RAM. Les hébergeurs m'ont donc demandé de diminuer l'utilisation.

Après quelques essais, j'ai finalement réalisé que je pouvais économiser une partie de l'utilisation du processeur et de la RAM par les robots des moteurs de recherche. Il est difficile de reconnaître un bot par identification de navigateur, mais tous les robots n’ont pas de JS activé et c’est le principal critère que j’ai utilisé pour détecter s’il s’agissait d’un vrai navigateur ou d’un bot. Pour expliquer à quel point il est important d’empêcher l’exécution de code qui n’apporterait rien de plus aux moteurs de recherche (dans mon cas, le QR n’affecte pas les moteurs de recherche), je peux dire que, par exemple, Google bot effectue environ 16 000 analyses par jour sur mon site. site.

J'ai donc fait cette chose très simple qui a beaucoup aidé:

<script language="javascript"><!--
document.write('<?php echo drawQR($_SERVER["REQUEST_URI"]);?>');
//--></script>

Ce code utilise JS pour écrire une ligne de code PHP. Cette ligne ne sera donc écrite que lorsque JS est activé. 

Bien sûr, vous pouvez utiliser la balise 'noscript' si vous souhaitez afficher quelque chose lorsque JS est désactivé, mais cette méthode montre comment exécuter certains PHP uniquement lorsque JS est activé.

J'espère que cela t'aides.

1
Reflective

Vous pouvez définir un cookie à l'aide de Javascript, puis recharger la page à l'aide de Javascript. Ensuite, en utilisant PHP, vous vérifierez si le cookie est configuré, si Javascript est activé!

0
tyranitar

En 2013. Demandez simplement à votre script de rendre les modèles non-js dans une balise body > noscript, puis dans votre CSS, conservez l'affichage principal de votre conteneur de site js: aucun; Après cela, mettez quelque chose comme <script>$('#container').show();</script> immédiatement après la fermeture de votre principal conteneur #container et avant votre balise noscript. (si vous utilisez jquery bien sûr).

En procédant ainsi, le code HTML des navigateurs non activés pour js s'affiche automatiquement, puis les navigateurs activés pour js ne verront que le site js.

Si vous craignez de trop gonfler la taille de la page avec trop de balises, vous pouvez en faire de même mais laisser plutôt <div id="content"></div> vide, puis avec le code js au lieu de simplement montrer à la div, utilisez un appel ajax pour récupérer le contenu il.

Sur une note de côté, j'inclurais probablement des fichiers CSS supplémentaires pour le site non-js dans la balise noscript pour économiser sur la bande passante. 

0
SublymeRick

Assurez-vous que votre page php principale suppose que jscript est désactivé et ajoutez un <script> pour rediriger vers l'application compatible jScript dans le <head> Si l'utilisateur utilise réellement votre première page, supposons que jscript soit désactivé.

0
Blindy

Autre option: Si vous ne devez pas vérifier si JS est activé à la première vue des visiteurs (page principale), vous pouvez définir un cookie avec js. Sur la page suivante, vous pouvez vérifier avec php si le cookie est là ...

0
NarfkX

Étant donné que PHP est côté serveur, vous ne pouvez pas savoir dans PHP si Javascript est activé sur le client, sauf si vous utilisez des sessions (ou un autre moyen de stocker des données sur plusieurs requêtes) et envoyez d'abord du code auquel le client répond.

Si vous mettez le texte suivant au début de votre fichier PHP, le client est redirigé vers la même URL avec "js = 0" ou "js = 1" ajouté à la chaîne de requête, selon que le Javascript est activé ou non. ou pas. À la réception de la demande redirigée, le script enregistre le résultat dans une variable de session, puis est redirigé vers l'URL d'origine, c'est-à-dire sans le 'js = 0' ou le 'js = 1'. ajouté. maintenant avec la variable de session définie en fonction de la capacité Javascript des clients.

Si vous ne vous souciez pas de l'apparence de votre chaîne de requête dans la barre d'adresse de l'utilisateur, vous pouvez ignorer la seconde redirection et simplement définir la variable de session. Pendant que ces redirections ont lieu, un bref message d’information s’affiche à l’utilisateur (vous pouvez également l'ignorer si vous ne vous en souciez pas).

<?php
session_start();
if (!isset($_SESSION['js']) && !isset($_GET['js'])) {
    $url=$_SERVER['SCRIPT_URI'];
    $qry='?'.($q=$_SERVER['QUERY_STRING']).($q?'&':'').'js';
    die('<!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><title>js check</title>'.
        '<script type="text/javascript">window.location.href="'.$url.$qry.'=1";</script>'.
        '<noscript><meta http-equiv="refresh" content="0; url='.$url.$qry.'=0" /></noscript>'.
        '</head><body>Hold on while we check whether you have Javascript enabled.</body></html>');
} elseif (isset($_GET['js'])) {
    $_SESSION['js']=$_GET['js'];
    $qry = preg_replace('%&?js=(0|1)$%', '', $_SERVER['QUERY_STRING']);
    $url = $_SERVER['SCRIPT_URI'].($qry?'?':'').$qry;
    die('<!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><title>js check</title>'.
        '<meta http-equiv="refresh" content="0; url='.$url.$qry.'" />'.
        '</head><body>Hold on while we check whether you have Javascript enabled.</body></html>');
}

if ($_SESSION['js']) {
    //Javascript is enabled
} else {
    //Javascript is disabled
}
?>
0
oscarjd74

Vous pouvez utiliser la logique la logique (par défaut/commutateur) - est cet exemple, j'ai imprimé la variable en php:

PHP:

$js = 'No';
print 'Javascript Enabled: &lt;span id="jsEnabled"&gt;'.$js.'&lt;/span&gt;';

JS: (dans mon document prêt)

jQuery('#jsEnabled').text('Yes'); or $('#jsEnabled').text('Yes');
0
adswebwork