Подтвердить что ты не робот

TypeError: $(...). Modal не является функцией с bootstrap Modal

У меня есть bootstrap 2.32 modal, который я пытаюсь динамически вставлять в HTML другого представления. Я работаю с Codeigniter 2.1. После Динамически вставляя частичный вид загрузочного модального просмотра в представление, у меня есть:

<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 

Как я могу это исправить?

4b9b3361

Ответ 1

Я просто хочу подчеркнуть, что mwebber сказал в комментарии:

также проверьте, не включен ли jQuery дважды

:)

это была проблема для меня

Ответ 2

Эта ошибка на самом деле является результатом того, что вы не включаете javascript bootstrap перед вызовом функции modal. Модаль определяется в bootstrap.js, а не jQuery. Также важно отметить, что bootstrap действительно нуждается в jQuery для определения функции modal, поэтому очень важно, чтобы вы включили jQuery перед включением javascript для загрузки. Чтобы избежать ошибки, обязательно включите jQuery, затем загрузите javascript перед вызовом функции modal. Обычно я делаю следующее в теге заголовка:

<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>

Ответ 3

После связывания вашего jquery и bootstrap напишите свой код чуть ниже тегов Script jquery и bootstrap.

$(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

Убедитесь, что библиотека jquery не включена в html, загружаемую с помощью Ajax.remove <script src="~/Scripts/jquery[ver].js"></script> в AjaxUpdate/get_modal

Ответ 5

Другая возможность заключается в том, что один из других сценариев, включенных в вашу проблему, вызывает проблему, включая JQuery или конфликтует с $. Попробуйте удалить другие скрипты и посмотреть, исправляет ли они проблему. В моем случае, после нескольких часов ненужного поиска моего одного кода, я удалил скрипты в двоичном шаблоне поиска и сразу же обнаружил оскорбительный script.

Ответ 6

В моем случае я использую rails framework и дважды требую jQuery. Я думаю, что это возможная причина.

Вы можете сначала проверить файл app/assets/application.js. Если появятся jquery и bootstrap-sprockets, тогда нет необходимости в необходимости второй библиотеки. Файл должен быть похож на этот:

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

Затем проверьте приложение /views/layouts/application.html.erb и удалите script для запроса jquery. Например:

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

Я думаю, что иногда, когда новички используют несколько примеров кода для учебников, это вызовет эту проблему.

Ответ 7

По моему опыту, скорее всего, это произошло с конфликтами jquery (с использованием нескольких версий), для устранения проблемы мы можем использовать метод без конфликтов, как показано ниже.

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

Ответ 8

Я решил эту проблему в Laravel, изменив строку ниже в resources\assets\js\bootstrap.js

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

в

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

Ответ 9

У меня была такая же проблема. Изменение

$.ajax(...)

to

jQuery.ajax(...)

не работает. Но потом я обнаружил, что jQuery был включен дважды, и удаление одного из них устранило проблему.

Ответ 10

Бежать

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

в проекте, чтобы добавить типы 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, включите "jquery" в поле типов файла tsconfig.app.json.

Это удалит все ошибки 'modal' и '$' в вашем Angular проекте.

Ответ 11

Я решил эту проблему в ответ, используя его следующим образом.

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

Ответ 12

Для меня у меня было //= require jquery после //= require bootstrap. Как только я переместил jquery до начальной загрузки, все заработало.

Ответ 13

Я думаю, вы должны использовать в своей кнопке

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

вместо href должна быть цель данных

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

просто убедитесь, что модальное содержимое уже загружено

Я думаю, проблема заключается в том, что отображение модальности вызывается дважды, одно в ajax-вызове, которое отлично работает, вы сказали, что модальное изображение показано правильно, но ошибка, вероятно, связана с действием init на этой кнопке, которое должно обрабатывать модальное, это действие не может выполняться, потому что модальное значение не загружается в это время.