2013-07-26 6 views
2

С $(document).ready(); вы можете выполнить его после того, как dom будет готов, но он все равно будет гореть.jQuery триггер перед слушателем

Как я могу заставить пользовательский триггер вести себя одинаково?

т.е.

$(document).trigger("myEvent"); 

Как страница загружается (до MyEvent), я мог бы ленивая нагрузку сценарий, сделать некоторый Ajax, и когда Ajax завершена (теперь, возможно, после MyEvent), я бы поместить слушатель в обратный вызов Ajax, чтобы убедиться, что MyEvent, как случилось, прежде чем я перейду (как вы могли бы сделать с $ (документ) .ready())

$(document).on("myEvent", function(){ ... }); 

Но очевидно, что это не сработает, потому что она была вызвана, прежде чем слушатель был на месте.

+1

Вам нужно что-то вроде '.when()'? Http: //api.jquery.com/jQuery.when/ –

+0

Я не уверен, что понимаю, что вы ищете, вы хотите вызвать событие как только как событие связано или раньше? Если это раньше, для меня не имеет большого смысла. Не могли бы вы рассказать нам, что должно делать ваше мероприятие? Кстати, вы можете проверить источник jquery, как это делается для готового события «псевдо», используя отложенный объект readyList. –

+0

@ Cԃ ա ԃ Использование Отсрочки имеет смысл. – Fergal

ответ

0

Событие триггера до Обязательно, конечно, не имеет никакого эффекта.

Вы должны активировать его только после присоединения к нему какого-либо обработчика, иначе ничего не будет произведено. Что касается готового события, jQuery использует отложенный объект для этого объекта «readyList». Но я уверен, что он просто слишком большой для того, что вы ищете, и в любом случае это все еще срабатывает в зависимости от других событий, DOMContentLoaded или onreadystatechange или загрузки объекта окна или разрешается вручную с использованием тайм-аута, если эти события уже выполнены.

Так почему бы не вызвать событие, когда вы связали его, классический способ:

$(document).on("myEvent", function(){ /**/ }).trigger('myEvent'); 

Если по какой-то причине вы хотите выстрелил в конкретном случае и, по Obscur причин вы не можете изменить АЯКС метода обратного вызова проверить наличие некоторых условий, вы можете все еще использовать обработчик ajaxStop(), что-то вроде этого:

$(document).ajaxStop(function() { 
    if ($._data(document, 'events').myEvent) { 
     $(this).trigger('myEvent').off('ajaxStop'); //off() could be removed, depending your needs 
    } 
}); 

DEMO

Если вы хотите использовать тыс Интерфейс е обещание возвращенный АЯКС метод, использовать что-то вроде этого:

$.when($.get('myajax')).done(function(){$(document).trigger('myEvent')}); 

Но на самом деле, вы не говорите нам достаточно того, что вы ищете, может быть, ваша логика не удается где-то еще и лучший подход должен быть возможно ИМО.

Смежные вопросы