2011-06-14 14 views

Respuesta

50

Si no desea cambiar su código actual, sólo tiene que anular window.open() función:

var openedWindows = []; 
window._open = window.open; // saving original function 
window.open = function(url,name,params){ 
    openedWindows.push(window._open(url,name,params)); 
    // you can store names also... 
} 

Ejecutar este código antes de llamar window.open(). Todas las referencias a las ventanas abiertas se almacenarán en la matriz openedWindows. Puede acceder a ellos en cualquier lugar que desee

+1

¡Voto por el buen truco! – rahulmohan

+3

@Govind: una advertencia para esta solución: es un truco y es mejor evitarlo para evitar futuros problemas de mantenimiento. Ver: http://stackoverflow.com/questions/6223449/why-is-it-frowned-upon-to-modify-javascript-objects-prototypes/6223589#6223589 – rahulmohan

+0

¡seguro! para evitar problemas futuros, es mejor renombrar la función que escribí a algo como 'window.open2()' :) Y cambiar todas las llamadas '.open()' existentes a '.open2()'. Pero parece que @Govind no quiere cambiar nada en sus códigos ... –

15

No creo que pueda, a menos que sepa los nombres de las ventanas, que supongo que no. (Si usted sabe sus nombres, puede utilizar window.open("", "name") para obtener una referencia a ellos.)

La mejor opción es, por supuesto, para recordar la referencia de regresar de window.open en el primer lugar   — pero ya se sabe que. :-)

+0

+1 buena respuesta, pero tengo un requisito de este tipo de enfoque. –

+0

@Govind: Entendido. Lamentablemente, salvo guardar el valor de retorno o conocer los nombres asignados para que pueda recuperarlos más tarde con 'window.open (" "," name ")', no creo que haya una tercera alternativa. –

1

Ok, utilicé las respuestas a esta pregunta en Oracle CRM onDemand para desactivar una selección en una ventana emergente ejecutando el script desde la ventana primaria, ¡y funcionó! (No tengo ningún control sobre la generación de ventanas emergentes, que se abren en el marco de la aplicación)

Vamos a ver cómo lo hice:

Contexto: En una página de detalles el usuario puede añadir algo de información por hacer clic en un ícono de lupa >>> se abre una nueva ventana que contiene un formulario de búsqueda, pero una selección molesta al administrador: ¡Si el usuario cambia su valor predeterminado, obtendrá acceso a los registros prohibidos! ¡Oh Dios mío!

Primera aproximación: Deshabilitar que seleccione ahora!

Intento: Encontré attrib onclick de la imagen con las herramientas de desarrollo de mi navegador (F12). Había un método openAssocPopup, y luego sabía el nombre de la ventana secundaria: 'OccamPopup1' :)

¡Bien! Así que vamos a hacer un poco de magia (ejecutado en la ventana principal):

window.open("","OccamPopup1").document.getElementById("frmSearch.AQ").setAttribute("disabled", true); 

creo que esto puede ayudar, ya que esta cuestión ayudó a mí también. Usted tenía razón. Ahora estoy tratando de envolver el objeto del documento del niño dentro del objeto jQuery del padre para poder obtener acceso al DOM completo del niño ... pero esta es otra historia ...

+1

Esto no impide que un usuario cambie el valor del campo, ya sea usando Javascript (por ejemplo, desde la barra de URL) o usando las herramientas de desarrollo de la misma forma que lo hizo para encontrar el campo. Si es posible, los "registros prohibidos" deben evitarse con un código del lado del servidor. Sé que estoy respondiendo a una publicación anterior, y me imagino que ha considerado estas posibilidades y ha tomado la única solución disponible. Sin embargo, creo que es importante que otros que se den cuenta de esto estén conscientes del riesgo de las protecciones solo para el lado del cliente. – SimeonJM

+0

Sí, tiene razón ... pero ... 1.- Oracle CRM onDemand está en la nube, y cambiamos las cosas por medio de jQuery siempre que solo tengamos algunas herramientas limitadas para personalizar la funcionalidad. 2.-Los usuarios son novatos, o nerds de Javascript ... casi todos ... supongo que no pierden el tiempo pirateando el CRM como nosotros (somos sus proveedores, el equipo de desarrollo) ... y no lo hago Me importa si lo hacen ...: P ¡GRACIAS! –

0

Sería mejor nombrar las ventanas usando un prefijo y un contador.

que necesitaba para detectar si una ventana llamada (es decir CBCheckout) ya estaba abierta y se utiliza esto:

var signupWindow = window.open('','CBCheckout','toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no,width=1,height=1'); 
try { 
    if (signupWindow.document.location.href == "about:blank") { 
     signupWindow.close(); 
     signupWindow = undefined; 
    } 
} catch (e) { } 

Este recapturados la referencia a la ventana abierta llamada. Si no existiera, verías una pequeña ventana emergente por un segundo.

Si conoce los nombres posibles de las ventanas, puede recorrer los nombres, intentando ubicarlas.

Cuestiones relacionadas