Foros Programación Cliente

Problema con AJAX degradable

22 22 Respuestas Lunes 3 de noviembre, 2008
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???
Registrado desde 10/05/02
Número de posts: 1473
  • Avatar de cbp cbp Registrado desde 18/11/03 / Número de posts: 4007
    ¿por qué cambias los enlaces de "?seccion1" a "#seccion1"?
    Publicado hace 3 años
  • Avatar de ozke ozke Registrado desde 10/05/02 / Número de posts: 1473
    Para evitar una URLs como www.loquesea.com/seccion1/#seccion2/
    Publicado hace 3 años
  • Avatar de cbp cbp Registrado desde 18/11/03 / Número de posts: 4007
    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?
    Publicado hace 3 años
  • Avatar de ozke ozke Registrado desde 10/05/02 / Número de posts: 1473
    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.
    Publicado hace 3 años
  • Avatar de cbp cbp Registrado desde 18/11/03 / Número de posts: 4007
    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?
    Publicado hace 3 años
  • Avatar de MrSoriano MrSoriano Registrado desde 28/06/07 / Número de posts: 1155
    ¿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
    Publicado hace 3 años
  • Avatar de ozke ozke Registrado desde 10/05/02 / Número de posts: 1473
    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 :)
    Publicado hace 3 años
  • Avatar de cbp cbp Registrado desde 18/11/03 / Número de posts: 4007
    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
    Publicado hace 3 años
  • Avatar de MrSoriano MrSoriano Registrado desde 28/06/07 / Número de posts: 1155
    Ponnos un link anda, que me quedo con las ganas de ver el código.
    Publicado hace 3 años
  • Avatar de ozke ozke Registrado desde 10/05/02 / Número de posts: 1473
    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.
    Publicado hace 3 años
  • Avatar de MrSoriano MrSoriano Registrado desde 28/06/07 / Número de posts: 1155
    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.
    Publicado hace 3 años
  • Avatar de HARTUM HARTUM Registrado desde 22/11/02 / Número de posts: 4293
    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
    Publicado hace 3 años
  • Avatar de ozke ozke Registrado desde 10/05/02 / Número de posts: 1473
    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. :?
    Publicado hace 3 años
  • Avatar de HARTUM HARTUM Registrado desde 22/11/02 / Número de posts: 4293
    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.


    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
    Publicado hace 3 años
  • Avatar de MrSoriano MrSoriano Registrado desde 28/06/07 / Número de posts: 1155
    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.
    Publicado hace 3 años
  • Avatar de ozke ozke Registrado desde 10/05/02 / Número de posts: 1473
    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
    Publicado hace 3 años
  • Avatar de zigotica zigotica Registrado desde 10/05/04 / Número de posts: 1818

    ozke

    alguna forma de detectar un hash desde php

    http://es.php.net/manual/es/function.parse-url.php
    cito:
    Sobre URLs seriamente malformadas, parse_url() puede devolver FALSE y emitir un valor E_WARNING. De lo contrario se devuelve una matriz asociativa, cuyos componentes pueden ser (al menos uno):

    * scheme - p.ej. http
    * host
    * port
    * user
    * pass
    * path
    * query - después del signo de interrogación ?
    * fragment - después del signo de numeral #

    Si el parámetro componente es especificado, un valor tipo string es devuelto en lugar de un array.
    Sergi
    z- dinavatar- fotos- !!!
    Publicado hace 3 años
  • Avatar de ozke ozke Registrado desde 10/05/02 / Número de posts: 1473
    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.
    :)
    Publicado hace 3 años
  • Avatar de zigotica zigotica Registrado desde 10/05/04 / Número de posts: 1818
    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.
    Sergi
    z- dinavatar- fotos- !!!
    Publicado hace 3 años