Javascript 如何处理未捕获的TypeError:$(…)。加载两个jquery文件时,popover不是一个函数?

Javascript 如何处理未捕获的TypeError:$(…)。加载两个jquery文件时,popover不是一个函数?,javascript,jquery,twitter-bootstrap,Javascript,Jquery,Twitter Bootstrap,通用场景 <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script> <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css"> <script ty

通用场景

  <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
  <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  <script type="text/javascript" src="https://code.jquery.com/jquery-1.7.2.min.js"></script>.

.
这将抛出未捕获的TypeError:$(…)。popover不是函数

我的场景

  <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.0.min.js"></script>
  <link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
  <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
  <script type="text/javascript" src="https://code.jquery.com/jquery-1.7.2.min.js"></script>.
我有一个使用其他应用程序的应用程序,它被其他应用程序使用

即A=“我的应用程序”

A通过在应用A中添加应用B的脚本文件来消耗B(角度应用)

A由C通过调用api消耗

  • 我在应用程序A中有jquery和引导。应用程序C可以使用jquery和bootstrap作为可选选项发出请求
  • 应用程序A使用应用程序B,其中应用程序B正在使用另一个非可选的jquery。当我在HTML中添加脚本时,应用程序B运行良好
  • 但是当我懒散地加载应用程序B脚本时,会动态地导致未捕获 TypeError:$(…)。popover不是函数。因为应用程序Bjquery是在引导后加载的
  • 尝试的解决方案:

  • 应用程序A中使用jquery.noConflict。当使用惰性加载添加应用程序B时,效果良好
  • 应用程序C使用应用程序A时会出现问题。它抛出的$不是他们应用程序中的函数
  • 面临的问题:
    我不能要求应用程序B应用程序C团队更改代码。我如何处理这个问题?

    我以前也遇到过类似的问题,这是我的解决方案:

    var j = jQuery.noConflict();
    
    // Do something with jQuery
    j( "div p" ).hide();
    
    // Do something with another library's $()
    $( "content" ).style.display = "none";
    

    如果你能发布代码,这会有所帮助。我不确定我是否完全理解了所有内容。

    封装您的函数。这样,在封装函数的作用域中,$对象将始终是jQuery的同一版本,并且定义了相同的插件

    当您跳出您的范围时(正如我在我的示例中使用doStuff时所做的那样),事情默认为全局对象,并且出于所有意图和目的,您已经丢失了对旧jquery对象的引用

    如果您想在两个jquery对象上都加载插件,我建议在第二个jquery加载后,通过$.getScript()重新加载插件脚本。这不会导致额外的开销,因为浏览器将缓存这些文件

    通过这种方式,您可以在一个页面上同时拥有多个版本的jquery、angular或其他任何变量,每个版本都在它自己的范围内,它完全不知道$、jquery或其他变量的状态:-)

    这样做的好处是,您可以确定脚本加载的时间。将特定的库集合编译在一起,因为getScript有一个回调函数,它会告诉您它们何时完成。 完成所有脚本后,触发一个函数来执行其余代码,传递相关对象等

    这样,您总是知道对象拥有什么,并且可以做什么:-)

    (函数($){
    $(document.body).append(“”);
    $.getScript(“https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js“,函数(){
    doStuff();
    });
    log(“封装的JQuery版本”,$.fn.JQuery);
    })(jQuery)
    函数doStuff(){
    log(“jqueryversionglobal”,$.fn.JQuery);
    }
    img{宽度:100%;高度:100%;}

    你能给我们看一下你的代码吗?它分散在几个地方,可以执行现在你已经声明了var j=jQuery.noConflict();在你的应用程序中。如果有人在他们的代码中使用你的应用程序,它将抛出$不是函数