Изчистване на извикване на 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. Надявам се, че знаете какво правите, защото много неща могат да се счупят, ако го направите. Какво ще кажете за легитимния init код, който трябва да се изпълнява? Както и да е, добавих още една опция, която може да бъде направена без промяна на кода в готовия манипулатор. Струва ми се, че трябва да оставите обикновения готов код и редовното съдържание на страницата да се изпълняват и СЛЕД това, след като се изпълни, заменяте нещата в страницата. - 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,...). Жалко, че документацията за развързване казва, че засяга само онези обратни извиквания, които са зададени чрез извикване на 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