Javascript + PHP
4 seguidores
He dedicido ponerlo en Programación Cliente, aunque lo mismo podría ir mejor en servidor.
La cuestión es: estoy construyendo una página (PHP) a la que he añadido algunas funcionalidades a través de Javascript. Pero resulta que ese Javascript utiliza algunas variables que la página tiene que leer en el momento de ser ejecutada. ¿Hay alguna manera de hacer que el javascript no tenga que estar dentro del documento?
Para que no me echéis a los leones ya os digo que estoy viendo otras soluciones posibles, como implementar ese funcionalidades de otra manera sin utilizar JS, pero por curiosidad y conocimiento quería saber si hay alguna solución.
Abrazos!
txuma Plus
De acuerdo al 100%. Anoto en mi lista de frases célebres esa cita:
"Antes salvo a un usuario que a cien programadores"
:)
orange
Hombre, en estas cosas hay que tener un poco en mente al usuario. Es decir que lo más elegante a nivel de código es inicializar las funciones en la cabecera y dejar el contenido libre de polvo y paja.
Pero creo yo que mal haríamos si, para quedar como programadores "elegantes", el pobre usuario se tuviera que comer 30 segundos de contenido mientras carga la página.
Ya sabes lo que siempre digo, que antes salvo a un usuario que a cien programadores. El que le de a "Ver código fuente" que piense lo que quiera, lo importante es que se nosotros hayamos llegado a la mejor solución "posible" dadas las circunstancias, y con argumentos razonados.
txuma Plus
Necesitaba que alguien aliviase mi conciencia por meter llamadas a funciones en partes del documento HTML. Gracias, master :)
orange
Yo creo que meter una simple llamada no es nada "poco elegante". Y la verdad es que me parece un buen recurso cuando no quieres esperar a que la página termine de cargar para ocultar cosas por JS.
Yo me lo estoy planteando justo ahora en un proyectillo que tengo entre manos
;)
txuma Plus
no, no, efectivamente sólo se mete la llamada a la función que añade la clase.
Al principio del hilo yo hablaba de meter el script entero por otros motivos, no tiene nada que ver con esto. Pero eso ya me habéis contado como solucionarlo: en el documento sólo meto las variables que necesito recoger del PHP.
orange
txuma
Pero por lo que indica el artículo incluye el script dentro de documento conscientemente, para que no haya que esperar a la carga total de la página para aplicar la clase al body.
Pero yo creo que para eso no hace falta que metas el script entero, sino simplemente una llamada a la función.
txuma Plus
zigotica
ayer estaba cansado para picar codigo, pero hoy leyendo mis feeds acabo de encontrar un ejemplo de lo que iba a decir en ajaxian.
yo no lo haria exactamente igual, pero la idea está ahi. y el cambio de class no necesariamente se debe hacer en un script inline, lo puedes meter en un archivo js.
Justo a esto me referia con la opción de ocultar cosas en el CSS que sólo funcionen si tienes JS. Pero por lo que indica el artículo incluye el script dentro de documento conscientemente, para que no haya que esperar a la carga total de la página para aplicar la clase al body.
orange
Yo, si vemos siempre los 2 menús, aunque haya uno que se muestre desplegado/activo, lo haría todo por JS (no intrusivo evidentemente).
Así es como lo he resuelto, y lo he hecho no intrusivo (si el usuario no tiene javascript muestra 'desplegadas' las dos posibilidades). Pero para controlar la opción que se tiene que mostrar por defecto me parecía mejor hacerlo directamente por PHP. Y no lo estaba haciendo mediante cookies, pero tal vez me esté liando mucho la manta a la cabeza. Paso una variable por la URL que es la que me indica si el usuario está entrando a la página a través del menú 'tipo' o del menu 'marca', y utilizo esa variable para definir que menú tiene que verse por defecto.
orange
Lo que no haría sería esconder algo que nunca voy a mostrar, utilizando JS para ello.
Por si no había quedado claro, en esto estamos radicalmente de acuerdo :)
Salu2
orange
Yo, si vemos siempre los 2 menús, aunque haya uno que se muestre desplegado/activo, lo haría todo por JS (no intrusivo evidentemente).
Dependiendo de cómo lo hagas no tendrías que meter nada en el HTML (simplemente inicializar la función), o como mucho definir un par de variables (que lo haces en el mismo sitio donde las inicializas).
Creo que es la opción mas elegante.
En cambio, si sólo se muestra un menú (el otro desaparece completamente) yo directamente no lo metería en el HTML (controlándolo por PHP).
Lo que no haría sería esconder algo que nunca voy a mostrar, utilizando JS para ello.
En primer lugar porque la peña que no tenga JS lo va a ver, cuando ne debería. Y en segundo lugar porque estás cargando de código la página de una manera inútil.
zigotica
zigotica
<div class="quote">
txuma
<blockquote>De todos modos, que antes no he tenido tiempo a decirlo... para esto hay algunas técnicas que esconden el contenido desde el CSS sólo si tienes Js activado, y de esa forma tienes asegurada la accesibilidad. Lo que no me gusta mucho de esas técnicas es que al final tienes que escribir código JS dentro del propio documento.</blockquote>
</div>
no necesariamente <em>dentro del propio documento</em> (puede ser en un js externo). No se si entiendo tus reservas.
ayer estaba cansado para picar codigo, pero hoy leyendo mis feeds acabo de encontrar un ejemplo de lo que iba a decir en ajaxian.
yo no lo haria exactamente igual, pero la idea está ahi. y el cambio de class no necesariamente se debe hacer en un script inline, lo puedes meter en un archivo js.
zigotica
txuma
De todos modos, que antes no he tenido tiempo a decirlo... para esto hay algunas técnicas que esconden el contenido desde el CSS sólo si tienes Js activado, y de esa forma tienes asegurada la accesibilidad. Lo que no me gusta mucho de esas técnicas es que al final tienes que escribir código JS dentro del propio documento.
no necesariamente <em>dentro del propio documento</em> (puede ser en un js externo). No se si entiendo tus reservas.
txuma
Os cuento lo que intento hacer: tengo un menú con una serie de elementos que pueden organizarse en función de dos criterios: marca y tipo. Y en el mismo documento uno puede elegir ver el menú por el criterio que escoja.
¿pero siempre veremos los 2 menus o se elige el tipo y luego solo veo ese menu? No me queda muy claro.
txuma
hay que conservar desplegado el submenú del producto que estas visitando en ese momento, y además en la vista desde la que has accedido. Es decir, si yo estaba viendo el 'menú por tipo' y he entrado en el producto 3, al cargar la página tiene que estar visible por defecto el Menú por tipos y desplegado el submenú donde se encuentra ese producto (en ese ejemplos sería el submenú Tipo 1).
de aqui entiendo que la respuesta a mi pregunta anterior es ""no, solo vemos un menu".
En cualquier caso, no cambia tanto el procedimiento. Básicamente (lo que yo haría):
- guardo una cookie con el menú elegido (ej cookie menu="tipo"), ya sea por js tipo styleswitcher o por formulario+php (preferible), luego +
- opcion a) ese menu será el único que se muestra, algo del estilo
<code>ul.tipo {display:block}
ul.marca {display:none}</code>pero aplicando esto desde javascript, que se puede hacer de muchas maneras (añadiendo una class al que se tiene que mostrar, o recorriendo todos los menus y escondiendo a pelo, ...)
- opcion b) o bien se muestran todos, pero éste será el que esté desplegado y marcando la sección activa, por tanto necesitas tambien:
- un script de arbol o de desplegable, que actue sobre el menu con class=cookie, +
- para terminar, un script que rastree las url de ese menu y aplique el active según la url coincida con el location. esto lo puedes evitar aplicando la class directamente en PHP (pero entonces tb puedes añadir la class adecuada al menu elegido, etc.) Yo personalmente lo haria en javascript.
No se si me he explicado o te he liado mucho :)
txuma
[offtopic] Sergi, te debo una llamada, pero he estado un pelín liado, sorry[/offtopic]
en realidad me debes dos... pero te perdono jeje :)
ozke
Escupiendolo todo por php.... tienes el estilo de mostrar o no mostrar (cn un nombre semantico como "coches divshow"/"coches divhidden") ya te apañas... si quieres ir cambiando pues por js usas style.display y block o none... o haces un getElementById y cambias el classname.
Nose si se hace así, pero así lo haría yop :S pero vaya, hay gente más cualificada en el hilo.
txuma Plus
orange
Te llamaré inaccesible o mala persona, porque si ocultas algo que sólo se puede mostrar por JS serás lo uno...
De todos modos, que antes no he tenido tiempo a decirlo... para esto hay algunas técnicas que esconden el contenido desde el CSS sólo si tienes Js activado, y de esa forma tienes asegurada la accesibilidad. Lo que no me gusta mucho de esas técnicas es que al final tienes que escribir código JS dentro del propio documento.
Os cuento lo que intento hacer: tengo un menú con una serie de elementos que pueden organizarse en función de dos criterios: marca y tipo. Y en el mismo documento uno puede elegir ver el menú por el criterio que escoja. Con un ejemplo se entenderá mejor:
<code>Menú por marcas
+ Marca 1
- Producto 1
- Producto 2
+ Marca 2
- Producto 3
- Producto 4
+ Marca 3
- Producto 5
Menú por tipo
+ Tipo 1
- Producto 1
- Producto 3
- Producto 4
+ Tipo 2
- Producto 2
- Producto 5</code>
El usuario tiene que poder visualizar en cada momento el menú según decida: por tipo o por marca. Esa es la funcionalidad que tengo implementada en el JS.
Pero hay un añadido: hay que conservar desplegado el submenú del producto que estas visitando en ese momento, y además en la vista desde la que has accedido. Es decir, si yo estaba viendo el 'menú por tipo' y he entrado en el producto 3, al cargar la página tiene que estar visible por defecto el Menú por tipos y desplegado el submenú donde se encuentra ese producto (en ese ejemplos sería el submenú Tipo 1).
Se ha entendido algo?
[offtopic] Sergi, te debo una llamada, pero he estado un pelín liado, sorry[/offtopic]
txuma Plus
Bueno, la verdad que el nivel de accesibilidad de lo que estoy preparando no es perfecto, pero en cualquier caso lo mejor es que explique el ejemplo concreto, por si se nos ocurre algo más correcto todavía.
Pero tenéis quedarme unos minutos, que el deber me llama :)
zigotica
uy, mostrar/esconder, que sacrilegio! igual si usas algo parecido a lo que está haciendo borja (y de paso le haces el beta-test de una vez)...
txuma Plus
si, la verdad que no había pensado esa posibilidad. De todos modos lo más probable es que lo rehaga y opte por la solución correcta.
salu2 y gracias!
orange
Te llamaré inaccesible o mala persona, porque si ocultas algo que sólo se puede mostrar por JS serás lo uno, y si es algo que no necesita ser mostrado serás lo otro (porque me haces perder ancho de banda y porque si no tengo JS me lo voy a tener que comer)
zigotica
si no te he entendido mal, PHP generará unos valores para ciertas variables y javascript deberá ejecutar (onload) código basandose en esas variables. si es eso, lo que decia borja, todos los scripts externos, pero las variables las añades en un bloque script y listos.
txuma Plus
A ver, tengo una funcionalidad para mostrar u ocultar cosas. Además, en función de la URL que estés visitando, por defecto deben mostrarse unos elementos y dejar otros ocultas. Lo primero que se me pasó por la cabeza es aprovechar la misma funcionalidad que había preparado pasándole como parametro al javascript el identificador de lo que debe estar a la vista.... hasta que me dí cuenta de la gilipollez y vi que era más sencillo que de esa parte se ocupase directamente el PHP.
Pero la cuestión es que como ya lo había empezado tiré p'alante, y lo tengo ya hecho, pero claro, necesito que el js esté en el documento para que ese parámetro lo lea al 'pintar' la página.
Salu2 (y no me llaméis cutre)
zigotica
pues ya está, tema cerrado :P
anda no me seas tímido...
txuma Plus
Es que si os lo cuento sí que llamáis 'torrija', porque la solución profesional es hacerlo directamente en el PHP, así que paso :P
zigotica
¿qué quieres hacer más exactamente, bribón?
orange
Lo que puedes hacer es sacar del documento las funciones y dejar sólo las variables. Que es bastante más elegante.
A lo mejor puedes pasar por el intérprete de PHP los ficheros .js, como se hace de tanto en tanto con las CSS. Pero no sé si te funcionará.
A ver qué dice "el maestro"