Modernizr/yepnope执行命令WRTjQuery+插件故障排除



我今天正在处理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-radiustext-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。结果也是,您可以在完整的函数中安全地使用$()选择,这可能很方便。

最新更新