Javascript 如果jQuery';现在还没有

Javascript 如果jQuery';现在还没有,javascript,jquery,compatibility,Javascript,Jquery,Compatibility,我正在为自己编写一个小JavaScript工具,我计划让其他人可以使用它,它使用jQuery。我对这个小实用程序的梦想是让人们能够包含来自远程源的单个.js文件,并且在加载该文件时,让它检查jQuery是否已经包含,如果已经包含,确保它是一个足够新的版本,以便与我的代码所需的操作兼容。一些伪代码可以更清楚地解释我的问题(此代码将出现在我前面提到的单个.js文件的顶部): 我的问题分为三个友好的部分: 是否可以加载两个不同版本的jQuery,而不让它们相互纠缠 我可以在jQuery加载时停止JS代

我正在为自己编写一个小JavaScript工具,我计划让其他人可以使用它,它使用jQuery。我对这个小实用程序的梦想是让人们能够包含来自远程源的单个
.js
文件,并且在加载该文件时,让它检查jQuery是否已经包含,如果已经包含,确保它是一个足够新的版本,以便与我的代码所需的操作兼容。一些伪代码可以更清楚地解释我的问题(此代码将出现在我前面提到的单个
.js
文件的顶部):

我的问题分为三个友好的部分:

  • 是否可以加载两个不同版本的jQuery,而不让它们相互纠缠
  • 我可以在jQuery加载时停止JS代码的执行,然后继续吗
  • 可以像我描述的那样使用noConflict()吗?或者我应该使用jQuery()调用所有内容,而不必为此费心
  • 这里最重要的想法是,任何老用户都可以抓取一小段HTML并将其放入他们的站点/博客/任何东西中,然后让它正常工作™. 由于许多现代发布平台现在都附带了jQuery,我不能静静地假设它没有运行并包含它


    感谢您的时间,如果其中任何部分不清楚,请告诉我,或者我是否可以提供额外的上下文/详细信息,以便您更轻松地提供答复。

    我对无冲突不太了解,因此我只能回答2

    function doMyStuff(jQueryJustForThisFn) {
        // do jQuery stuff!
        jQueryJustForThisFn('div').addClass('wow');
    }
    
    function check() {
        return window.jQuery && jQuery.fn && /^1\.[3-9]/.test(jQuery.fn.jquery);
    }
    
    if ( check() ) {
    
        doMyStuff( jQuery );
    
    } else {
    
        var script = document.createElement('script'),
    
            timer = setInterval(function(){
                if ( check() ) {
                    clearInterval(timer);
                    document.body.removeChild(script);
                    doMyStuff( jQuery.noConflict(true) );
                }
            }, 30);
    
        script.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js';
    
        document.body.insertBefore( script, document.body.firstChild );
    
    }
    

    这通常称为延迟加载。请参见类似的问题以执行此操作

    我没有尝试查看它在已加载的较低版本中的行为,但您可能想查看google.load


    < P>绝对安全,您可能想考虑使用正在使用的jQuery版本的名称空间。这有点难看,但是一个针对代码库的正则表达式来定义您自己的全局连接点将确保您不会破坏任何东西。如果代码将广泛部署在各种站点上,这将是您的最佳选择,并确保将来的兼容性。

    此问题已得到回答

    (function(){
    
        var myBkl = {
                 jq: null,
                 loadScript: function(src) {
                        if(window.jQuery && window.jQuery.fn.jquery == '1.3.2'){
                                return;
                        }
                        var s = document.createElement('script');
                        s.setAttribute('src', src);
                        s.setAttribute('type', 'text/javascript');
                        document.getElementsByTagName('head')[0].appendChild(s); 
                },
                whenLoaded: function(callback){
                        if (typeof(window.jQuery) !== 'undefined' && window.jQuery.fn.jquery == '1.3.2') { 
                                myBkl.jq = window.jQuery.noConflict(true);
                                callback(myBkl.jq); 
                        } 
                        else {
                                setTimeout((function() {myBkl.whenLoaded(callback); }),      
    100);
                        } 
                },
                init: function($){
                        console.log($.fn.jquery);
                        console.log(window.jQuery.fn.jquery);
                }
        };
        myBkl.loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js');
        myBkl.whenLoaded(myBkl.init);
    })();
    

    问题:在
    else
    案例中,
    doMyStuff
    在哪里被调用?因为jQuery现在可以在1.10.2和2.0.3中找到,所以这个正则表达式将不再很好地工作。为了证明这一点,我建议改为:
    /(^1)([3-9]|\d{2,}))|((^[2-9])| ^\d{2,})/
    (function(){
    
        var myBkl = {
                 jq: null,
                 loadScript: function(src) {
                        if(window.jQuery && window.jQuery.fn.jquery == '1.3.2'){
                                return;
                        }
                        var s = document.createElement('script');
                        s.setAttribute('src', src);
                        s.setAttribute('type', 'text/javascript');
                        document.getElementsByTagName('head')[0].appendChild(s); 
                },
                whenLoaded: function(callback){
                        if (typeof(window.jQuery) !== 'undefined' && window.jQuery.fn.jquery == '1.3.2') { 
                                myBkl.jq = window.jQuery.noConflict(true);
                                callback(myBkl.jq); 
                        } 
                        else {
                                setTimeout((function() {myBkl.whenLoaded(callback); }),      
    100);
                        } 
                },
                init: function($){
                        console.log($.fn.jquery);
                        console.log(window.jQuery.fn.jquery);
                }
        };
        myBkl.loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js');
        myBkl.whenLoaded(myBkl.init);
    })();
    
    jQueryCode = function(){
        // your jQuery code
    }
    
    if(window.jQuery)  jQueryCode();
    else{   
        var script = document.createElement('script');   
        script.type = 'text/javascript';
        script.src = "//ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js";
        document.head.appendChild(script);
    
        script.onload = jQueryCode;
    }