引导程序模式:不是函数


108

我的页面上有一个模式。当我尝试在Windows加载时调用它时,它会向控制台输出一条错误消息,内容为:

$(...).modal is not a function

这是我的模态HTML:

<div class="modal fade" id="prizePopup" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-dialog">
    <div class="modal-content">
        <div class="modal-header">
            <button type="button" class="close" data-dismiss="modal" aria-hidden="true">
                &times;
            </button>
            <h4 class="modal-title" id="myModalLabel">
                This Modal title
            </h4>
        </div>
        <div class="modal-body">
            Add some text here
        </div>
        <div class="modal-footer">
            <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
            <button type="button" class="btn btn-primary">
                Submit changes
            </button>
        </div>
    </div>
</div>

<script type="text/javascript" src="js/bootstrap.js"></script>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>

这是我的JavaScript,可以在加载窗口时运行它:

<script type="text/javascript">
$(window).load(function() {
    $('#prizePopup').modal('show');
});
</script>

我该如何解决这个问题?


1
在窗口就绪功能中编写模态触发代码
yugi 2014年

“ $(window).load(function(){”救了我
khaled_webdev

1
通过两次定义JQuery实例,问题将会出现。<script src =“ // code.jquery.com/jquery-1.11.0.min.js”> </ script>
pragadeesh

Answers:


168

您在脚本顺序中遇到问题。按以下顺序加载它们:

<!-- jQuery -->
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<!-- BS JavaScript -->
<script type="text/javascript" src="js/bootstrap.js"></script>
<!-- Have fun using Bootstrap JS -->
<script type="text/javascript">
$(window).load(function() {
    $('#prizePopup').modal('show');
});
</script>

为什么这个?因为Bootstrap JS依赖于jQuery

插件依赖

一些插件和CSS组件依赖于其他插件。如果您单独包含插件,请确保在文档中检查这些依赖项。另请注意,所有插件都依赖jQuery(这意味着jQuery必须在插件文件之前包含jQuery)。


2
当我尝试使用Google开发工具运行模式时,我仍然遇到此问题。
编码容器

@CodedContainer确保$是jQuery函数。最有可能是Google Chrome开发者工具公开的querySelector函数(名为$)。
尼卡比曹

72

如果在您的代码中多次声明了jQuery,也可能会显示此警告。第二个jQuery声明阻止bootstrap.js正常工作。

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/bootstrap.js"></script>
...
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>

感谢这一点,我遇到了这个问题,发现我自己的DataTable.min.js已将jquery库导入其中,但是我的页面再次导入了它,这是导致它的根本原因。
Alter Hu

很好的提示,我在Aurelia中安装了jquery npm,并手动将其加载到index.html中。谢谢!
IngoB

在一个运行Im的大型框架中,使用了可怕的设置,jQuery在某些页面中加载,而在另一些页面中:几次敲打我的头后,去这里阅读@Nurp答案。拯救了我的一天。
Nineoclick

问题是我正在使用依赖于较旧jquery版本的应用程序,并且不允许我进行更改,并且稍后会在某个阶段将其导入!我使用了最新版本的jquery,然后使用bootstrap js,导致了所有问题!
heman123 '17

那也是我的问题。我从angular.js的脚本部分中删除了jquery,还从Typescript中删除了“ import * as $ from'jquery'”,一切正常。
詹斯·曼德

15

问题是由于拥有jQuery实例不止一次。如果您使用许多具有jQuery多重实例的文件,请当心。只需保留jQuery的1个实例,您的代码即可使用。

<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>

14

jQuery应该是第一个:

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/bootstrap.js"></script>

14

TypeError的原因:$(…).modal不是函数:

  1. 脚本加载顺序错误。
  2. 多个jQuery实例

解决方案:

  1. 如果脚本试图访问尚未到达的元素,那么您将得到一个错误。Bootstrap依赖于jQuery,因此必须首先引用jQuery。因此,必须先调用jquery.min.js,再调用bootstrap.min.js,然后再启动bootstrap Modal错误实际上是由于在调用模态函数之前不包括bootstrap的javascript导致的。模态是在bootstrap.js中定义的,而不是在jQuery中定义的。因此,应该以这种方式包括脚本

       <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> 
       <script type="text/javascript" src="js/bootstrap.js"></script>
  2. 如果有多个jQuery实例,则第二个jQuery声明会阻止bootstrap.js正常工作。因此,请jQuery.noConflict();在调用模式弹出窗口之前使用

    jQuery.noConflict();
    $('#prizePopup').modal('show');

    jQuery事件别名(例如).load.unload或者.error从jQuery 1.8开始不推荐使用。

    $(window).on('load', function(){ 
          $('#prizePopup').modal('show');
    });

    或者尝试直接打开模式弹出窗口

    $('#prizePopup').on('shown.bs.modal', function () {
          ...
    });

谢谢,在我的情况下,我正在加载两个jQuery实例。
Sanjay Achar


5

更改导入声明有效。从

import * as $ from 'jquery';

至:

declare var $ : any;

4

npm i @types/jquery
npm install -D @types/bootstrap

在项目中添加jQuery类型到您的Angular项目中。之后包括

import * as $ from "jquery";
import * as bootstrap from "bootstrap";

在您的app.module.ts中

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

在您的index.html中,紧接在body结束标记之前。

并且如果您正在运行Angular 2-7 ,则在tsconfig.app.json文件的types字段中包括“ jquery ”。

这将删除Angular项目中的所有'modal'和'$'错误。





0

我参加聚会有点晚了,但是有一个重要的注意事项:

您的脚本的顺序可能正确,但是请注意async脚本标记中的所有s(像这样)

<script type="text/javascript" src="js/bootstrap.js" async></script>

这可能是导致问题的原因。特别是如果您async仅在生产环境中设置了此设置,则可能会因此而感到沮丧。


在问题的代码清楚地表明,(a)中它们不是以正确的顺序和(b)它们没有使用异步属性
昆廷

1
我给出我的答案,因为这是一个经常被搜索的问题,可能有人会从中受益
Martin Shishkov

0

努力解决这一问题,检查了加载顺序,以及是否通过捆绑将jQuery包含两次,但这似乎不是原因。

最后通过进行以下更改来修复它:

(之前):

$('#myModal').modal('hide');

(后):

window.$('#myModal').modal('hide');

在这里找到答案:https//github.com/ColorlibHQ/AdminLTE/issues/685


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.