Ответ 1
Я просто хочу подчеркнуть, что mwebber сказал в комментарии:
также проверьте, не включен ли jQuery дважды
:)
это была проблема для меня
У меня есть 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
Как я могу это исправить?
Я просто хочу подчеркнуть, что mwebber сказал в комментарии:
также проверьте, не включен ли jQuery дважды
:)
это была проблема для меня
Эта ошибка на самом деле является результатом того, что вы не включаете 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>
После связывания вашего 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>
Убедитесь, что библиотека jquery
не включена в html, загружаемую с помощью Ajax
.remove <script src="~/Scripts/jquery[ver].js"></script>
в AjaxUpdate/get_modal
Другая возможность заключается в том, что один из других сценариев, включенных в вашу проблему, вызывает проблему, включая JQuery или конфликтует с $. Попробуйте удалить другие скрипты и посмотреть, исправляет ли они проблему. В моем случае, после нескольких часов ненужного поиска моего одного кода, я удалил скрипты в двоичном шаблоне поиска и сразу же обнаружил оскорбительный script.
В моем случае я использую 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>
Я думаю, что иногда, когда новички используют несколько примеров кода для учебников, это вызовет эту проблему.
По моему опыту, скорее всего, это произошло с конфликтами jquery (с использованием нескольких версий), для устранения проблемы мы можем использовать метод без конфликтов, как показано ниже.
jQuery.noConflict();
(function( $ ) {
$(function() {
// More code using $ as alias to jQuery
$('button').click(function(){
$('#modalID').modal('show');
});
});
})(jQuery);
Я решил эту проблему в Laravel, изменив строку ниже в resources\assets\js\bootstrap.js
window.$ = window.jQuery = require('jquery/dist/jquery.slim');
в
window.$ = window.jQuery = require('jquery/dist/jquery');
У меня была такая же проблема. Изменение
$.ajax(...)
to
jQuery.ajax(...)
не работает. Но потом я обнаружил, что jQuery был включен дважды, и удаление одного из них устранило проблему.
Бежать
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 проекте.
Я решил эту проблему в ответ, используя его следующим образом.
window.$('#modal-id').modal();
Для меня у меня было //= require jquery
после //= require bootstrap
. Как только я переместил jquery до начальной загрузки, все заработало.
Я думаю, вы должны использовать в своей кнопке
<a data-toggle="modal" href="#form-content"
вместо href должна быть цель данных
<a data-toggle="modal" data-target="#form-content"
просто убедитесь, что модальное содержимое уже загружено
Я думаю, проблема заключается в том, что отображение модальности вызывается дважды, одно в ajax-вызове, которое отлично работает, вы сказали, что модальное изображение показано правильно, но ошибка, вероятно, связана с действием init на этой кнопке, которое должно обрабатывать модальное, это действие не может выполняться, потому что модальное значение не загружается в это время.