TypeError: $(...).modal 不是带有引导模式的函数

Posted

技术标签:

【中文标题】TypeError: $(...).modal 不是带有引导模式的函数【英文标题】:TypeError: $(...).modal is not a function with bootstrap Modal 【发布时间】:2015-01-19 18:21:45 【问题描述】:

我有一个引导程序 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 

我该如何解决这个问题?

【问题讨论】:

检查它是否适用于jQuery(...).modal。您的 jQuery 可能处于兼容模式,还要检查 jQuery 是否不包含两次。 在你尝试调用.modal()之前很有可能bootstrap.js没有加载 意思是:试试jQuery('#form-content').modal(); 而不是 $('#form-content').modal();使用 jQuery('#form-content').modal(); 任何像我一样来这里寻求答案的人,看看是不是.modal() 不是model()。这样一个蹩脚的错误。让我筋疲力尽。 :( 【参考方案1】:

我只是想强调一下 mwebber 在评论中所说的话:

还要检查 jQuery 是否没有被包含两次

:)

这是我的问题

【讨论】:

记住:一定要检查 ajax 调用的 jQuery 文件。 当我将较低版本的 jquery 放入 ie8 的条件包含时也发生了。 【参考方案2】:

这个错误实际上是你在调用modal函数之前没有包含bootstrap的javascript的结果。模态是在 bootstrap.js 而不是 jQuery 中定义的。同样重要的是要注意 bootstrap 实际上需要 jQuery 来定义 modal 函数,因此在包含 bootstrap 的 javascript 之前包含 jQuery 是至关重要的。为避免该错误,请确保在调用 modal 函数之前包含 jQuery 和 bootstrap 的 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>

【讨论】:

谢谢@davetw12,帮了大忙 正确答案。 :-)【参考方案3】:

链接你的 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>

【讨论】:

【参考方案4】:

我已经通过像这样使用它来解决这个问题。

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

【讨论】:

【参考方案5】:

检查jquery 库是否不包含在通过Ajax 加载的html 中。删除&lt;script src="~/Scripts/jquery[ver].js"&gt;&lt;/script&gt; 在您的AjaxUpdate/get_modal

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

运行

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

在项目中添加 Angular 项目中的 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 文件的类型字段中包含“jquery”。

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

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

我在 Laravel 中通过修改 resources\assets\js\bootstrap.js 中的以下行解决了这个问题

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

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

【讨论】:

jQuery slim 不包含 modal()。【参考方案10】:

在我的例子中,我使用 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>

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

【讨论】:

【参考方案11】:

对我来说,//= require jquery//= require bootstrap 之后。一旦我在引导之前移动 jquery,一切正常。

【讨论】:

【参考方案12】:

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

以下解决方案有效:

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

您也可以使用 jQuery 生成相同的关闭按钮点击。

希望对您有所帮助。

【讨论】:

【参考方案13】:

我遇到了同样的问题。 改变

$.ajax(...)

jQuery.ajax(...)

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

【讨论】:

【参考方案14】:

我猜你应该在你的按钮中使用

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

应该有 data-target

而不是 href
<a data-toggle="modal" data-target="#form-content"    

请确保模态内容已加载

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

【讨论】:

以上是关于TypeError: $(...).modal 不是带有引导模式的函数的主要内容,如果未能解决你的问题,请参考以下文章

Rails Uncaught TypeError: $(...).modal 不是函数

Bootstrap Uncaught TypeError: $(...).modal 不是函数

TypeError: Observable_1.Observable.fromEvent 不是 ng2-bs3-modal/ng2-bs3-modal 模块中的函数

Bootstrap报错“Uncaught TypeError: $(...).modal is not a function“

实现bootstrap下的模态窗口功能时手动显示和隐藏窗口报错TypeError $(...).modal is not a function

TypeError:无法构造“文本”ReactNative