我(非常)慢慢地获得了一个大型的静态文件站点,以及最新的所有好东西。我使用yepnope(与新的Modernizr.load打包)来处理异步依赖加载,同时我需要它与当前代码库向后兼容。
这需要我在yepnope()
的包装器,或中包裹整个站点范围内的每个jQuery调用(在不久的将来要完成的任务太大)更具创造性的解决方案是通过我自己的代理 jQuery的ready()
函数,并延迟任何$
代码的执行,直到来自yepnope的回调准备好... jQuery的实际ready()
一旦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
)!
我恳切地寻求任何批评 - 特别是来自Alex Sexton :) lol
答案 0 :(得分:5)
尝试使用philwinkle的例子,它不起作用(至少得到的temp jQuery变量在FF3.6中有.length prop)。
用Google搜索了一段时间后找到jQl, asynchronous jQuery loader,它有办法在实际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>