Как определить, работает ли jQuery на странице (даже если jQuery - / после / сценарий обнаружения) - PullRequest
9 голосов
/ 04 марта 2011

Я работаю над do-папой, который может быть встроен в страницу, как видео на YouTube.Для конкретного эффекта, который мне нужен, нужен jQuery.

Я хочу загрузить jQuery при условии, что что-то на странице еще не добавило jQuery.

Я тестировал

if (typeof($)=='function'){...

, но это работает, только если jQuery загружен и работает к тому времени, когда страница попадает в мой скрипт.Поскольку в наши дни передовой практикой является встраивание ваших сценариев в нижний колонтитул, мой код для встраивания, вероятно, в любом случае больше никогда не увидит jQuery.

Я думал о проведении теста onready вместо onload, нофункция onready находится внутри jQuery.(Полагаю, я мог бы использовать автономный сценарий? Есть ли хороший?)

Наконец, я хотя и тестировал jQuery после задержки, но в лучшем случае это выглядит не элегантно, а в худшем - ненадежно.

Есть мысли?

Ответы [ 3 ]

8 голосов
/ 04 марта 2011

Учитывая ваши ограничения, я вижу только два варианта:

  1. Использование window.load событие:

    (function() {
        if (window.addEventListener) {
            // Standard
            window.addEventListener('load', jQueryCheck, false);
        }
        else if (window.attachEvent) {
            // Microsoft
            window.attachEvent('onload', jQueryCheck);
        }
        function jQueryCheck() {
            if (typeof jQuery === "undefined") {
                // No one's loaded it; either load it or do without
            }
        }
    })();
    

    window.load происходит очень в конце цикла загрузки, однако, после того, как все изображения и такие загружены.

  2. Использовать тайм-аут.Хорошая новость заключается в том, что время ожидания может быть довольно коротким.

    (function() {
        var counter = 0;
    
        doDetect();
        function doDetect() {
            if (typeof jQuery !== "undefined") {
                // ...jQuery has been loaded
            }
            else if (++counter < 5) { // 5 or whatever
                setTimeout(doDetect, 10);
            }
            else {
                // Time out (and either load it or don't)
            }
        }
    })();
    

    Вам нужно будет настроиться, чтобы выбрать наилучшие значения для счетчика и интервала.Но если jQuery не загружается даже в первом или втором цикле, я предполагаю (не проверено), что он не будет загружен ... если кто-то другой не делает то, что вы делаете.: -)

2 голосов
/ 04 марта 2011

Вы можете использовать window.onload.Это срабатывает после domReady, поэтому jQuery наверняка будет загружен к этому моменту.

И проверьте на jQuery, а не $.Иногда люди используют jQuery с другими библиотеками и используют $ для чего-то другого.

Однако, ИМХО, я не думаю, что это большая проблема, если jQuery загружается дважды.

1 голос
/ 04 марта 2011

Я использую этот код для того, чтобы делать то же самое некоторое время. Он также проверяет минимальную версию jQuery (в нашем случае мы все еще используем 1.4.2) перед загрузкой:

/* Checks if JQuery is loaded... if not, load it. */
/* Remember to update minimum version number when updating the main jquery.min.js file. */

if (typeof jQuery != 'undefined') {
    /* jQuery is already loaded... verify minimum version number of 1.4.2 and reload newer if needed */
    if (/1\.(0|1|2|3|4)\.(0|1)/.test(jQuery.fn.jquery) || /^1.1/.test(jQuery.fn.jquery) || /^1.2/.test(jQuery.fn.jquery)|| /^1.3/.test(jQuery.fn.jquery)) {
        loadJQ();
    }
} else {
    loadJQ();
}

/* loads jQuery if not already loaded, or if not a recent enough version */
function loadJQ() {
    /* adds a link to jQuery to the head, instead of inline, so it validates */ 
    var headElement = document.getElementsByTagName("head")[0];
    linkElement=document.createElement("script");
    linkElement.src="../scripts/lib/jquery.min.js";
    linkElement.type="text/javascript";
    headElement.appendChild(linkElement);
}
...