2011-10-18 5 views
6

Как очистить анонимные функции, которые установлены для запуска через вызов 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> 

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

+0

Возможно установить более чем одну функцию '' '' '' '' '' '' ', поэтому я не удивлен, что' '' unbind''' не делает Работа. Хакерным решением было бы установить глобальную переменную и обернуть все внутри '' '' '' '' '' '' '' 'if''', чтобы проверить значение - просто измените значение и пока' '' ready' '' функция все равно будет работать, содержимое не будет ... – JoLoCo

ответ

5

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

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, он думает, что он уже уволил их, чтобы он не делал этого снова.

+0

Я не контролирую код. Я создаю фрагмент javascript, который можно включить на веб-сайт клиента, который заменит часть их содержимого. К сожалению, у них есть обратные вызовы, ожидающие, что часть замененного контента будет там, следовательно, ошибка. Я подумал, могу ли я как-то переопределить их готовые звонки, тогда это решит проблему. –

+0

Wow - вы пытаетесь заблокировать весь код инициализации jQuery.ready. Надеюсь, вы знаете, что делаете, потому что много вещей могут сломаться, если вы это сделаете. Как насчет законного кода инициализации, который нужно запустить? Во всяком случае, я добавил еще один вариант, который можно сделать без изменения кода внутри готового обработчика. Мне кажется, что вы должны позволить регулярному готовому коду и регулярному содержимому страницы работать, а THEN после его выполнения заменяет материал на странице. – jfriend00

+0

Да, я понимаю, как это выглядит страшно, но у нас есть разрешение на это. Я могу немного взломать jquery, но у нас есть другой код, который нужно запустить на doc.ready. Второй пример, похоже, делает именно то, что мне нужно ... хотя кажется противоречащим интуиции - настройка isready на true заставит меня думать, что мы запускаем doc.ready ... –

0

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

+1

Это не тот случай. $ (document) .ready() генерируется jQuery, и есть способы остановить его. – jfriend00

1

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

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

Похоже, ошибка для меня - все остальные события в JQuery могут быть несвязанными. Опущение этого несовместимо.

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

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

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

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

+0

Ницца! Поэтому мне интересно, какая разница между вызовом $ (document) .ready (...) vs. $ (document) .bind («ready», ...). Слишком плохо, что документация unbind говорит, что это влияет только на те обратные вызовы, которые были установлены с помощью вызова bind(). –

+0

@ShaneN - Разница в том, что '.bind (« ready », handler)' handlers не будут вызываться, если событие 'ready' уже запущено. Они также называются последними, после того, как все обработчики связаны более обычным способом. – gilly3

+0

Насколько я могу судить, глядя на источник, обработчики '$ (document) .bind (« ready ») будут вызываться после других готовых обработчиков, и они являются единственными, которые можно удалить с помощью' $ (document) .unbind() '. Вы не можете удалить обработчик '$ (document) .ready()' с unbind, поскольку они хранятся по-разному. – jfriend00

0

Супер старый вопрос, но натолкнулся на необходимость сделать это недавно, чтобы предотвратить код 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)

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