Problema con AJAX degradable
Muy buenas,
Estoy haciendo una web cuya navegación funciona a base de AJAX. Es decir, en lugar de recargar la página carga el contenido en un div.
Ahora bien, la gracia de esto es que sea degradable. Si alguien no tiene JS... deberia ser capaz de ver lo mismo pero recargando la página, a la antigua usanza.
[Ir directamente al punto 2) para ver el problema]
Estoy haciendo esto de la siguiente forma:
- Los links apuntan a la direccion PHP/loquesea del servidor (?seccion1). Si quien navega la web no tiene JS todo funciona bien.
- JS reemplaza los links tipo ?seccion1 por links tipo #seccion1. Quien tenga JS vera la web d pm.
- Para el problema de los botones adelante/atras uso el plugin jquery history asi q arreglado.
Ahora bien, problemas:
1) Q pasa si alguien accede a traves de un enlace directo a ?seccion1. En lugar de mostrar ?seccion1#seccion2 quiero que se muestre #seccion2. Bien, esto lo puedo arreglar redirigiendo por JS todo lo que venga ?enesteformato a #esteotro.
2) Q pasa si alguien sin JS accede directamente a #seccion1 ????
Aqui si que no veo solucion ya que no hay manera de detectar el hash(#) en servidor, almenos con php y/o mod_rewrite.
Ideas???
cbp
¿por qué cambias los enlaces de "?seccion1" a "#seccion1"?
ozke
Para evitar una URLs como www.loquesea.com/seccion1/#seccion2/
cbp
perdona si no lo entiendo bien ¿pero por qué tendrías una URL de ese tipo? ¿por qué no las dejas tal cual, sin sobreescribir con JavaScript?
ozke
Si las dejo sin sobreescribir con javascript la web se recarga. A menos q no use ningun parametro y solo haga el ajax, en cuyo caso no se podrian hacer links directos.
cbp
no hace falta sobreescribir nada, basta con que en el onclick de JavaScript pongas un "return false". si el usuario tiene JavaScript se ejecutará el onclick y se detendrá, si no se ejecutará el HREF ¿eso te serviría?
Usuario desconocido
¿Y porqué no pones un prevent default para que al hacer click en cualquier enlace a #loquesea no se cargue la página y se ejecute tu función?
Mira, en jquery sería tal que así:
$("#menu a").click(function(e) {
e.preventDefault();
});
Y luego ya le pones todo lo que quieras que haga
ozke
Eslo que hago.
Todos los links son del tipo ?loquesea para que si el usuario no tiene javascript o lo visita google todo chute.
Cuando alguien clicka hago un prevent default y uso URL del tipo #loquesea para poder hacer adelante y atras en el navegador.
El tema es q pasa si alguien entra con una URL #asi sin JS. Si tienen JS funciona bien xo si no lo tienen creo q no hay forma de pillar el # almenos en PHP o mod_rewrite.
Espero que ahora quede todo mas claro :)
cbp
insisto, no veo el motivo para tener una dirección "?seccion1? para usuarios sin JS y otra "#seccion1" para los que sí lo tengan. con una del tipo "?seccion1" y un buen JS no hace falta distinguir entre ambas
Usuario desconocido
Ponnos un link anda, que me quedo con las ganas de ver el código.
ozke
Mmm... enga ahi va...
http://ozke.com/misc/dmstk/SWFInPage/
Reproduce una cancion continuamente. Ya se q podria haberme currado un boton de pause pero ando pero bueno, solo es xa testear.
Usuario desconocido
Vaya, pues es casualidad que yo esté con un proyecto que hace lo mismo!!
Mira, te dejo el link:
LINK
La página mostrador-ajax.php es la que va realizando las consultas a la base de datos. Funciona el historial, y además funciona sin JS.
Aún tengo que currarme lo de la carga (animaciones de fadein fadeout y tal), pero bueno, es una maqueta para ir probando.
Mira a ver si te sirve y si eso te paso los archivos.
hartum
Holaaaaaa nas nochesssssssss
pues yo lo hago de la siguiente manera:
me preparo mis paginas seccion1.php, seccion2.php, seccion1.php, etc... en todas ellas lo primero que hago es recoger una variable que se llame por ejemplo $ajax_active, si ajax active:
muestra solo el contenido
si !$ajax_active:
include cabecera.php;
include menu.php;
//---aqui el contenido ------
include pie.php;
y en todas las llamadas Ajax le paso la variable ajax_active=true.
Esdecir, si no le paso nada, por defecto cargo todas las partes de la pagina, pero si le paso la variable solo cargo el contenido.
Me he explicao'??
Ejem: http://www.coated.org/web/nosotros.php
ozke
Hartum, en tu site, si clicko en nosotros y luego voy a ambiente la URL no refleja la situacion actual. Por ello uso # para mostrar siempre la URL actual.
Mambru.... tu me ensenyas un ejemplo de algo q no es AJAX. :?
hartum
Momento WTF??? que yo no lo haga no significa que tu no lo puedas hacer, de todas formas y ya que haces el comentario ¿para que quieres cambiar la URL? si es por los robots de google, no leen javascript, es mucho mas descriptiva para la indexaccion como lo hago yo, si es por el usuario, con reemplazar los enlaces con una llamada Ajax y el #seccion como lo haces tu, sería suficiente.
Vamos que mi solución no excluye tus requisitos. :-D
Usuario desconocido
No no, lo mio si que utiliza AJAX, lo que pasa que lo que carga es contenido que sale tras una llamada a la base de datos, nada más.
Por cierto... ¿me podrías echar una mano con el mod_rewrite? Es que estoy intentando apañarlo para enbellecer las URL's pero no lo consigo. Y mira que estoy mirando tutoriales, pero nada.
ozke
Mambru, aqui va una URL sencillita:
http://www.peoplecnc.com/ayuda_mod_rewrite.html
Por cierto, tu solucion es resultona pero no me sirve ya que recargas la pag con lo cual si tienes un elemento SWF tb se recargara.
Hartum, siento el malentendido. Por supuesto una cosa no excluye la otra. En mi caso que la URL refleje el contenido actual es un requisito de proyecto. Por ejemplo, lo que veo en la pag X me gusta.... pues puedo enviarlo por email. Es muy chorra pero es lo que hay. :S
Gracias a ambos.
Por cierto, volviendo al tema.... alguna forma de detectar un hash desde php o mod_rewrite. He seguido buscando y me temo q sencillamente no se puede. Putadon :S
zigotica
ozke
http://es.php.net/manual/es/function.parse-url.php
cito:
ozke
Hombre Sergi que alegria verte por aqui con la barretina :)
Eso es lo primero que prové pero no me pilló el hash.
Es decir, si lo intentas con un string que contiene el hash perfecto. El problema es que el hash no llega al servidor.
:)
zigotica
por eso cbp te decia que no te lies a cambiar # por ?, deberias enviar la url con hash por ajax y que el php te devuelva solo la parte o seccion, en cambio si el php recibe la url completa debe devolverlo todo, no se si me explico.
ozke
Si si, por supuesto. Es lo que he hecho. Solo tenía curiosidad por crear algo lo mejor posible y pensaba en alguna manera de cubrir incluso el casho de hash para alguien sin JS. :P
Gracias a todos igualmente :)
Usuario desconocido
Buffff, recojo otra vez el tema porque ahora estoy con otro proyecto y sigo sin darle solución.
Vamos a ver, tengo una galería de fotos cuyo contenido va siendo cargado con AJAX. El tema es que mediante los típicos links a Facebook , Twitter y demás la gente lo puede compartir. Es decir: copia la url actual y la pega en otro site.
El hash de mi página va cambiando según cambio de foto. Así, por ejemplo, cuando entro directamente a la foto 54 voy a tener esta url:
mrsoriano.com/galeria/foto/54
Pero si después cargo la foto 12 con AJAX tendré esta url
mrsoriano.com/galeria/foto/54#12
Entonces, la cuestión es: ¿Cómo detecto la segunda url si alguien la ha compartido en cualquier sitio? Por que sólo consigo pillarlo hasta la #, lo que viene después no lo consigo en php de ninguna manera.
¿Vosotros cómo lo hacéis?
ozke
Q yo sepa todo lo de detras de la hash pasa en el lado cliente asi que solo puedes leerlo con JS.
Una vez en JS siempre puedes comucarte con PHP ya sea redireccionando o con AJAX.
En fin, la solucion final a lo q comente hace tiempo es que todo vaya normal en PHP... luego JS hace que en lugar de usar URLs uses hash e incorporas el jquery history plugin para la navegacion. Listos.
Si alguien va a un "deeplink" de PHP y quieres usar JS siempre puedes traducir dominio.com/seccion/lo/que/sea a dominio.com/seccion/#lo/que/sea y a partir de ahi todo va con hash. Esto seria para la opcion d usar siempre los deeplinks con hash. Q pasa si alguien accede con deeplink basado en hash y JS desactivado? Bueno, pues no se de ninguna solucion. Pero tampoco hay q suicidarse por ello pq si va sin JS por la vida tampoco vera la mitad de webs q se hacen hoy (incluyendo flash basado en swfobject) ni la mayoria de las q se haran el dia d manyana.
Siento la falta de acentos y las faltas. Teclado UK :S