2009-05-11 15 views

Respuesta

32

especie de usted puede 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 maneras para history.length a ser 1, pero yo no sé lo que podría ser.

+0

También puede consultar history.previous ... –

+0

@Jason: Obtengo errores de permiso en Firefox cuando intento ver history.previous. – RichieHindle

+0

@RichieHindle: hmmm ... Estaba tratando de poner mi dedo en eso ... pero sí ... es por eso que apesta ... –

0

Realmente no lo creo. Lo más cerca que podría estar de lo que estoy enterado es monitoreando eventos de pulsación de tecla y mouse para tratar de emparejar acciones con métodos comunes para abrir enlaces en pestañas nuevas. (es decir, si están presionando Comando cuando hacen clic o hacen clic en el medio, es probable que sea una pestaña nueva). Sin embargo, eso no sería confiable, ya que cualquiera de esas consolidaciones puede cambiarse.

2

La respuesta corta es, no. La respuesta larga es que si está haciendo una llamada ajaxy desde sus páginas a los métodos del lado del servidor, eso podría mantener abierta la ruta de las ventanas (llamada dentro de un corto espacio de tiempo). Sería un desastre descuidado y poco confiable, y no podría diferenciar entre una nueva ventana o una pestaña para ese asunto.

3

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.

+0

+1 para usar window.opener –

+0

window.opener es nulo para mí en Firefox cuando "Abrir enlace en una pestaña nueva". – RichieHindle

+1

window.opener solo se establece cuando se usa una ventana js.open, no a través de la acción del usuario en una etiqueta A. – Tracker1

0

Es el comportamiento del cliente, por lo que creo que podría hacer algo con javascript, como comprobar el historial del navegador, pero es ambiguo entre una nueva pestaña y una nueva ventana.

Además de eso, 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 son procesos diferentes, en otros no lo son).

Pero, ¿por qué querrías comprobarlo? ¿Realmente importa si su aplicación se está ejecutando en una nueva pestaña o no? No lo creo ...

11

Además de history.length en JavaScript, puede leer/escribir el nombre de la ventana.

Por lo tanto, si comprueba si tiene un nombre de carga ... debe estar en blanco en la primera carga ... si luego lo configura en "foo" ... en cada carga posterior en esa ventana ... la propiedad window.name devolverá "foo" ... a menos que abra un enlace en una nueva pestaña/ventana ... esa nueva ventana no debería tener ningún nombre establecido.

(a menos que, por supuesto, se abre una ventana emergente a través de window.open (url, nombre, características), lo que le permite pre-configurar 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 usted 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 "hereden" el nombre del marco flotante que fue dirigido originalmente (error muy extraño sin solución alguna vez de esperar)
+0

Este es un buen truco :-) Tuve que probarlo para ver si funcionaba. Si entiendo este derecho, supondrías que tienes una página de entrada a la aplicación donde siempre se supone que window.name está en blanco: al ingresar a esa página, estableces un valor conocido. En todas las demás páginas, se conserva la navegación en esa misma ventana window.name. Sin embargo, si abre una pestaña, window.name se pierde. En ese punto, el script verifica si window.name no está en blanco, y como no está en su primera página de entrada, ha detectado que se abrió una nueva pestaña. ¡Muy aseado! –

6

Esto es lo que yo uso en ASP.NET MVC para prohibir a los usuarios autenticados para abrir 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 wok JavaScript desactivado
  • 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 recibirá siempre la página de error Para dar al usuario la oportunidad de recuperar, 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.
Cuestiones relacionadas