TypeError:$(...)。modal不是一个带有bootstrap Modal的函数

时间:2014-11-21 14:57:38

标签: javascript jquery css twitter-bootstrap twitter-bootstrap-2

我有一个bootstrap 2.32模式,我试图动态插入到另一个视图的HTML中。我正在使用Codeigniter 2.1。在Dynamically inserting a bootstrap modal partial view into a view之后,我有:

<div id="modal_target"></div>

作为插入的目标div。我的视图中有一个按钮,如下所示:

     <a href="#message" class="btn btn-large btn-info" data-action="Message" data-toggle="tab">Message</a>

我的JS有:

$.ajax({
    type    : 'POST', 
    url     : "AjaxUpdate/get_modal",
    cache   : false,
    success : function(data){ 
       if(data){
            $('#modal_target').html(data);

            //This shows the modal
            $('#form-content').modal();
       }
    }
});

主视图的按钮是:

<div id="thanks"><p><a data-toggle="modal" href="#form-content" class="btn btn-primary btn-large">Modal powers, activate!</a></p></div>

以下是我想单独存储的部分视图:

<div id="form-content" class="modal hide fade in" style="display: none;">
    <div class="modal-header">
        <a class="close" data-dismiss="modal">×</a>
        <h3>Send me a message</h3>
    </div>
    <div class="modal-body">
        <form class="contact" name="contact">
             <fieldset>

               <!-- Form Name -->

            <legend>modalForm</legend>

            <!-- Text input-->
            <div class="control-group">
              <label class="control-label" for="user">User</label>
              <div class="controls">
                <input id="user" name="user" type="text" placeholder="User" class="input-xlarge" required="">
                <p class="help-block">help</p>
              </div>
            </div>

            <!-- Text input-->
            <div class="control-group">
              <label class="control-label" for="old">Old password</label>
              <div class="controls">
                <input id="old" name="old" type="text" placeholder="placeholder" class="input-xlarge">
                <p class="help-block">help</p>
              </div>
            </div>

            <!-- Text input-->
            <div class="control-group">
              <label class="control-label" for="new">New password</label>
              <div class="controls">
                <input id="new" name="new" type="text" placeholder="placeholder" class="input-xlarge">
                <p class="help-block">help</p>
              </div>
            </div>

            <!-- Text input-->
            <div class="control-group">
              <label class="control-label" for="repeat">Repeat new password</label>
              <div class="controls">
                <input id="repeat" name="repeat" type="text" placeholder="placeholder" class="input-xlarge">
                <p class="help-block">help</p>
              </div>
            </div>



                </fieldset>
        </form>
    </div>


    <div class="modal-footer">
        <input class="btn btn-success" type="submit" value="Send!" id="submit">
        <a href="#" class="btn" data-dismiss="modal">Nah.</a>
    </div>
</div>

单击按钮时,模式正确插入,但出现以下错误:

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

我该如何解决这个问题?

14 个答案:

答案 0 :(得分:138)

我只想强调评论中 mwebber 所说的内容:

  

还要检查jQuery是否包含两次

:)

这对我来说是个问题

答案 1 :(得分:59)

此错误实际上是在调用modal函数之前不包含bootstrap的javascript的结果。 Modal在bootstrap.js中定义,而不是jQuery。同样重要的是要注意bootstrap实际上需要jQuery来定义modal函数,因此在包含bootstrap的javascript之前包含jQuery是至关重要的。为了避免错误,只需确保在调用modal函数之前包含jQuery然后引导程序的javascript。我通常在标题标签中执行以下操作:

<header>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script src="/path/to/bootstrap/js/bootstrap.min.js"></script>
</header>

答案 2 :(得分:26)

在连接你的jquery和bootstrap之后,将你的代码写在jquery和bootstrap的Script标签下面。

$(document).ready(function($) {
  $("#div").on("click", "a", function(event) {
    event.preventDefault();
    jQuery.noConflict();
    $('#myModal').modal('show');

  });
});
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<!-- Latest compiled JavaScript -->
<script src="http://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

答案 3 :(得分:5)

检查jquery

中通过Ajax。删除<script src="~/Scripts/jquery[ver].js"></script>加载的html中未包含的AjaxUpdate/get_modal

答案 4 :(得分:5)

另一种可能性是你的其他脚本之一通过包括JQuery或与$冲突导致问题。尝试删除其他包含的脚本,看看它是否解决了问题。就我而言,经过几个小时不必要地搜索我的一个代码,我以二进制搜索模式删除了脚本并立即发现了违规脚本。

答案 5 :(得分:1)

就我而言,我使用rails框架并需要两次jQuery。我认为这是一个可能的原因。

您可以先检查app / assets / application.js文件。如果出现jquery和bootstrap-sprockets,则不需要第二个库。该文件应类似于:

//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require bootstrap-sprockets
//= require_tree .

然后检查app / views / layouts / application.html.erb,并删除需要jquery的脚本。例如:

    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>

我认为有时新手使用多个教程代码示例会导致此问题。

答案 6 :(得分:1)

我通过修改resources\assets\js\bootstrap.js

中的下一行来解决Laravel中的这个问题
window.$ = window.jQuery = require('jquery/dist/jquery.slim');

window.$ = window.jQuery = require('jquery/dist/jquery');

答案 7 :(得分:0)

我有同样的问题。 改变

$.ajax(...)

jQuery.ajax(...)

没用。但后来我发现 jQuery被包含两次并删除其中一个修复了问题。

答案 8 :(得分:0)

根据我的经验,很可能它发生在jquery版本(使用多个版本)冲突中,为了解决问题,我们可以使用如下所示的无冲突方法。

jQuery.noConflict();
(function( $ ) {
  $(function() {
    // More code using $ as alias to jQuery
    $('button').click(function(){
        $('#modalID').modal('show');
    });
  });
})(jQuery);

答案 9 :(得分:0)

运行

npm i @types/jquery
npm install -D @types/bootstrap
在项目中

在Angular Project中添加jquery类型。 之后,包括

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中,紧接在正文结束标记之前。

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

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

答案 10 :(得分:0)

我已经通过使用这种方法解决了这个问题。

window.$('#modal-id').modal();

答案 11 :(得分:0)

对我来说,我在//= require jquery之后有//= require bootstrap。一旦我将jquery移到引导程序之前,一切都会正常工作。

答案 12 :(得分:0)

在我的react.js应用程序中其他答案对我不起作用,因此我为此使用了纯JavaScript。

以下解决方案有效:

  1. 为模式/对话框的关闭部分提供ID(在下面的示例中为“ myModalClose”)
<span>
   className="close cursor-pointer"
   data-dismiss="modal"
   aria-label="Close"
                     id="myModalClose"
>
...
  1. 使用该ID为上方的关闭按钮生成click事件:
   document.getElementById("myModalClose").click();

可能还可以使用jQuery在关闭按钮上产生相同的点击。

希望有帮助。

答案 13 :(得分:-1)

我猜您应该在按钮中使用

<a data-toggle="modal" href="#form-content"    

而不是href应该有数据目标

<a data-toggle="modal" data-target="#form-content"    

确定,已经加载了模态内容

我认为问题是,显示模态被调用两次,一次在ajax调用中,工作正常,你说模态显示正确,但是错误可能伴随着对该按钮的init动作,应该处理模态,这个动作不能执行,因为当时没有加载模态。