Как создать пользовательское событие в javascript, которое отслеживает массив?

Я вижу другие вопросы о том, как создавать настраиваемые события, но я не понимаю, как отслеживать конкретные настраиваемые условия.

В моем примере мне нужно «прислушаться» к тому, что в массиве не было x элементов, а стало y элементов.

Я не уверен, что создание прототипа поверх Array - хорошая идея, хотя в идеале это то, что мне нужно.

Однако более широкий вопрос заключается в том, какова методология написания пользовательских слушателей, которые фактически являются аналогом -pseudo-

onClockStruckTwo или onDomChanged или onRapture

Это означает, что вместо того, чтобы ждать, пока произойдет какое-то другое предопределенное событие onEvent (onclick, onkeydown и т. Д.), Я хочу создать свой собственный.

И, пожалуйста, никаких ответов Framework. Я пытаюсь понять, как это на самом деле работает в собственном javascript.

TIA


person Yevgeny Simkin    schedule 28.08.2012    source источник
comment
Чистым (с точки зрения дизайна приложения) решением было бы создание собственного хранилища поверх массива.   -  person zerkms    schedule 28.08.2012
comment
@zerkms, не понимаю, что вы имеете в виду.   -  person Yevgeny Simkin    schedule 28.08.2012
comment
not-jquery просто сделал мне день.   -  person Fabrício Matté    schedule 28.08.2012
comment
stackoverflow.com/questions/2449182/   -  person Joseph Silber    schedule 28.08.2012
comment
@ FabrícioMatté ... Спасибо! Я действительно сделал свой день, создав этот тег! Немного удивлен, что его еще не было (без обид, любители jQuery).   -  person Yevgeny Simkin    schedule 28.08.2012
comment
@ Доктор Дредель: Я имею в виду, что чистое решение - заменить массив собственным классом и наблюдать за его модификациями.   -  person zerkms    schedule 28.08.2012
comment
@zerkms, но вся суть в том, чтобы иметь общее onCondition, которое я могу повторно использовать из одного проекта в другой. Или вы говорите о тонком объекте обертывания массива, который выполняет только одну дополнительную вещь? И просто использовать это вместо Array в будущем?   -  person Yevgeny Simkin    schedule 28.08.2012
comment
@ Доктор Дредел: ага. Это нормальная практика, когда вы используете делегирование в случае, когда вам нужно добавить некоторые дополнительные функции к какому-либо базовому классу / типу.   -  person zerkms    schedule 28.08.2012
comment
Как еще никто не создавал этот тег! Новое любимое дело.   -  person Hamish    schedule 28.08.2012
comment
no- теги недопустимы в SO.   -  person Charles    schedule 28.08.2012
comment
Кто-то тогда должен будет назвать это ожогом. :(   -  person Fabrício Matté    schedule 28.08.2012
comment
да ладно ... думаю, мне придется рискнуть :)   -  person Yevgeny Simkin    schedule 28.08.2012


Ответы (2)


Я задаю вам вопрос: "Что вы слушаете из?" Если вы слушаете изменение на сервере, вы можете setTimeout вызов AJAX, но это далеко не рекомендуется. Если вы строго хотите изменить длину элемента, тогда должно быть что-то еще, что, как вы знаете, вызовет событие. Я говорю, что если это не связано с сервером, вообще не «слушайте», просто прикрепите желаемый код Javascript к концу того, что, как вы знаете, вызовет изменение события.

ИЗМЕНИТЬ

Вот список всех типов событий Javascript. Я не вижу упоминаний о том, что объект DOM пуст. Вы можете SOL сделать это так, как хотите.

person cereallarceny    schedule 28.08.2012
comment
ну, в частности, я прислушиваюсь к тому, что массив, который я использую, чтобы узнать, что серия асинхронных задач завершена, стал пустым (что будет означать, что эта работа выполнена). Есть объект массива, который содержит набор функций с обратными вызовами. Я * мог бы написать кучу обременительного пользовательского кода, чтобы видеть, когда срабатывает обратный вызов каждого члена массива, и удалять его, но я бы предпочел просто установить прослушиватель, когда массив перешел из числа членов в пустой и прикрепить что-то к этому . - person Yevgeny Simkin; 28.08.2012
comment
Понятно ... так что нет никакого способа заставить систему прислушиваться к какой-то нестандартной возможности. Если я хочу написать свое собственное событие onClockStrikesTwo, я должен написать что-то, что находится с интервалом, смотрит на часы и отправляет уведомление при достижении определенного условия или в случае массива, мне нужно убедиться, что все соответствующие массивы нажимаются и проходят через меня, чтобы заметить, что пора отправить событие? - person Yevgeny Simkin; 28.08.2012
comment
Единственное, что я предлагаю иначе, - это просто запустить функцию на setTimeout функции Javascript. Насколько мне известно, не существует типа события, который позволил бы вам проверить пустоту объекта DOM. Я признаю, что идея кажется отличной: возможно, вам стоит предложить ее Mozilla: bugzilla.mozilla.org - person cereallarceny; 28.08.2012

В массивах нет какой-либо системы уведомления о событиях для изменений в javascript. Итак, если вы хотите узнать, когда был изменен массив, вам придется создать свою собственную систему уведомлений.

Поскольку вы не хотите использовать какие-либо фреймворки (многие из которых предлагают уведомления о событиях и запускают события), вам придется создать свои собственные.

Существует несколько различных подходов к системам событий (сообщения через общий обратный вызов сообщения, индивидуальные обратные вызовы для каждого события, объектно-ориентированные подходы любого из них и т. Д.

Самый простой (не обязательно самый элегантный) - это заставить объект, который создает событие, поддерживать список обратных вызовов для этого события. Затем, когда заинтересованная сторона хочет зарегистрироваться для участия в событии, они вызывают метод и передают ему событие и обратный вызов. Это похоже на то, как addEventListener работает в DOM браузера для событий DOM. Получатель этого вызова метода затем сохраняет обратный вызов в массиве обратных вызовов. Некоторое время спустя, когда происходит фактическое событие, каждый обратный вызов, зарегистрированный для этого события, вызывается по очереди.

Поскольку модификации массива сами по себе не вызывают события, вам придется реализовать функцию, которая как изменяет массив, так и сигнализирует о событии.

person jfriend00    schedule 28.08.2012