为什么我需要加载jquery两次

时间:2016-07-20 20:23:32

标签: javascript jquery backbone.js requirejs underscore.js

在我的html页面中,我需要将jquery放两次。如果我把他们中的任何人带出我的页面,那么页面就不会被渲染。请注意,包含的“jquery”都指向同一位置。

我正在使用backbone.js。我添加了require.js以在页面底部包含jquery。另外,我需要在页面的开头添加jquery。一旦我添加这两个,然后我的整个页面正确呈现。如果我把它们中的任何一个拿走,我就开始遇到问题。

有人可以说明为什么会出现这个问题。

在页面的HEAD标记中添加了脚本:

 <script src="../vendors/jquery/dist/jquery.min.js"></script>

BODY底部添加了脚本:

<script type="text/javascript">
require(['common'],function()
{
  require(['jquery', 'fastclick','nprogress','charts','underscore'],function()
  {
    require(['firstDashboardController']);
  });
});
</script>

如果我把下面页面顶部的jquery包含在我得到的错误中:

enter image description here

如果我从底部的require模块中取出jquery,则下面是错误:

enter image description here

P.S:我正在使用chart.js一个外部文件在页面上绘制图形和内容。

2 个答案:

答案 0 :(得分:1)

jQuery使用全局函数注册自己&#34; $&#34;和&#34; jQuery&#34;,即使与RequireJS一起使用。如果要关闭此行为,则必须调用noConflict函数,您可能需要

define('jquery-require', ['jquery'], function (jq) {
  return jq.noConflict(true);
});

require(['jquery-require'], function(jq) {
  console.log(jq);      // working
  console.log($);       // undefined
  console.log(jQuery);  // undefined
});

答案 1 :(得分:1)

这个问题的一个常见解决方案是使用jQuery的内置$.noConflict(true),但我建议你在底部<script>标记代码中使用以下代码来防止jQuery的双重加载:

requirejs.config({
    paths: {
      jquery: '../vendors/jquery/dist/jquery.min.js'
    }
  });

  if (typeof jQuery === 'function') {
    //jQuery already loaded, just use that
    define('jquery', function() { return jQuery; });
  }

  require(["jquery"], function($) {
   //This $ should be from the first jquery tag, and no
   //double load.
  });

来源:https://github.com/requirejs/requirejs/issues/535

删除一个包含将无效,因为:

  1. 您需要在Bootstrap(1st <script>标签)
  2. 之前加载jQuery
  3. 使用RequireJS加载的模块不能直接使用通过<script src="jQuery.min.js">标签加载的jQuery(底部标记)