Foros del Web » Programando para Internet » Javascript »

Propagación de eventos en JavaScript

Estas en el tema de Propagación de eventos en JavaScript en el foro de Javascript en Foros del Web. Tengo un problema con la propagación de eventos en IE. El código es el siguiente Código PHP: document . onkeydown =function( e ){      e  ...
  #1 (permalink)  
Antiguo 15/07/2008, 05:21
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 19 años, 10 meses
Puntos: 25
Pregunta Propagación de eventos en JavaScript

Tengo un problema con la propagación de eventos en IE.

El código es el siguiente

Código PHP:
document.onkeydown=function(e){
    
|| window.event;
    
miFuncion();
    
    
//e.cancelBubble is supported by IE - this will kill the bubbling process.
    
if (document.all){
        
e.keyCode=0;
        
e.cancelBubble true;
        
e.returnValue false;
    }

    
//e.stopPropagation works in Firefox.
    
if (e.stopPropagation) {
        
e.stopPropagation();
        
e.preventDefault();
    }
    return 
false;


El asunto es que si pulso teclas como F1, en Firefoz sí que funciona, pero en IExplorer, no... para variar.

¿Alguien tiene alguna idea o sabe como solucionarlo?
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
  #2 (permalink)  
Antiguo 15/07/2008, 06:54
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 19 años, 10 meses
Puntos: 25
Respuesta: Propagación de eventos en JavaScript

Cita:
Iniciado por eContento Ver Mensaje
Tengo un problema con la propagación de eventos en IE...
Bueno, en Firefox también tengo alguno...

A ver, en Internet Explorer

con F1 ó Ctrl+F1 me abre la ayuda.
Lo he solucionado con:
Código PHP:
if (e.keyCode==112){
  
document.onhelp=function () { return false; }

Pero con F3 me abre el panel del buscador
con F4 la barra de direcciones
con F5 recarga la página, etc...

Con Firefox, toda la combinación de [F1 .. F12] y [Ctrl + F1, ... , Ctrl + F12] funciona bien, es decir no propaga el evento al navegador, si no que puedo capturarlo y pararlo, a excepción de Ctrl+F4 que cierra la pestaña actual.

A ver si con esta información adicional, me podéis ayudar
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
  #3 (permalink)  
Antiguo 15/07/2008, 14:14
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: Propagación de eventos en JavaScript

Prueba en Safari y veras que te mueres! jaja.
__________________
twitter: @imbuzu
  #4 (permalink)  
Antiguo 15/07/2008, 18:23
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Respuesta: Propagación de eventos en JavaScript

loading.............


Bueno, en firefox no funcionara tal cosa porque es algo "tonto" no puedes cancelar eventos propios del navegador, es como querer cancelar menu de herramientas de firefox... no existe tal cosa. pero podría ayudarte si tomas el keycode de la tecla pulsada, si puedes capturar entonces talvez puedas cancelarla.


connection closed.
__________________

Maborak Technologies
  #5 (permalink)  
Antiguo 15/07/2008, 18:24
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Respuesta: Propagación de eventos en JavaScript

loading..........


PD: existen tambien eventos que puedes gestionar sabiendo si pulsaron Ctrl, Shift o Alt. busca en google "javascript detect shift". Talvez quieras llegar a eso.

connection closed.
__________________

Maborak Technologies
  #6 (permalink)  
Antiguo 16/07/2008, 01:25
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 19 años, 10 meses
Puntos: 25
Respuesta: Propagación de eventos en JavaScript

Cita:
Iniciado por MaBoRaK Ver Mensaje
[...]podría ayudarte si tomas el keycode de la tecla pulsada[...]
De hecho, lo tomo. No lo puse en el script para simplificarlo un poco, pero hago swicth-case con la tecla pulsada, y en función de cual es, hago unas cosas u otras.

Cita:
Iniciado por MaBoRaK Ver Mensaje
[...]en firefox no funcionara tal cosa porque es algo "tonto" no puedes cancelar eventos propios del navegador, es como querer cancelar menu de herramientas de firefox... no existe tal cosa[...]
Sin embargo, sí que funciona. Se para el burbujeo de eventos con todo, desde el F1 que abriría la ayuda, al F5 que recarga la página, al F11 que la abre en modo fullscreen... todos ellos se cancelan. No llegan a ejecutarse en firefox. Sólo el evento que produce Ctrl+F4 se eleva a la capa superior, no se para y cierra la pestaña en la que estás.

Me figuro que todos los navegadores que respeten la estructura y propagación de eventos especificada en el DOM, podrán para el burbujeo.

El explorer, no puede con ninguno. Sólo con F1, sobreescribiendo el controlador de evento document.onhelp. Pero ninguno más.

Sigo necesitando ayuda con esto... ¿alguien más?
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
  #7 (permalink)  
Antiguo 17/07/2008, 03:13
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 17 años, 6 meses
Puntos: 122
Respuesta: Propagación de eventos en JavaScript

Cita:
es algo "tonto"
Estoy de acuerdo contigo.

Cita:
no puedes cancelar eventos propios del navegador,
No estoy de acuerdo contigo, para eso existe el cacelBubble
__________________
twitter: @imbuzu
  #8 (permalink)  
Antiguo 17/07/2008, 03:20
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 19 años, 10 meses
Puntos: 25
Respuesta: Propagación de eventos en JavaScript

Cita:
Iniciado por buzu Ver Mensaje
No estoy de acuerdo contigo, para eso existe el cacelBubble
Efectivamente, pero como digo al principio del post, esto no funciona correctamente con Internet Explorer, que propaga el burbujeo de eventos hacia arriba, llegando hasta el navegador y ejecutando las acciones que tiene programadas para esa combinación de teclas...

Sigo igual que al principio
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
  #9 (permalink)  
Antiguo 22/07/2008, 05:54
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 19 años, 10 meses
Puntos: 25
Respuesta: Propagación de eventos en JavaScript

Vale,
Ya lo tengo solucionado.
Habitualmente, en los foros casi siempre se pregunta en busca de ayuda. Pero también es bueno poner la solución que hemos encontrado por si le puede servir a otros.

Os dejo aquí la solución que he encontrado al problema que tenía.


Código PHP:
//funciones para el control de la captura de teclas
var isCtrl false;


document.onkeyup=function(e){
    
|| window.event;
    if(
e.keyCode == 17isCtrl=false


document.onkeydown=function(e){
    
|| window.event;
    
    if(
e.target){ 
        
objE=e.target;
    }else if(
e.srcElement){
        
objE=e.srcElement;
    }
    
    switch(
e.keyCode){
        case 
17:
            
isCtrl=true;
            break;
        case 
112:
            
document.onhelp=function () { return false; }
            
tecla(0,objE.id,e);    
            break;
        case 
113:
            
tecla(1,objE.id,e);    
            break;
        case 
114:
            
tecla(2,objE.id,e);    
            break;
        case 
115:
            
tecla(3,objE.id,e);    
            break;
        case 
116:
            
tecla(4,objE.id,e);    
            break;
        case 
117:
            
tecla(5,objE.id,e);
            break;
        case 
118:
            
tecla(6,objE.id,e);    
            break;
        case 
119:
            
tecla(7,objE.id,e);
            break;
        case 
120:
            
tecla(8,objE.id,e);
            break;
        case 
121:
            
tecla(9,objE.id,e);
            break;
        case 
122:
            
tecla(10,objE.id,e);
            break;
        case 
123:
            
tecla(11,objE.id,e);
            break;
    }
}

function 
pararPropagacionEvento(e){
    
//e.cancelBubble is supported by IE - this will kill the bubbling process.
    
if (document.all){
        
e.keyCode 0;  //<<< esto ayuda mucho a que funcione bien en iExplorer
        
e.cancelBubble true;
        
e.returnValue false;
        
e.retainFocus true;
    }

    
//e.stopPropagation works in Firefox.
    
if (e.stopPropagation) {
        
e.stopPropagation();
        
e.preventDefault();
    }
    return 
false;
}

function 
tecla(i,idee){
    
pararPropagacionEvento(ee);
    if(
isCtrl){ 
        
top.putClipboard(i,document.getElementById(id).value); 
        
isCtrl=false;
        return 
false;
    }else{
        if (
top.getClipboard(i)){
            
document.getElementById(id).value top.getClipboard(i);
        }
        return 
false;
    }

Un saludo de,
eContento
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
  #10 (permalink)  
Antiguo 22/07/2008, 06:57
Avatar de marcopoloaz06  
Fecha de Ingreso: julio-2007
Ubicación: México
Mensajes: 457
Antigüedad: 16 años, 9 meses
Puntos: 11
Mensaje Respuesta: Propagación de eventos en JavaScript

hola,
ps estiduando
Visual Basic aprendí
una tecnica del switch, muy
buena que es usar condicional. Sintaxis: To
tu switch quedaría masomenos así ......
Código HTML:
function TO(n,c){
    return c ? n : false;
}

switch(e.keyCode){
        case 17:
            isCtrl=true;
            break;
        case 112:
            document.onhelp=function () { return false; }
            tecla(0,objE.id,e);    
            break;
    case TO(e.keyCode,e.keyCode>=113 && e.keyCode<=123):
            tecla(e.keyCode-112,objE.id,e);
            break;
}
bueno
Saludos que te vaya bien
:]
__________________
Aerolíneas Alicia :D
  #11 (permalink)  
Antiguo 22/07/2008, 08:35
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 19 años, 10 meses
Puntos: 25
Respuesta: Propagación de eventos en JavaScript

Muy güeno.

Me lo apunto.


Nunca te acostarás...
... con 5 ó 6 a la vez

un saludo,
eContento
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
  #12 (permalink)  
Antiguo 23/07/2008, 00:23
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 19 años, 10 meses
Puntos: 25
Respuesta: Propagación de eventos en JavaScript

Bueno,

Sigo con que Crtl+F4 en firefox cierra la pestaña.
Estoy parando el burbujeo de eventos con el código anterior, y sin embargo, éste sigue escalando ¿alguien sabe como pararlo?
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
  #13 (permalink)  
Antiguo 24/10/2008, 02:32
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 19 años, 10 meses
Puntos: 25
Respuesta: Propagación de eventos en JavaScript

Cita:
Iniciado por eContento Ver Mensaje
Sigo con que Crtl+F4 en firefox cierra la pestaña
Mira que han pasado meses y no he conseguido solucionar este problema.
Yo creo que es imposible.

Alguien sabe exactamente qué pasa con este evento: ¿quien lo captura primero? ¿el sistema operativo, el navegador, la ventana, mi aplicación?

Un saludo,
eContento
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
  #14 (permalink)  
Antiguo 24/10/2008, 09:20
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Propagación de eventos en JavaScript

Cita:
Iniciado por eContento Ver Mensaje
Alguien sabe exactamente qué pasa con este evento: ¿quien lo captura primero? ¿el sistema operativo, el navegador, la ventana, mi aplicación?
Quisiera ayudarte, pero lo cierto es que no entiendo la utilidad que tendría eso, para mí es un atropello a la voluntad y potestad del usuario de decidir qué hacer .

Y a tener en cuenta que es relativo, las combinaciones de teclas varían según el navegador que estés utilizando (como dijo buzu, prueba con Safari).

Saludos .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #15 (permalink)  
Antiguo 28/10/2008, 01:55
 
Fecha de Ingreso: junio-2004
Mensajes: 621
Antigüedad: 19 años, 10 meses
Puntos: 25
Respuesta: Propagación de eventos en JavaScript

Cita:
Iniciado por David el Grande Ver Mensaje
Quisiera ayudarte, pero lo cierto es que no entiendo la utilidad que tendría eso, para mí es un atropello a la voluntad y potestad del usuario de decidir qué hacer .[...]
Cierto. En una web normal carecería de todo sentido.

Lo cierto es que cobra sentido cuando se ve metido en el contexto adecuado. Esta circustancia se da en el entorno de trabajo de una empresa grande que usa un programa tradicional para realizar su trabajo diario. Muchos de los programas distribuidos que usan los empleados de esta empresa quieren agruparse bajo aplicaciones web, pero a la vez, para no crear quebraderos de cabeza superfluos, quieren que estas aplicaciones web funciones como esos viejos porgramas.

Ese es el contexto en el que me he visto abocado a desarrollar estas funcionalidades. Basicaente se trata de tener 12 portapapeles donde copiar información y sacarla con una sola tecla.

Al tratarse de una aplicación corporativa sólo van a usar determinados navegadores, así que de momento no me importa mucho Safari.

Gracias por la buena voluntad.

Un saludo de,
eContento
__________________
eContento
- Mis artículos y tutoriales
- Mis jsfiddles
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 14:29.