image
Inicio » Foros » JavaScript

JavaScript

Obtener el foco de un popup

Volver al foro | Responder | Añadir nuevo tema


De: Sara
Fecha: 12/06/2008
Mensaje:

Hola! A ver si me podéis ayudar. Conseguí obtener el foco de un popup para que hasta que no se cierre dicho popup no pueda acceder a otra parte de la aplicación. Hize esto: ... ... ... El problema es que cuando quiero acceder a algún campo de texto de ese popup no puedo, nunca obtiene el foco ya que el foco le estoy diciendo que lo tenga la ventana. No me deja rellenarlo ni nada. ¿Sabríais decirme como conseguir mantener el foco de la ventana y acceder a la vez a su funcionalidad? Un saludo


Quizás le interese
De: jbosch(vosk)
Util para: 0 personas

Fecha: 12/06/2008
Mensaje:

lo planteas al revés: tienes que una unica instancia de ventana hija (y si quieres asegurarte, que sea sobrecargada en caso de error en vez de abrir varias ventanas):

var v=null;
function A() {v=window.open(url,"v");}

cuando se ejecuta 'A()' la variable 'v' recibe un puntero a la ventana hija. lo siguiente es declarar un manejador de eventos para el onfocus de la ventana pincipal (no de la hija), y asignarle la funcion que hará las veces de funcion blur asignando el foco a la ventana hija:

function B() { if(v) {v.focus();} }
document.onfocus=B;

el evento focus se produce varias veces sobre la ventana principal, aun cuando no exista ventana hija (es decir aun cuando !v), por eso compruebo que el puntero a la ventana hija exista y, si es el caso, le asigno el foco. pero como voy a saber si la ventana hija se ha cerrado? en teoria cuando cierras la ventana asignada a una variable, esa variable automaticamente apunta a un valor nulo, es decir que se restaura al valor inicial con lo que la funcion 'B()' no hace nada. si quieres asegurarte que se cumple todo esto puedes añadir una funcion a esta ventana principal que esperará ser llamada desde la ventana hija recibiendo como argumento un puntero a la ventana que la llama:

function C(h) {if(v && v==h) {v=null;} }

de esta forma te aseguras que recibes la notificacion del cierre de ventana desde la ventana hija que has abierto; si conincide el valor del puntero a la hija con el argumento de la hija es que se trata de la ventana que estas esperando, en este caso restauras el valor de puntero y te aseguras que vuelve a ser nulo. lo siguiente es usar un script en la hija para que llame a la principal en el momento de cerrarse:

<body OnUnLoad="opener.window.C(self.window);">

como ves el argumento es un puntero a la propia ventana, y tiene que ser igual al valor de la variable que se generó en el momento de abrirla.

recuerda de no usar las variables globales (en este caso 'v') para varios propositos, de lo contrario puede no funcionar. otra cosa, si quieres abrir varias ventanas tendras que asignarlas a varias variables y asignarles diferentes nombres

v1=open(url,"v1");
v2=open(url,"v2");
...

de forma que en las sicesivas llamadas a las funciones de cierre de ventana puedas asegurarte de con que ventana tienes que trabajar.

jbosch(vosk)



De: Sara
Util para: 0 personas

Fecha: 12/06/2008
Mensaje:

Olé tú y olé tu explicacion! Muchas gracias!! Sin embargo no 'tan olé yo' que necesito que me aclares un par de dudas más: Cuando pones: function B() { if(v) {v.focus();} } document.onfocus=B; el document.onfocus=B no me queda muy claro en que lugar tengo que ponerlo. Y por otro lado, no puedo poner onfocus, ya que mi navegador recoge onfocusin y onfocusout. Cual de los dos debería poner? Al final siempre me da un error javascript que me dice algo así como que "No se puede hacer una llamada de salida desde la aplicacion que está ejecutando una llamada de sincronizaciçon de entreda". Que estoy haciendo mal? Sabrías decirme!! Muchas gracias por tu respuesta!



De: jbosch(vosk)
Util para: 1 personas

Fecha: 12/06/2008
Mensaje:

pero que navegador tan raro usas??? esto funciona en ff,nsn7 y msie6. por partes:

'document.onfocus=B;' es la declaracion de un manejador de eventos obtenidos en el documento y concretamente solo para el evento 'focus'; equivale a 'cuando en el documento se produzca un onfocus llama a B'. por defecto en estos manejadores de eventos se envia como argumento un puntero al eveto creado (menos en msie que los eventos son globales bajo el objeto 'event'); en eset caso no se usa ese argumento por lo que ya no doy ninguna variable para recibirlo. estos manejadores se suelen declarar de forma global, es decir dentro de un script pero fuera de cualquier funcion. en este codigo he declarado primero la funcion 'B()' y luego el manejador de eventos que la llama (en javascript puedes llamar a una funcion declarada posteriormente a la llamada, por lo que el orden en la declaracion no importa). tambien puedes asignarle la funcion directamente:

document.onfocus=function() {/**/}

por lo del focus supongo que tienes que usar 'onfocusin' referido a la pagina principal, es decir cuando la principal recibe el foco, comprueba si hay una hija, si es el caso le devuelve el foco.

y por lo del error me temo que no lo había visto nunca, y no se me ocurre el motivo porque este sistema que te he planteado es igual al sistema de objeto deshabilitado 'onFocus=this.blur()', donde el 'this.blur()' equivale a la funcion 'B()' (solo que el blur salta el foco al siguiente elemento mientras que en mi funcion se fuerza a un elemento contreto que es la ventana hija). por lo que esto ultimo no se como resolverlo. si encuentras algo mas acerca de esto lo comentas, para saberlo mas que nada.

jbosch(vosk)



Volver al foro | Responder | Añadir nuevo tema

Quizás le interese:

WebEstilo.com no se hace responsable de las opiniones que los usuarios puedan verter en cualquiera de los foros existentes.

Si te solucionó el problema pulsa en G+1


Gracias!






Comparte



Última modificación:31 de Agosto de 2017. Spain - Espa�a.
© 1998-2004 por . Todos los derechos reservados.