2012-10-05 10 views
8

Me gustaría ejecutar una función js al presionar el botón Enter. Todo funciona muy bien en IE, Chrome y Opera, pero me sale un error (se explica a continuación) en Safari.'undefined' no es una función que evalúa el.click() en Safari

Necesito una solución pura de Javascript, no jQuery.

Ésta es la función :

function pressSearch(e) { 
    if (typeof e == 'undefined' && window.event) { 
     e = window.event; 
    } 
    var charCode = (e.which) ? e.which : 
        ((e.charCode) ? e.charCode : 
        ((e.keyCode) ? e.keyCode : 0)); 
    if (charCode == 13) { 
     document.getElementById('enterSearch').click(); 
    } 
} 

Ésta es la HTML:

<input type="text" id="searchKey" onkeypress="pressSearch(event)"> 
<div id="enterSearch">Search</div> // This is the "button" 

consigo este error :

// Safari 
TypeError: 'undefined' is not a function 
    (evaluating 'getElementById('enterSearch').click()') 

¿Qué estoy haciendo mal?

EDIT: He solucionado el error de Mozilla Firefox.

+0

He copiado y pegado el código en Firefox , pero no obtuvo ningún error ... ¿Puedes proporcionar una [demostración en vivo] (http://jsfiddle.net)? – Dennis

+1

Subí solo por la línea "No quiero jQuery". –

Respuesta

18

Si echa un vistazo a HTML DOM Level 2 Specification, la función click() solo se define para HTMLInputElement, por lo que, aunque no es muy fácil de usar, Safari no necesita implementar eso.

La forma correcta para activar un evento para los navegadores modernos está en DOM Level 3 Events:

// First create an event 
var click_ev = document.createEvent("MouseEvents"); 
// initialize the event 
click_ev.initEvent("click", true /* bubble */, true /* cancelable */); 
// trigger the event 
document.getElementById("someElement").dispatchEvent(click_ev); 

Aquí está jsFiddle que funciona en Chrome, Safari, Firefox y IE9: http://jsfiddle.net/y5yW9/6/

+0

He intentado este creatEvent pero no funciona para IE8 como mencionas. Pero qué otra opción si tengo que ejecutar este evento para IE8 o cualquier otra opción. Porque estoy atrapado en esta situación. Gracias si me das respuesta –

0

getElementById('enterSearch')

debería ser document.getElementById('enterSearch')

+0

Me lo perdí al reescribir el código aquí – Hypn0tizeR

+0

mi código real tiene 'document.blabla' en él y no funciona – Hypn0tizeR

2

Estás desencadenar un evento click en un div cual tendría ningún controlador de clic implícita.

1

Un elemento div no tiene un controlador de eventos de clic definido de manera predeterminada. Por lo tanto, primero debe aplicar un evento de clic para el div de enterSearch, p. <div id="enterSearch" onclick="submitSearch()">Search</div>. De lo contrario, no se podrá hacer clic en el botón.

para ejecutar un evento de programación, utilice este constructo:

function pressSearch(e) { 
    if (typeof e == 'undefined' && window.event) { 
     e = window.event; 
    } 

    var charCode = (e.which) ? e.which : ((e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode : 0)); 
    if (charCode == 13) { 
     var a = document.getElementById('enterSearch'); 

     if (typeof a.onclick == "function") { 
      a.onclick.apply(a); // binds the scope of onclick to a 
     } 
    } 
} 

no podía validar este para IE, pero funciona con Safari.

+0

Esto no funcionará con los controladores de eventos agregados a través de 'addEventListener'. – lqc

+0

Pero addEventListener ni siquiera funcionará para IE. Por lo tanto, recomendé el "viejo" estilo de moda si es posible. O, como alternativa, se debe insertar un conmutador IE-Others para enlazar eventos mediante programación. – DEAD10CC

+0

Ok, cuando se usa el enlace de eventos programáticamente parece que la solución de Daedalus es la más genérica. Úselo. – DEAD10CC

3

Safari está tratando .click() como undefined como .click() no existe para Safari. (Retiro eso; .click() me funciona. No sé entonces /) Me encontré con este mismo problema mientras trabajaba en a similar problem. Lo que se me ocurrió, después de un poco de investigación y tal, es la siguiente para desencadenar eventos de clic en Safari (así como otros navegadores, por supuesto):

var t = document.getElementById('someidhere'); 
if (document.dispatchEvent) { 
    var o = document.createEvent('MouseEvents'); 
    o.initMouseEvent('click', true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, t); 
    t.dispatchEvent(o) 
} else if (document.fireEvent) { 
    t.fireEvent('onclick'); 
} else if (t.click()) { 
    t.click() 
} 

no sé si esto va a funcionar para su lado de Firefox, dado que según @Dennis, su código ya funciona para Firefox. Sin un entorno para realmente probar esto, estoy disparando en la oscuridad. Espero que te sirva

+0

¿Quiso decir si (t.click()) o si (t.click)? –

+0

@PaulBrannan Probablemente quise decir 't.click', sin embargo, esta publicación tiene alrededor de 4 años, por lo que su edición podría salir a la superficie, lo cual no es correcto para algo tan poco importante. – Daedalus

Cuestiones relacionadas