Bootstrap - 未捕获的类型错误: 无法读取未定义属性'fn'

73

我在公司的项目中使用jQuery、Backbone.js、Underscore.js和Bootstrap。有时在Chrome中会遇到以下错误:

Uncaught TypeError: Cannot read property 'fn' of undefined

我的main.js文件中的shim代码如下:

require.config({
paths: {
    jquery: 'libs/jquery/jquery',
    underscore: 'libs/underscore/underscore',
    backbone: 'libs/backbone/backbone',
    backboneeventbinder: 'libs/backbone.eventbinder.min',
    bootstrap: 'libs/bootstrap',
    jquerytablesorter: 'libs/tablesorter/jquery.tablesorter',
    tablesorter: 'libs/tablesorter/tables',
    ajaxupload: 'libs/ajax-upload',
    templates: '../templates'
},
shim: {
    'backbone': {
        deps: ['underscore', 'jquery'],
        exports: 'Backbone'
    },
    'underscore': {
        exports: '_'
    },
}
});
 require(['app', ], function(App) {
  App.initialize();
});

我已经为jquery、underscorejs和backbonejs插入了.noConflict()。

我的app.js

// Filename: app.js
define(['jquery', 'underscore', 'backbone', 'backboneeventbinder', 'bootstrap', 'ajaxupload', 'router', // Request router.js
], function($, _, Backbone, Bootstrap, Backboneeventbinder, Ajaxupload, Router) {
    $.noConflict();
    _.noConflict();
    Backbone.noConflict();
    var initialize = function() {
            Router.initialize();
        };
    return {
        initialize: initialize
    };
});

这是我在Chrome浏览器中的屏幕截图 输入图片描述

它有点类似于Bootstrap。

非常感谢您的提前帮助。


如何使用'noConflict'? - Nurdin
这个答案也许会有用。 - chridam
10个回答

159
您需要先加载jQuery再加载Bootstrap。
require.config({
    paths: {
        jquery: 'libs/jquery/jquery',
        underscore: 'libs/underscore/underscore',
        backbone: 'libs/backbone/backbone',
        bootstrap: 'libs/bootstrap',
        jquerytablesorter: 'libs/tablesorter/jquery.tablesorter',
        tablesorter: 'libs/tablesorter/tables',
        ajaxupload: 'libs/ajax-upload',
        templates: '../templates'
    },
    shim: {
        'backbone': {
            deps: ['underscore', 'jquery'],
            exports: 'Backbone'
        },
        'jquery': {
            exports: '$'
        },
        'bootstrap': {
            deps: ['jquery'],
            exports: '$'
        },
        'jquerytablesorter': {
            deps: ['jquery'],
            exports: '$'
        },
        'tablesorter': {
            deps: ['jquery'],
            exports: '$'
        },
        'ajaxupload': {
            deps: ['jquery'],
            exports: '$'
        },
        'underscore': {
            exports: '_'
        },
    }
});
require(['app', ], function(App) {
    App.initialize();
});

效果像魔法一样!快速简便的修复。


5
确实需要先加载 jQuery :D - Fiido93
如果你想在不使用jQuery的情况下使用Bootstrap,你仍然可以这样做。Bootstrap 5不再需要jQuery。 - undefined

10
为了解决这个问题,只需在引用Bootstrap文件之前调用jQuery文件。

10

我的方法是引入jQuery库。

<script
  src="https://code.jquery.com/jquery-3.3.1.js"
  integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60="
  crossorigin="anonymous"></script>

9

解决Angular中的此问题

"styles": [
              "src/styles.css",
              "node_modules/bootstrap/dist/css/bootstrap.min.css"
            ],
            "scripts": [
              "node_modules/jquery/dist/jquery.min.js",
              "node_modules/bootstrap/dist/js/bootstrap.min.js"
            ]

4

在引入Bootstrap前先引入jQuery:

<script src="js/jquery.min.js"></script>
<script src="js/bootstrap.js"></script>
<script src="js/bootstrap.bundle.js"></script>

2
//Call .noConflict() to restore JQuery reference.

jQuery.noConflict(); OR  $.noConflict();

//Do something with jQuery.

jQuery( "div.class" ).hide(); OR $( "div.class" ).show();

你应该在引入jQuery后立即指定何时调用noConflict()。http://api.jquery.com/jQuery.noConflict/ - Salvatorelab

2

即使首先添加了jQuery,我仍然遇到了同样的问题,但是通过首先同步添加jQuery(删除异步标签),然后再添加bootstrap来解决它。

注意:我在我的jQuery标签中添加了async以异步加载它,但遇到了这个错误,所以我做了如下更改:

<script async src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
   integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
   crossorigin="anonymous"></script>
<script async src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
   integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
   crossorigin="anonymous"></script>
<script async src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
   integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
   crossorigin="anonymous"></script>

致:

<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
    integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
    crossorigin="anonymous"></script>
<script async src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
    integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
    crossorigin="anonymous"></script>
<script async src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
    integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
    crossorigin="anonymous"></script>

现在我的jquery是同步加载的,一切都很好。

1

我回到了jquery-2.2.4.min.js,现在它可以工作。


0

我曾经遇到过同样的问题。Firefox 显示了这个错误,但在 Chrome 中一切正常。 然后通过谷歌搜索,在 index.html 中使用了谷歌 CDN 的 jQuery 而不是加载本地 JS 文件,问题得到了解决。


0

我曾经遇到过同样的问题。在我的情况下,我将所有3个链接更改为其他版本的bootstrap,并解决了这个错误。我将4.5更改为4.6。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接