2011-10-28 15 views
6

Estoy buscando crear un evento personalizado en HTML, JS.Evento personalizado en HTML, Javascript

<input type="text" oncustombind="foo(event);" /> 

¿Cómo puedo crear uno? 'oncustombind' es el evento personalizado que quiero crear. Debería poder llamar a la función/código definido en el atributo oncustombind. Además, necesito pasar algunos datos al objeto del evento.

No quiero utilizar ninguna biblioteca como jquery, YUI.

Cualquier ayuda sería muy apreciada.

+2

Como un aparte en línea javascript en HTML es un gran truco sucio. No lo hagas – Raynos

+0

Desde que se publicó la pregunta, los tiempos han cambiado. Actualmente, los componentes web se están convirtiendo en una forma viable de reemplazar los marcos js. Tener eventos personalizados en línea sería realmente útil para escribir código que se pueda leer fácilmente (similar a angular/reaccionar). Un buen truco es compartir el contexto 'this' del componente web con el elemento chidlren dom usando' Object.assign'. De esta forma, cualquier elemento Dom seleccionado puede tener acceso a métodos definidos en la clase de componentes web. Sería aún más agradable tener acceso a eventos personalizados de los controladores de eventos personalizados en línea. –

Respuesta

9

¿Quieres una CustomEvent

Deben ser fáciles de trabajar, pero el apoyo del navegador es pobre. Sin embargo, el DOM-shim debería arreglar eso.

var ev = new CustomEvent("someString"); 
var el = document.getElementById("someElement"); 
el.addEventListener("someString", function (ev) { 
    // should work 
}); 
el.dispatchEvent(ev); 
4

Es una mala práctica usar new Function y with, pero esto se puede lograr de la siguiente manera: http://jsfiddle.net/pimvdb/72GwE/13/.

function trigger(elem, name, e) { 
    var func = new Function('e', 

     'with(document) {' 
    + 'with(this) {' 
    + elem.getAttribute('on' + name) 
    + '}' 
    + '}'); 

    func.call(elem, e); 
} 

con el siguiente HTML:

<input type="text" oncustombind="console.log(e, type, getElementById);" id="x"> 

después dispare el evento como:

trigger(document.getElementById('x'), 'custombind', {foo: 123}); 
+1

@Raynos: ¿Qué usarías para que 'window',' document', 'event' y' e' estuvieran en el alcance? No hay mejor manera que 'con' ... – pimvdb

+0

en el alcance de qué? 'window',' document', 'elem' y' e' ya están dentro del alcance. – Raynos

+0

@Raynos: en los atributos de eventos HTML, puede obtener los atributos y las funciones de 'documento' automáticamente, p. 'getElementById' sin' document' antepuesto. – pimvdb

Cuestiones relacionadas