2011-10-28 17 views
6

Szukam utworzyć niestandardowe wydarzenie w HTML, JS.Zdarzenie niestandardowe w języku HTML, Javascript

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

Jak mogę utworzyć taki? "oncustombind" jest zdarzeniem niestandardowym, które chcę utworzyć. Powinienem móc wywołać funkcję/kod zdefiniowany w atrybucie oncustombind. Ponadto, muszę przekazać niektóre dane do obiektu zdarzenia.

Nie chcę używać żadnych bibliotek, takich jak jquery, YUI.

Każda pomoc będzie głęboko doceniona.

+2

Jako wbudowany javascript w HTML jest wielkim, brudnym hackerem. Nie rób tego. – Raynos

+0

Od czasu opublikowania pytania czasy się zmieniły. Obecnie komponenty sieciowe stają się realnym sposobem na zastąpienie frameworka js. Uwzględnienie niestandardowych zdarzeń może być naprawdę przydatne do pisania kodu, który można łatwo odczytać (podobnie jak kątowe/reagowanie). Jedną z niezłych sztuczek jest udostępnienie kontekstu 'this' komponentu WWW za pomocą elementu chidlren dom za pomocą' Object.assign'. W ten sposób dowolny wybrany element Dom może mieć dostęp do metod zdefiniowanych w klasie komponentów WWW. Byłoby jeszcze ładniej mieć dostęp do niestandardowych zdarzeń z wbudowanych niestandardowych programów obsługi zdarzeń. –

Odpowiedz

9

chcesz CustomEvent

Powinny być łatwe do pracy ale wsparcie przeglądarki jest biedny. Jednak DOM-shim powinien to naprawić.

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

Złą praktyką jest używanie new Function i with, ale można to osiągnąć w następujący sposób: 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); 
} 

z następującymi HTML:

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

następnie wywołać zdarzenie jak:

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

@Raynos: Co byś użył, aby 'window',' document', 'event' i' e' były w zasięgu? Nie ma lepszego sposobu niż 'with' ... – pimvdb

+0

w zakresie czego? 'window',' document', 'elem' i' e' są już w zasięgu. – Raynos

+0

@Raynos: W atrybutach zdarzeń HTML możesz automatycznie uzyskać atrybuty i funkcje "dokumentu", np. 'getElementById' bez poprzedzającego' document'. – pimvdb

Powiązane problemy