Yepnope и функция "Proxy" jQuery's ready () - PullRequest
1 голос
/ 25 марта 2011

Я (очень) медленно обновляю сайт со статическими файлами со всеми последними вкусностями. Я использую yepnope (в комплекте с новым Modernizr.load) для обработки асинхронной загрузки зависимостей, и мне нужно, чтобы он тем временем был обратно совместим с текущей базой кода.

Для этого требуется, чтобы я или обернул каждый отдельный вызов jQuery по всему миру (слишком большая задача, которую можно выполнить в ближайшем будущем) в оболочке yepnope(), или , тем более творческим решением является proxy функция jQuery ready() через мою собственную, и для задержки выполнения любого кода $ до тех пор, пока обратный вызов из yepnope не будет готов ... Фактическая функция ready() jQuery будет обработчиком, как только тест yepnope будет выполнен доволен JQuery готов. Имеет смысл?

Текущий вопрос:

Я создаю катастрофу здесь? Это подходящий обходной путь для моего краткосрочный выпуск плохо реализован беспорядок спагетти DOM-ориентированный код?

обновление # 3

Более продуманный подход, который учитывает также неготовность, когда анонимная функция просто передается прямо в jQuery. Это третья попытка сделать как можно меньше, чтобы сохранить только функциональность вызовов $(function(){}), а также вызовов $(document).ready().

    (function( window, undefined ) {
    var jQuery = (function(fn) {
    if (typeof fn === 'function') {
        yepnope({
            test: window.jQuery.length,
            complete: function() {
                fn();
            }
        });
    }
    var jQuery = 
        _jQuery = window.jQuery,
        _$ = window.$;
    jQuery = jQuery.prototype = {
        constructor: jQuery,
        ready: function( fn ) {
            yepnope({
                test: window.jQuery.length,
                complete: function() {
                    fn();
                }
            });
        }
    };
    return jQuery;
    });
    window.jQuery = window.$ = jQuery;
    })(window);

Это довольно сексуально, потому что, хотя оно дублирует загрузочное поведение jQuery, оно по своей природе не имеет длины ... используя yepnope для проверки на window.jQuery.length, оно вернет true только после REAL jQuery загружен (у прокси нет length)!

Я искренне ищу любую критику, особенно от Алекса Секстона :) lol

1 Ответ

5 голосов
/ 21 июля 2011

Пытался использовать пример philwinkle, он не работает (по крайней мере, в результате переменная temp jQuery имела .length prop в FF3.6).

Некоторое время гуглил и обнаружил jQl, асинхронныйЗагрузчик jQuery , в котором есть способ справиться с $ (document). Уже вызван до фактической загрузки jQuery.Заимствовал какой-то код и получил:

<script type="text/javascript">
var jQ = {
    queue: [],
    ready: function (f) {
        if (typeof f=='function') {
            jQ.queue.push(f);
        }
        return jQ;
    },
    unq: function () {
        for (var i = 0; i < jQ.queue.length; i++) jQ.queue[i]();
        jQ.queue = null;
    }
};
if (typeof window.jQuery == 'undefined') { window.jQuery = window.$ = jQ.ready; }

yepnope({
    load: '//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js',
    complete: function () {
        jQ.unq();
    }
});
</script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...