Yepnope和"Proxy" - jQuery的ready()函数

phi*_*kle 1 javascript jquery asynchronous

我(非常)慢慢地获得了一个大型的静态文件站点,最新的所有最新好东西.我使用yepnope(与新的Modernizr.load打包)来处理异步依赖加载,同时我需要它与当前代码库向后兼容.

这要求我要么在yepnope()包装器中整个站点范围内的每个jQuery调用(在不久的将来要完成的任务太大),或者更有创意的解决方案是通过我自己的代理 jQuery的ready()功能,并延迟执行任何$代码,直到来自yepnope的回调准备好了...... ready()一旦yepnope测试满足jQuery的准备,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);
Run Code Online (Sandbox Code Playgroud)

这很性感,因为虽然它复制了jQuery的加载行为,但它没有长度,本质上......通过使用yepnope进行测试window.jQuery.length,它只会trueREAL jQuery加载后返回(代理没有a length)!

我真诚地寻求任何批评 - 特别是来自Alex Sexton :) lol

ska*_*rus 5

尝试使用philwinkle的例子,它不起作用(至少得到的temp jQuery变量在FF3.6中有.length prop).

谷歌搜索了一段时间,找到了jQl,异步jQuery加载器,它有一种方法来处理实际jQuery加载之前调用的$(document).ready.借了一些代码并得到:

<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>
Run Code Online (Sandbox Code Playgroud)