Пытаюсь (возможно, напрасно), чтобы придумать способ использовать шаблон публикации-подписки, а а) использованием нет библиотек и б) минимизируя шаблонный код в модулях, которые используют его. До сих пор лучшее, что я придумал это:Есть ли способ реализовать EventTarget с простым JS?
var handle = document.createElement();
var unsubscribe = AwesomeModule.subscribe(handle);
handle.addEventListener('awesome', function() {
console.log('awesome');
});
Это будет работать очень хорошо, за исключением того, что люди, использующие AwesomeModule могут быть сбиты с толку того, чтобы обеспечить случайный элемент DOM, который не используется в качестве элемента ,
Я попытался следующие, и он не работает слишком хорошо:
var handle = Object.create(EventTarget);
var unsubscribe = AwesomeModule.subscribe(handle);
handle.addEventListener('awesome', function(){
console.log('awesome')
});
я TypeError: Object [object Object] has no method 'addEventListener'
. Интересно, что в цепочке прототипов, похоже, нет, хотя дескриптор имеет EventTarget в качестве своего прототипа.
Почему это не работает? Есть ли способ реализации EventTarget с чистым JS? Можно ли это сделать в одной строке кода, которая не будет ужасать пользователей AwesomeModule?
EDIT: Я не знаю, почему это не произошло со мной прошлой ночью, но я полагаю, что EventTarget является интерфейсом, что он не имеет реализованного кода. Что вводит в заблуждение, так это то, что в консоли отладчика Chrome Object.create(EventTarget)
создает объект, который появляется, чтобы addEventListener in был прототипом цепочки. Возможно, его ложь. Может ли кто-нибудь объяснить это поведение? Может ли кто-нибудь объяснить, почему W3 решил не делать EventTarget конкретным «классом»?
addEventListener не поддерживается в Internet Explorer 6, 7, и я думаю, что вам нужно использовать attachEvent. Для функции библиотеки, которая поддерживает оба варианта, вы можете использовать один из них: // --- http://ejohn.org/projects/flexible-javascript-events/ – jeff
@MattBall Его основная часть браузера JS: https: // developer.mozilla.org/en-US/docs/Web/API/EventTarget. – acbabis
@jeff Я сейчас не заинтересован в совместимости с браузером. У меня проблема с Chrome. – acbabis