我今天正在处理Modernzr polyfill加载,遇到了一些麻烦。我喜欢并行加载jQuery的想法,因此将CDN URI(带有本地回退)放在顶部。然后我开始加载一些polyfill,它们都是我在发现Modernizr之前使用的jQuery插件。
问题是,插件更小,而且在jQuery完成和导出之前加载,所以"$"one_answers"jQuery"对象最终都是未定义的。yepnope文档说,尽管并行下载,加载程序应该尊重依赖脚本的执行顺序,但严格遵循示例语法仍然会产生错误。
你们能看看我下面的代码,看看我想要什么吗?这个片段直接位于Modernizer最小化代码下面;它位于我的CCD_ 1中。仅供参考,在我的<body>
的底部也加载了一系列效果jQuery代码,但我希望在为它们设置"complete:"函数之前,polyfill能够工作。
Modernizr.load([
{
load: '//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js',
complete: function () {
if (!window.jQuery)
Modernizr.load('js/jquery.1.7.1.min.js');
}
},
{//Border Radius
test : Modernizr.borderradius,
nope : 'js/polyfills/jquery.curvycorners.js'
},
{//Text Shadow
test: Modernizr.textshadow,
nope: 'js/polyfills/jquery.textshadow.min.js',
complete: function(){
$(function(){
$("h2").textShadow();
$("h3").textShadow();
$("a.facebook").textShadow();
$("a.twitter").textShadow();
});
}
},
{//Box Shadow
test: Modernizr.boxshadow,
nope: 'js/polyfills/jquery.boxshadow.js'
}
]);
经过大量的研究和实验,这似乎是yepnope在概念层面上的一个问题。由于jQuery的加载时间线,插件总是在它准备好之前就开始寻找它。虽然jQuery测试的完整函数中的嵌套load()是破解它的一种方法,但用户会在相当长的时间内看到没有polyfill的页面。虽然这可能适用于表单验证,但当您像本例中那样对border-radius
和text-shadow
进行聚合填充时,它看起来就像FOUC一样糟糕。
我发现的最好的解决方案是通过HTML5样板文件方法加载jQuery:
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.js"></script>
<script>window.jQuery || document.write('<script src="js/libs/jquery-1.7.1.min.js">x3C/script>')</script>
然后在$(document).ready();
中放置一个Modernizr.load()
。虽然这抵消了Modernizr的大部分并行负载优化优势,但它保持了yepnope渐进增强原则,允许您使用Moderniz进行HTML5填充(这只是整洁的IMHO),并确保jQuery绝对可用于polyfill。结果也是,您可以在完整的函数中安全地使用$()
选择,这可能很方便。