2012-01-08 10 views
6

primero apagado Parece que no puedo imaginar para qué sirve el primer parámetro en la función pushState? ¿Qué paso a eso? Simplemente quiero cambiar la URL cuando se desplaza por mi página. Estoy consultando el ID del elemento actual en la ventana gráfica y su ID también debería ser el enlace en la url. Eso funciona bien con el código a continuación.HTML5/jQuery: pushState y popState - ¿enlace profundo?

var currentHash, 
     url; 

    if (history && history.pushState) { 

     $(window).scroll(function() { 
      hash = $('.layer:in-viewport').attr('id'); 
      catHash = $("#"+hash).parent('section').attr('id'); 

      var data = "nothing"; 

      if (catHash != undefined) 
       url = "/" + catHash + "/" + hash; 
      else 
       url = "/" + hash; 

      if (currentHash != hash) { 

       window.history.pushState(data, hash, url); 

      } 

      currentHash = hash; 

     }); 

    } 

Ahora tengo dos preguntas:

1.) En este momento la dirección URL en el addressbar cambios con éxito cuando me desplazo a través de mi página. ¿Cómo puedo consultar el url/hash en la barra de direcciones cuando inicialmente cargo la página? Entonces imagina que tengo un enlace como www.url.com/deep. ¿Quiero saber qué/profundo es? ¿Simplemente tengo que consultar la top.location completa y dividirla en cada "/"? Quiero decir que esos enlaces en realidad no existen, entonces, ¿cómo evito las 404 páginas cuando llamo a una url que manipulé con la función pushState?

2.) ¿Cómo puedo averiguar el último cambio en la barra de direcciones al hacer clic en el botón Atrás? Así que quiero encontrar /deep al hacer clic en el botón Atrás del navegador para poder volver a esa posición en la página. ¡Supongo que esto probablemente funciona con popstate, pero no pude averiguar cómo!

¡Gracias por tu ayuda!

Actualización:

window.history.pushState("test", hash, url); 

...

$(window).bind('popstate', function(event){ 
     console.log(event.data); 
    }); 

Esto es todos los días nula. ¿No debería esto devolver la "prueba"?

+0

'' no event.state' event.data' – Quentin

+0

Sí, lo he intentado, pero no hay '' event.state' cuando la consola .log (evento); 'Solo hay datos; sin embargo, los datos siempre son" nulos "y si intento registrar' event.state', ¡siempre será nulo! – matt

+1

Ok, encontré la solución ... parece como '$ (ventana) .bind ('popstate', función (evento) {' no funciona pero 'window.onpopstate = function (event) {' does! – matt

Respuesta

6

¿para qué sirve el primer parámetro en la función pushState?

De the documentation

objeto de estado - El objeto de estado es un objeto JavaScript que se asocia con la nueva entrada de la historia creada por pushState(). Cada vez que el usuario navega al nuevo estado, se activa un evento de estado emergente y la propiedad de estado del evento contiene una copia del objeto de estado de la entrada del historial.

Por lo tanto, es un conjunto de datos de su elección que obtiene cuando regrese a ese estado.

En este momento, la url en la barra de direcciones cambia con éxito cuando me desplazo por mi página. ¿Cómo puedo consultar el url/hash en la barra de direcciones cuando inicialmente cargo la página?

Mire el objeto location ... pero no es necesario. Puede (y debe) poblar el lado del servidor de la página. Esta es una de las ventajas de pushState, el enlace sigue funcionando si JavaScript no está disponible y la reserva del lado del servidor está integrada sin problemas.

¿Cómo puedo saber el último cambio en la barra de direcciones al hacer clic en el botón Atrás?

Agregue un detector de eventos (buscando un evento popState), y los datos almacenados en él estarán disponibles en el objeto de evento. MDN has an example

+0

Gracias, casi lo tengo. Actualicé mi pregunta para el caso popstate. Así que podría almacenar, por ejemplo, una cadena como primer dato atributo en pushState y recuperarlo al presionar el botón Atrás, ¿verdad? Sólo necesito saber cómo puedo consultar el último cambio que hice con pushState cuando presiono el botón de retroceso del navegador. Y una cosa más: entiendo el lado del servidor, sin embargo, ¿cómo puedo (en mi caso) con un único diseño de página volver a esta página y consultar la barra de direcciones? Tengo un diseño de página único en el que solo quiero cambiar la URL cuando estoy en una posición determinada en la página ... – matt

+0

Cuando envío uno de esos deep-link generados (no existentes) y alguien los abre en el navegador Quiero saltar a esa posición en la página. Como puede ver arriba, el '/ url' simplemente coincide con el ID del elemento en la ventana gráfica ...' hash = $ ('. Layer: in-viewport'). Attr ('id'); 'Entonces cuando' div # example 'está en la ventana gráfica mi URL se ve como' abc.com/example'. Cuando vuelvo a cargar la página, quiero consultar este '/ example' y agregar un' # 'y saltar a esta posición en la página. ¿Como lo puedo hacer? – matt

+0

¿Cómo se usan los datos que almacena allí? –

4

jQuery abstrae el objeto de evento, que desea: event.originalEvent.state;

Cuestiones relacionadas