Очистка вызова jquery document.ready()

Как очистить анонимные функции, которые настроены на запуск через вызов jQuery document.ready()?

Например:

<script type="text/javascript">
    //some code sets a doc ready callback
    $(document).ready(function ()
    {
        alert('ready');
    });
    
    //my attempt to prevent the callback from happening
    window.onload = null;
    $(document).unbind("ready");
    
</script>

Предупреждение происходит независимо от моих попыток обойти его. Есть какой-либо способ сделать это?


person Shane N    schedule 18.10.2011    source источник
comment
Можно установить более одной функции ready, поэтому я не удивлен, что unbind не работает. Хитрым решением было бы установить глобальную переменную и обернуть все внутри функции ready в if для проверки значения - просто измените значение, и хотя функция ready все еще будет работать, ее содержимое не будет...   -  person JoLoCo    schedule 19.10.2011


Ответы (4)


Вы, вероятно, получите наиболее подходящий ответ, если опишите, какую проблему вы действительно пытаетесь решить.

jQuery не имеет публично задокументированного способа отмены или блокировки обработчиков document.ready(). Если вы управляете кодом, вы можете использовать глобальную переменную и такое условное выражение:

var skipReady = false;
$(document).ready(function ()
{
    if (!skipReady) {
        alert('ready');
    }
});

// skip the document.ready code, if it hasn't already fired
skipReady = true;

Или, если вы хотите немного взломать jQuery (помимо задокументированных интерфейсов), вы можете сделать это:

$(document).ready(function() {
    alert("ready");
});

// stop the ready handler
$.isReady = true;

Вы можете увидеть эту последнюю работу здесь: http://jsfiddle.net/jfriend00/ZjH2k/. Это работает, потому что jQuery использует свойство: $.isReady, чтобы отслеживать, были ли уже запущены готовые обработчики или нет. Установка его в true заставляет его думать, что он уже уволил их, поэтому он не будет делать это снова.

person jfriend00    schedule 18.10.2011
comment
Я не контролирую код. Я создаю фрагмент javascript, который можно включить на веб-сайт клиента, который заменит часть их контента. К сожалению, у них есть обратные вызовы, которые ожидают, что часть замененного контента будет там, следовательно, ошибка. Я подумал, что если бы я мог каким-то образом переопределить их вызовы готовности документа, то это решило бы проблему. - person Shane N; 19.10.2011
comment
Вау, вы пытаетесь заблокировать весь код инициализации jQuery.ready. Я надеюсь, вы знаете, что делаете, потому что многие вещи могут сломаться, если вы это сделаете. Как насчет законного кода инициализации, который необходимо запустить? Во всяком случае, я добавил еще один вариант, который можно сделать без изменения кода внутри готового обработчика. Мне кажется, что вы должны позволить обычному готовому коду и обычному содержимому страницы запускаться, а ТОГДА, после его выполнения, вы заменяете материал на странице. - person jfriend00; 19.10.2011
comment
Да, я понимаю, как это выглядит пугающе, но у нас есть на это разрешение. Я открыт для того, чтобы немного взломать jquery, но у нас есть другой код, который нужно запускать на doc.ready. Второй пример, кажется, делает именно то, что мне нужно... хотя это кажется нелогичным - установка isready на true заставит меня думать, что мы запускаем doc.ready... - person Shane N; 19.10.2011
comment
Если вы посмотрите на исходный код jQuery, то увидите, что isReady — это просто флаг, который он использует для отслеживания того, запускались ли уже готовые обработчики или нет, чтобы никогда не запускать их более одного раза. Это не вызывает его. Он делает это, потому что есть несколько событий, которые могут вызвать его, и он хочет перейти только к первому сработавшему событию. - person jfriend00; 19.10.2011
comment
Идеально — $.isReady — это именно то, что мне было нужно. Я знаю, что это немного хакерски, но я бы предпочел хакерское решение, которое не выводит ошибок, чем «законное» решение, которое терпит неудачу. - person Shane N; 19.10.2011
comment
Существует общедоступный документированный способ отложить выполнение функций, привязанных к $(document).ready(fn), с помощью $.holdReady(bool). Передайте true, чтобы заставить их ждать, затем передайте false, чтобы позволить им стрелять. Добавлено в jQuery 1.6 — api.jquery.com/jQuery.holdReady - person Russ Cam; 19.10.2011
comment
Спасибо, Расс, это потрясающая функция! - person Design by Adrian; 11.06.2012

Это работает:

$(document).bind("ready", function () { alert("hey!"); });
$(document).unbind("ready");

Мне кажется ошибкой - все остальные события в jQuery могут быть несвязанными. Пропустить это несовместимо.

Не прямой ответ об упущении, но вот некоторая связанная информация из документов jQuery:

Все три следующих синтаксиса эквивалентны:

  • $(document).ready(handler)
  • $().ready(handler) (это не рекомендуется)
  • $(handler)

Есть еще $(document).bind("ready", handler). Он ведет себя аналогично методу готовности, но с одним исключением: если событие готовности уже сработало, и вы пытаетесь .bind("ready") выполнить связанный обработчик. Готовые обработчики, связанные таким образом, выполняются после любого, связанного тремя другими вышеизложенными методами.

person gilly3    schedule 18.10.2011
comment
Хороший! Поэтому мне интересно, в чем разница между вызовом $(document).ready(...) и $(document).bind(ready,...). Жаль, что в документации по unbind говорится, что это влияет только на те обратные вызовы, которые были установлены с помощью вызова bind(). - person Shane N; 19.10.2011
comment
@ShaneN - разница в том, что обработчики .bind("ready", handler) не будут вызываться, если событие ready уже запущено. Они также называются последними после любых обработчиков, связанных более распространенным способом. - person gilly3; 19.10.2011
comment
Насколько я могу судить из исходного кода, обработчики $(document).bind("ready") будут вызываться после других готовых обработчиков, и только их можно удалить с помощью $(document).unbind(). Вы не можете удалить обработчик $(document).ready() с помощью unbind, так как они хранятся по-разному. - person jfriend00; 19.10.2011

$(document).ready() зависит от события onLoad, которое запускается браузером, что означает, что вы не можете предотвратить его возникновение. Если alert() определяется каким-то условием, я бы использовал оператор if/else, чтобы решить, вызывается ли он.

person Justin Lucas    schedule 18.10.2011
comment
Это не тот случай. $(document).ready() генерируется jQuery, и есть способы предотвратить это. - person jfriend00; 19.10.2011

Супер старый вопрос, но недавно столкнулся с необходимостью сделать это, чтобы предотвратить запуск кода document.ready, который я не контролировал в определенных случаях. Это может быть достигнуто путем проксирования готовой функции jQuery, как тестового шпиона. Будет работать следующее:

var ready = $.prototype.ready;

// proxy the ready function
$.prototype.ready = function ( fn, allowed ) {
    allowed = allowed || false;

    if ( allowed ) {
        ready.call( this, fn );
    }
};

Все вызовы $( document ).ready теперь будут игнорироваться. Вы можете переопределить это поведение, передав true в качестве второго аргумента: $( document ).ready( fn, true )

person baseten    schedule 21.03.2017