javascript - poner - html enlace a otra carpeta
¿Es posible detectar si un usuario ha abierto un enlace en una nueva pestaña? (7)
Además de history.length en JavaScript, puede leer / escribir el nombre de la ventana.
Por lo tanto, si verifica si tiene un nombre cargado ... debería estar en blanco en la primera carga ... si luego lo configura en "foo" ... en cada carga subsiguiente en esa ventana ... la ventana. la propiedad de nombre devolverá "foo" ... a menos que abra un enlace en una nueva pestaña / ventana ... esa nueva ventana no debería tener un nombre configurado.
(a menos que, por supuesto, abra una ventana emergente a través de window.open (url, nombre, características); lo que le permite preestablecer el nombre)
<script>
if(window.name == ''''){
//first load (or Nth load in a new Tab/Window)
if(!SOME_VALUE_SET_FOR_2ND_TO_NTH_LOADS){
//set name so we can catch new Tab/Window
window.name = ''myWinName'';
} else {
//we have a new Tab/Window (or something funky)
alert(''What?! One window not cool enough for ya?/n'' +
''Calling the InterWeb Police!'');
}
} else if(window.name == ''myWinName''){
//2nd-Nth load
document.title = ''All is well... we think'';
}
</script>
Advertencias:
- Si su página se carga inicialmente en una ventana / marco que ya tenía un nombre ... las cosas se volverán extravagantes
- Si su página tiene iframes (nombrados) y tiene enlaces dirigidos a esos iframes, hay un error en IE7 / 8 por el cual cuando el usuario abre esos enlaces en una nueva pestaña / ventana, la nueva pestaña / ventana "heredará" la nombre del iframe al que se orientó originalmente (error muy ODD sin solución alguna vez esperada)
Si un usuario está en su sitio web y abre otro enlace (también a su sitio web) en una nueva pestaña, ¿es posible diferenciarlo del usuario simplemente haciendo clic en el enlace normalmente? Esto puede estar en javascript, en el servidor, lo que sea.
Supongo que la respuesta es que no puedes hacer esto, pero quería verificarlo.
Es el comportamiento del cliente, por lo que creo que podrías hacer algo con javascript, como verificar el historial del navegador, pero es ambiguo entre una nueva pestaña y una nueva ventana.
Además, no todos los navegadores tienen pestañas y no todos los navegadores tienen el mismo significado para lo que es una pestaña (en algunos hay procesos diferentes, en otros no).
Pero, ¿por qué querrías comprobar eso? ¿Realmente importa si su aplicación se está ejecutando en una nueva pestaña o no? No lo creo...
Esto es lo que uso en ASP.NET MVC para prohibir a los usuarios autenticados que abran varias pestañas:
<script language="javascript" type="text/javascript">
@if(Request.IsAuthenticated)
{
<text>
if (window.name != ''singleWindow'') {
window.location.href = "Content/ErrorPages/SingleTab.htm";
}
</text>
}
else
{
<text>
window.name = "singleWindow";
</text>
}
</script>
Básicamente, esto establece el nombre de la ventana por primera vez cuando el usuario visita la página de inicio de sesión. Después de iniciar sesión, para cada carga de página posterior, se prueba el nombre de la ventana.
Dos problemas:
- no funciona si JavaScript está deshabilitado
- si por error el usuario cierra la pestaña original y luego pega algún otro enlace a mi sitio web en la barra de direcciones, el usuario siempre recibirá la página de error. Para dar al usuario la oportunidad de recuperarse, he incluido el enlace "Cerrar sesión" en la página SingleTab.htm, para que el usuario pueda destruir su cookie de sesión y comenzar una nueva sesión.
La propiedad window.opener en JavaScript apuntará a la ventana que abrió la nueva ventana. Sin embargo, no distingue entre una nueva ventana y una nueva pestaña. Las pestañas no son parte de las especificaciones oficiales de W3C, por lo que no hay soporte directo para ellas.
La respuesta corta es no. La respuesta larga es, si está haciendo una llamada ajaxy desde sus páginas a métodos del lado del servidor, eso podría mantener abierta la vía de las ventanas (llamada dentro de un corto período de tiempo). Sería un desastre descuidado y poco confiable, y no podría diferenciar entre una nueva ventana o una pestaña para esa materia.
Puedes hacerlo de esta manera:
if (history.length == 1) { // Um, needs to be 0 for IE, 1 for Firefox
// This is a new window or a new tab.
}
Puede haber otras formas para que la history.length
sea 1
, pero no sé cuáles podrían ser.
Realmente no lo creo. Lo más cerca que puede llegar a llegar hasta donde estoy al tanto es monitorear los eventos de presionar teclas y hacer clic con el mouse para intentar hacer coincidir las acciones con los métodos comunes para abrir enlaces en nuevas pestañas. (es decir, si mantienen el comando cuando hacen clic, o hacen clic con el botón central, es probable que sea una nueva pestaña). Sin embargo, eso no sería confiable, ya que cualquiera de esos enlaces puede cambiarse.