7

我已经看到指导或询问如何从 Zepto 回退到 jQuery(尤其是 IE)的页面,如SO上的此处和Zepto.js 官方页面上的此处。
我还看到了有关如何从 Google 托管的 jQuery 回退到本地站点 jQuery 的示例,例如Modernizr.load doc page

我的问题是,我如何把这两个东西放在一起?也可能不使用 Modernizr.load,只使用适当的<script>块?

这是我想出的,但似乎 IE 从未找到 Google 托管的版本。另外,我不确定Zepto = jQuery作业是否正常。

<script>
    document.write('<script src=' +
        ('__proto__' in {} ? 
            'js/vendor/zepto.min' : 
            'https://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min') +
        '.js><\/script>');
</script>
<script>
    if (window.jQuery) { 
        window.Zepto = window.jQuery; /* let jQuery alias Zepto */ 
    }
    else
    { /* here jQuery could be rightly undefined because Zepto is loaded, 
         so this could be wrong. */
        document.write('<script src=' +
            'js/vendor/jquery-1.8.0.min' +
            '.js><\/script>');
    }
</script>
<script>
    if (window.jQuery) { 
        window.Zepto = window.jQuery; /* let jQuery alias Zepto */ 
    }
    else
    {
        /* same problem as before */
        console.error('Zepto nor jQuery available!');
    }
</script>

有没有更好的办法?助教

编辑

在@Ashfame 回答之后,这就是我用过的:

<!-- Load local Zepto.js or (as a fallback) jQuery from Google CDN or (as a fallback) local jQuery -->
<script>
    document.write('<script src="' + ('__proto__' in {} ? 
        'js/vendor/zepto' : 
        'http://ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery') + 
        '.min.js"><\/script>')
</script>
<script>
    window.Zepto || window.jQuery || document.write('<script src="js/vendor/jquery-1.8.0.min.js"><\/script>');
</script>

我无法使用 Google CDN 的无协议/无方案 URL,因为由于某种原因它在我的本地 IE9 上不起作用(它等待了很多,然后总是回退到本地)。

我不再Zepto使用jQuery: 别名了,只是$在 JS 代码中使用。

我似乎没有遇到任何与 jQuery 乱序加载 wrt 依赖代码相关的问题。

4

1 回答 1

6

为了尝试这种技术,我会先试试这个:

我按照 jQuery CDN 关闭时 HTML5 Boilerplate 如何加载本地回退的方式快速编写了这篇文章。

这可能行不通,但我看不出它现在不应该的任何理由。想试一试吗?

<script>document.write('<script src="' + ('__proto__' in {} ? 'cdn/zepto.min' :  'cdn/jquery.min') + '.js">\x3Cscript>');</script>
<script>window.Zepto || window.jQuery || document.write('<script src="cdn/jquery.min.js">\x3C/script>')</script>
<script>window.Zepto || window.jQuery || document.write('<script src="local/jquery.min.js">\x3C/script>')</script>

唯一不能很好处理的情况是,当用户使用不兼容 Zepto 的浏览器(如 IE 和同时 jQuery CDN 关闭时),它会尝试再次加载 jQuery CDN,然后最终回退到本地jQuery的副本。


但实际上,如果我要实现这一点,我只会有 1 个单一的后备到本地。就像尝试检查我们是否可以加载 Zepto 或 jQuery,并且在下一步中,如果它们都没有加载,则加载本地库。最好有一些工作到位,而不是试图优化不会带来那么多收益的东西。明智地优化!上述技术#1 很可能有自己的跨浏览器兼容性问题。


我刚刚发现了这个问题,即使这种技术(被 HTML5 Boilerplate & Modernizr 使用和推荐)也不可靠。检查这个问题 - document.write fallback 导致 jQuery 无序加载

该问题的另一个解决方案是关于图书馆 Yepnope。您可以检查它是如何工作的 - https://stackoverflow.com/a/12323328/551713

最后,我要结束这个答案,除非你正在构建完全是你的代码的东西,比如不会因为用户在页面上添加更多东西的可能性而陷入困境,否则不要太为它烦恼,因为您将很快遇到此类技术的问题,因为其他脚本可能会乱序加载并导致问题,而如果它是您的所有代码,您可能可以根据您的后备逻辑使所有内容加载和工作。

于 2012-11-30T20:10:17.507 回答