Contenido de página diferente cuando JS está deshabilitado

Tengo un pequeño problema con la detección habilitada para JS. no demasiado grande, porque sé que estoy en el camino correcto. pero aquí está mi trato:

cuando intento configurar una cookie en JS (jQuery) usando este código

$(window).load(function(){
    $.cookies.set('c_jsEnabled', 'true');
});

o simplemente en JS usando este código

function setCookie()
{
    document.cookie='c_jsEnabled=true';
}
<body onload="setCookie();">

y luego intente detectarlo en PHP usando este código

if($_COOKIE['c_jsEnabled'] == 'true')
{
    if(file_exists('./main.php'))
    {
        require_once ('./main.php');
    }
    echo getIndex();
}
else 
{
    if(file_exists('./noJS.php'))
    {
        require_once ('./noJS.php');
    }
    echo getIndex();
}
setcookie('c_jsEnabled', '');

se necesitan 2 actualizaciones de página para obtener el valor correcto en PHP. Supongo que esto básicamente significa que el script PHP se ejecuta antes de que se active la función JS. ¿Podría deberse a que todos los códigos que se muestran arriba están en el mismo script (index.php)?

Esto es un problema para mí, porque quiero evitar que las personas usen mi sitio web cuando tienen JS deshabilitado.

¿Hay alguna manera de configurar la cookie antes de que php intente obtener la variable de la cookie?

preguntado el 12 de junio de 12 a las 15:06

PHP se ejecuta en el servidor, incluso antes de que la página se envíe al cliente, por lo que se necesitaría al menos 1 actualización de página para que PHP lea la cookie. -

5 Respuestas

PHP es siempre "disparado" antes que JavaScript porque PHP se procesa en el servidor y luego envía el HTML y JavaScript para que el navegador los procese y represente. Nunca puede esperar que JavaScript se ejecute antes que PHP por este motivo.

En su caso, use JavaScript para configurar la cookie y luego haga una redirección para actualizar la página para que PHP pueda obtener el valor de la cookie y actuar en consecuencia.

Respondido el 12 de junio de 12 a las 15:06

ok, gracias por tu rápida respuesta. hay otra solucion a esto? y me refiero a otra solución que no incluye <meta HTTP-EQUIV="REFRESH" content="0; url=http://www.yourdomain.com/index.html"> porque si algún genio descarga la página html y cambia o elimina el código de redirección, simplemente ignorará la redirección. - Gabi Barrientos

Bueno, su redirección estaría en JavaScript, no en una metaetiqueta, ya que debe asegurarse de que su JavaScript se ejecute primero y, si JavaScript está desactivado, la cookie nunca se establecerá de todos modos. Además, si alguien se va a meter con tu código, no puedes detenerlo de todos modos. Lo mejor que puede hacer es construir su sitio para esperar un comportamiento travieso y seguir funcionando o al menos arrojar un error. - John Conde

Si tienen las cookies deshabilitadas, pueden quedarse atascados en una redirección infinita. - Scott Stevens

Un poco de lógica inteligente debemos evita eso - John Conde

Debería configurar la cookie directamente desde el archivo PHP. De esa manera, sabrá que existe y, lo que es más importante, tendrá el control de la cookie. Puede configurarlo desde el cliente, pero eso siempre se ejecutará después de que el HTML se haya enviado al navegador, por lo que el archivo PHP no lo recibirá hasta la próxima solicitud.

Respondido el 12 de junio de 12 a las 15:06

PHP solo envía el encabezado de la cookie cuando el contenido se envía al navegador. Luego, Javascript se ejecuta después de eso, por lo que necesitaría una segunda carga de la página para detectar la cookie.

Esto puede desencadenar bucles de redirección infinitos (especialmente si el usuario tiene las cookies deshabilitadas), así que tenga cuidado.

Para deshabilitar el sitio para usuarios sin Javascript, considere lo siguiente.

<div id="noscript" style="width:100%; height:100%; z-index:999; position:absoloute; top:0px; left:0px; background-color:#CC9900; display:block">
Please Enable Javascript!</div>
<script type="text/javascript">
document.getElementById('noscript').style.display = 'none';
</script>

Encuentro el <noscript> la etiqueta no es confiable (hubo un error en iOS que provocó que solo se mostrara cuando había Javascript, si no recuerdo mal).

Una segunda opción: Puede hacer que PHP verifique si hay una cookie. Si no está configurado, haga que redirija (header("Location: aaa.html");) a una página con Javascript para configurar la cookie y redirigir de nuevo. (Alternativamente, haga que el Javascript de salida de PHP configure la cookie para recargar la página). Entonces solo tiene que preocuparse por los usuarios que "suplantan" la cookie, aunque también bloqueará a los usuarios que tienen las cookies deshabilitadas.

Respondido el 12 de junio de 12 a las 16:06

Creo que voy con este, ya que en realidad se superpone a toda la página, y cuando configuro la posición en fijo en lugar de absoluto, el div se desplazará a lo largo de la página, por lo que no se puede ver el contenido real. - Gabi Barrientos

No, siempre se llamará a PHP antes que a JavaScript del lado del cliente, por lo que con este método siempre tendrá que actualizar la página al menos una vez. Es mejor que desarrolle su sitio para que los usuarios que no utilizan JS tengan una experiencia peor pero aún aceptable o, en el peor de los casos, usen el Etiqueta HTML para ofrecer contenido alternativo a esos usuarios.

Respondido el 12 de junio de 12 a las 15:06

bien, entiendo eso. pero no `tudominio.com/index.html"> causar una omisión fácil para los usuarios cuando cambian el código fuente de la página de índice? - Gabi Barrientos

@GabiBarrientos Sí, ¿y qué? - jadkik94

No puede obtener una cookie en PHP configurada por JavaScript antes de que la página se represente o ejecute.

Usted podría configurar la cookie usando PHP, sin embargo. Eso asegurará que esté configurado y disponible independientemente de JavaScript o varias actualizaciones de página.

Respondido el 12 de junio de 12 a las 15:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.