Quiero usar JavaScript para ver si hay historial o no, quiero decir si el botón Atrás está disponible en el navegador o no.
javascript
Ryan
fuente
fuente
Respuestas:
Respuesta corta: no puedes.
Técnicamente hay una forma precisa, que sería verificar la propiedad:
Sin embargo, no funcionará. El problema con esto es que en la mayoría de los navegadores esto se considera una violación de seguridad y generalmente solo regresa indefinido .
Es una propiedad que otros han sugerido ...
Sin embargo , la longitud no funciona por completo, ya que no indica donde en la historia que eres. Además, no siempre comienza en el mismo número. Un navegador que no está configurado para tener una página de destino, por ejemplo, comienza en 0, mientras que otro navegador que usa una página de inicio comenzará en 1.
La mayoría de las veces se agrega un enlace que llama:
o
y solo se espera que si no puedes regresar, hacer clic en el enlace no haga nada.
fuente
Hay otra forma de verificar: verificar el referente. La primera página generalmente tendrá un referente vacío ...
fuente
Mi código permite que el navegador retroceda una página, y si eso falla, carga una URL de reserva. También detecta cambios en los hashtags.
Cuando el botón Atrás no estaba disponible, la URL de reserva se cargará después de 500 ms, por lo que el navegador tiene tiempo suficiente para cargar la página anterior. Si carga la URL de reserva inmediatamente después
window.history.go(-1);
, el navegador usará la URL de reserva, porque el script js aún no se detuvo.fuente
chrome://newtab
y, por lo tanto, puede retroceder en el historial.Así es como lo hice.
He utilizado el evento 'beforeunload' para establecer un valor lógico. Luego establecí un tiempo de espera para ver si se disparaba el 'beforeunload'.
Parece funcionar en los principales navegadores (probado hasta ahora FF, Chrome, IE11).
fuente
window.location.href = fallback
conwindow.close()
y también funciona.Hay un fragmento que uso en mis proyectos:
FYI: Yo uso History.js para administrar el historial del navegador.
¿Por qué comparar history.length con el número 2?
Porque la página de inicio de Chrome se cuenta como el primer elemento en el historial del navegador.
Hay pocas posibilidades
history.length
y comportamiento del usuario:history.length = 2
y queremos deshabilitarback()
en este caso, porque el usuario irá a la pestaña vacía.history.length = 1
y nuevamente queremos deshabilitar elback()
método.history.length > 2
y ahoraback()
se puede habilitar.Nota: omito el caso cuando el usuario aterriza en la página actual después de hacer clic en el enlace del sitio web externo sin
target="_blank"
.Nota 2:
document.referrer
está vacío cuando abre el sitio web escribiendo su dirección y también cuando el sitio web utiliza ajax para cargar subpáginas, por lo que dejé de verificar este valor en el primer caso.fuente
Esto parece hacer el truco:
Llame history.back () y luego window.close (). Si el navegador puede retroceder en el historial, no podrá acceder a la siguiente declaración. Si no puede regresar, cerrará la ventana.
Sin embargo, tenga en cuenta que si se ha llegado a la página escribiendo una URL, Firefox no permitirá que el script cierre la ventana.
fuente
window.close()
es considerado un riesgo de seguridad por muchos navegadores modernos. Algunos simplemente no te dejan hacerlo.Tenga cuidado
window.history.length
porque incluye también entradas parawindow.history.forward()
Por lo tanto, es posible que tenga
window.history.length
más de 1 entradas, pero no entradas de historial. Esto significa que no pasa nada si disparaswindow.history.back()
fuente
No puede verificar directamente si el botón Atrás es utilizable. Puede mirar
history.length>0
, pero eso será válido si hay páginas delante de la página actual también. Solo puede estar seguro de que el botón Atrás no se puede usar cuandohistory.length===0
.Si eso no es lo suficientemente bueno, todo lo que puede hacer es llamar
history.back()
y, si su página aún se carga después, ¡el botón de retroceso no está disponible! Por supuesto, eso significa que si el botón Atrás está disponible, acaba de salir de la página. No se le permite cancelar la navegaciónonunload
, por lo que todo lo que puede hacer para evitar que la parte posterior realmente ocurra es devolver algoonbeforeunload
, lo que resultará en un gran mensaje molesto. Que no vale la pena.De hecho, normalmente es una muy mala idea hacer algo con la historia. La navegación del historial es para el navegador Chrome, no para las páginas web. Agregar enlaces de "retroceso" generalmente causa más confusión al usuario de lo que vale.
fuente
1
. El0
era un Brainfart, pensé navegadores siempre responderían con1
o más. Resulta que Opera e IE piensan lo contrario, buena captura.history.length
es inútil ya que no muestra si el usuario puede volver al historial. Además, diferentes navegadores usan valores iniciales 0 o 1; depende del navegador.La solución de trabajo es usar el
$(window).on('beforeunload'
evento, pero no estoy seguro de que funcionará si la página se carga a través de ajax y usa pushState para cambiar el historial de la ventana.Así que he usado la siguiente solución:
fuente
Se me ocurrió el siguiente enfoque. Utiliza el evento onbeforeunload para detectar si el navegador comienza a abandonar la página o no. Si no lo hace en un período de tiempo determinado, simplemente se redirigirá a la reserva.
Puede llamar a esta función usando
goBack("fallback.example.org")
.fuente
windows.onbeforeunload
a detector de eventoswindow.addEventListener("beforeunload", function (event) { useFallback = false; });
para que no sobrescriba window.onbeforeunload.Sobre la base de la respuesta aquí y aquí . Creo que la respuesta más concluyente es verificar si se trata de una página nueva en una pestaña nueva.
Si el historial de la página es más de uno, entonces podemos volver a la página anterior a la página actual. De lo contrario, la pestaña es una pestaña recién abierta y necesitamos crear una nueva pestaña.
De manera diferente, a las respuestas vinculadas, no estamos verificando una,
referrer
ya que una nueva pestaña todavía tendrá un referente.fuente
Hay otra solución casi perfecta, tomada de otra respuesta SO :
Alguien informó que no funciona cuando se usa,
target="_blank"
pero parece funcionar para mí en Chrome.fuente
el navegador tiene botón de retroceso y avance. Se me ocurre una solución a esta pregunta. pero afectará la acción de avance del navegador y causará errores con algunos navegadores.
Funciona así: si el navegador abre una nueva url, que nunca se ha abierto, la longitud de la historia crecerá.
para que puedas cambiar hash como
para obtener una URL nunca mostrada, entonces history.length obtendrá la longitud verdadera.
pero, no siempre funciona bien, y no sé por qué, especialmente cuando el url automático salta rápidamente.
fuente
Estaba tratando de encontrar una solución y esto es lo mejor que pude obtener (pero funciona muy bien y es la solución más fácil que he encontrado incluso aquí).
En mi caso, quería volver al historial con un botón de retroceso, pero si la primera página que el usuario abrió era una subpágina de mi aplicación, volvería a la página principal.
La solución fue que, tan pronto como se cargó la aplicación, acabo de reemplazar el estado del historial:
De esta manera, solo necesito verificar
history.state.root
antes de volver. Si es cierto, hago un reemplazo de historial en su lugar:fuente
fuente
history.back()
estáundefined
en la página de pestaña vacíaSolución
Explicación
window.location.pathname
le dará el URI actual. Por ejemplohttps://domain/question/1234/i-have-a-problem
dará/question/1234/i-have-a-problem
. Consulte la documentación sobre window.location para obtener más información.Luego, la llamada a
split()
nos dará todos los fragmentos de ese URI. así que si tomamos nuestro URI anterior, tendremos algo así["", "question", "1234", "i-have-a-problem"]
. Consulte la documentación sobre String.prototype.split () para obtener más información.La llamada a
filter()
está aquí para filtrar la cadena vacía generada por la barra diagonal inversa. Básicamente, solo devolverá el URI del fragmento que tenga una longitud mayor que 1 (cadena no vacía). Entonces tendríamos algo así["question", "1234", "i-have-a-question"]
. Esto podría haberse escrito así:Consulte la documentación sobre Array.prototype.filter () y la asignación Destructuring para obtener más información.
Ahora, si el usuario intenta regresar mientras está encendido
https://domain/
, no activaremos la instrucción if, y no activaremos elwindow.history.back()
método para que el usuario permanezca en nuestro sitio web. Esta URL será equivalente a la[]
que tiene una longitud de0
, y0 > 0
es falsa. Por lo tanto, silenciosamente fallando. Por supuesto, puede registrar algo o tener otra acción si lo desea.Limitaciones
Por supuesto, esta solución no funcionará si el navegador no es compatible con la API de historial . Consulte la documentación para obtener más información antes de usar esta solución.
fuente
No estoy seguro de si esto funciona y no está completamente probado, pero intente esto:
Y en algún lugar en HTML:
EDITAR:
Lo que también puede hacer es investigar qué navegadores admiten la función de retroceso (creo que todos lo hacen) y usar el objeto de detección de navegador JavaScript estándar que se encuentra y se describe a fondo en esta página . Luego puede tener 2 páginas diferentes: una para los "buenos navegadores" compatibles con el botón de retroceso y otra para los "malos navegadores" que les dice que actualicen su navegador
fuente
history.back
Es una función. Desea verificar sihistory.length > 0
entonces si es volver conhistory.back()
[]
en una NodeList no tiene sentido, y no puede asignar una cadena a un controlador de eventos.Verifique si
window.history.length
es igual a 0.fuente