Ver Mensaje Individual
  #41 (permalink)  
Antiguo 16/01/2009, 18:47
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: ¿Uso de # como variable?

Hola,

Como dije anteriormente, no creo que sea un funcionamiento adecuado, puesto que presenta muchos inconvenientes entre los navegadores. Aunque Mikmoro presentó el concepto claramente y funcional, (aunque el ejemplo del vínculo evidentemente no funcionó como se esperaba, creo que es por que lo tiene dentro de un iframe).

Lograr ese funcionamiento no es complicado, demostrarlo es sencillo, aunque no va a funcionar en todos los navegadores, por que no es un funcionamiento adecuado (va en contra de las especificaciones de los URL, el protocolo HTTP y como funcionan los browsers actualmente).

Por ejemplo, en una página con estos vínculos:

Código:
<p><?php echo 'SERVER ID : ' . rand(); ?></p>
<p><a id="link1" href="#pagina1" name="link1">Pagina 1</a></p>
<p><a id="link2" href="#pagina2" name="link2">Pagina 2</a></p>
<p><a id="link3" href="#pagina3" name="link3">Pagina 3</a></p>
<p><a id="link4" href="#pagina4" name="link4">Pagina 4</a></p>
<p id="view">&nbsp;</p>
Observen que hay una llamada a una función de PHP, para averiguar cuando llega al servidor y cuando no llega, puesto que si llega al servidor esa parte de la página cada vez que cargamos algo con AJAX, no tendría sentido usar AJAX (como en el caso de usar location.reload()). (Si no tienen acceso a un servidor con PHP, van a tener que eliminarlo y no van a poder comprobar esa parte)

Seguidamente el Javascript:

Código:
function navigate(where) {
 // Documento cargado con AJAX.
 document.getElementById("view").innerHTML = where;
}

window.onload = function () {
 var i;
 for (i = 0; i < document.links.length; i++) {
  document.links[i].onclick = function () {
   navigate(this.href);
   return true;
  };
  if ((new RegExp(document.links[i].href + "$")).test(window.location)) {
   navigate(document.links[i].href);
  }
 }
}
En este caso, primero, a todos los vínculos se le asigna el evento para navegar con AJAX, aunque en este caso no escribí todo el procedimiento de AJAX, solamente es para fines demostrativos.

Seguidamente use una expresión regular para averiguar si el fragmento introducido en el URL está al final de la ubicación actual del browser, y navega, con la supuesta función navigate() para cargar la información.

Si lo prueban en cualquier browser 'actualizado', van a poder ver que cada vínculo cambía el URL del navegador y cambia el contenido del parrafo 'view', y cuando escriben el URL directamente en 'UNA PAGINA NUEVA' del browser, van a poder observar que efectivamente, cambia el contenido.

Ahora vienen mil problemas ... el browser piensa que cuando se cambia el 'fragmento' a mano, por ejemplo de '#pagina3' a '#pagina2', no necesita ni enviarlo al servidor, ni ejecutar de nuevo el Javascript, por que NO era necesario actualmente.

Tampoco va a funcionar el botón atrás, puesto que esa página no existe en el Historial del browser, el browser ni se enteró que la página cambió de estado por medio de Javascript. (En las especificaciones del URL está claro que son 2 URL distintas y debería de guardarlo en el Historial, pero nunca se ha hecho así).

Es una casualidad que Chrome y Safari no solo guarda en el historial la página, sino que la manda al servidor. ¿Será por eso que a mí me funciona Gmail en Chrome, y da tantos problemas en Firefox?

Estoy ya había sucedido con los iframes cuando comenzaron a ser populares, y me pasaba algo parecido con el historial, pero cada quien saque sus propias conclusiones. <edit> Y comente que piensa ... </edit>

Saludos,

Última edición por HackmanC; 16/01/2009 a las 22:36 Razón: <edit>