2016-04-09 1 views
0

Так что я очень новичок в JavaScript, и я знаю, что у него нет действительно параллельных потоков. Но если вы представляете, что обратный вызов ajax должен быть в своем собственном потоке и что обратный вызов рисует некоторые кнопки на экране, а затем вызывает функцию wire_up_buttons(), которая устанавливает обратные вызовы для событий кликов на всех доступных кнопках. Это хороший стиль для вызова этой функции из основного потока (т.е. исполнения, которое началось с $(document).ready(callback)?Хороший стиль JavaScript для вызова функции из основного потока и обратного вызова

Если это считается плохим стилем, то как бы вы рекомендовали мне изменить мой код?

+0

Неплохо и плохо. Это зависит от того, что вы делаете в блоке команд. – Hydro

ответ

5

Это не вопрос стиль. Если вы звоните wire_up_buttons из $(document).ready(callback) перед вашими отделок Аякса вызова, кнопки не будет там, и они не будут подключены до. (Предполагается, что wire_up_buttons крюки события на кнопки непосредственно.)

у вас есть два правильных варианты:

  1. Звоните wire_up_buttons с ajax Успешный обработчик после рендеринга новых кнопок.

  2. сделать wire_up_buttons использование делегирования событий на контейнере все кнопки в, в этом случае вызова его из ready обработчика (если вы хотите использовать один), вероятно, будет лучше всего сделать.

делегация событий, где вы на самом деле подключить событие на элемент, который является предком элемент из кнопок, в идеале какой-то довольно локализованным контейнер, но вы можете использовать document или document.body (так как они предки все элементы контента на странице). Дефрагментация событий поддерживается обработчиком jQuery on; его documentation содержит больше информации.


Боковые ноты:

  • "Я знаю, что [JavaScript] не имеет действительно параллельных потоков" Это окружающая среда предмет, нет язык предмет. Браузеры обеспечивают поистине параллельные потоки для JavaScript через web workers; они обеспечивают единый поток UI, но потенциально несколько не-UI потоков. JavaScript, язык, по сути, молчал по теме потоков. Сообщения о том, что JavaScript являются однопоточными, являются общими, но неверными.

  • ready в значительной степени не нужен в коде, где вы контролируете, куда идут теги script. Если вы это сделаете, просто поместите свои теги script в конец HTML, непосредственно перед закрывающим тегом </body>, и в этом случае нет необходимости в ready. Подробнее в YUI Best Practices for Speeding Up your Website.

+0

Спасибо за ваш ответ! На данный момент моя функция «wire_up_buttons» просто подключает кнопки к «идентификаторам» кнопок, полученным из обратного вызова ajax. А затем регистрирует обратные вызовы на этих кнопках. Он также выполняет другие действия, такие как регистрация обратных вызовов на других кнопках.Не могли бы вы объяснить делегацию событий в этом контексте? – Curious

+0

Я не думаю, что мой вопрос был достаточно ясным. Я вызываю функцию 'wire_up_buttons()' перед запросом ajax и в обратном вызове. Так что всегда будет что-то – Curious