부트 스트랩 모달 : 함수가 아닙니다.


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

"$ (창) .load (함수 () {"나 저장
khaled_webdev을

1
JQuery 인스턴스를 두 번 정의하면 문제가 발생합니다. <script src = "// code.jquery.com/jquery-1.11.0.min.js"> </ script>
pragadeesh

답변:


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가 포함되어야 함 ).


2
Google 개발 도구를 사용하여 모달을 실행하려고 할 때 여전히이 문제가 있습니다.
코드 컨테이너

@CodedContainer $jQuery 함수 인지 확인하십시오 . 아마도 Google Chrome Dev Tools에 의해 노출되는 querySelector함수 (이름 $) 일 것입니다.
Ionică Bizău

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를 사용한 다음 js를 부트 스트랩하여 모든 문제를 일으켰습니다!
heman123

그것도 내 문제였다. angular.js의 스크립트 섹션에서 jquery를 제거하고 Typescript에서 "import * as $ from 'jquery'"를 삭제했고 모든 것이 작동했습니다.
Jens Mander

15

문제는 jQuery 인스턴스가 두 번 이상 있기 때문입니다. jQuery의 다중 인스턴스로 많은 파일을 사용하는 경우주의하십시오. jQuery 인스턴스 하나만 남겨두면 코드가 작동합니다.

<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. 스크립트가 아직 도달하지 않은 요소에 액세스하려고하면 오류가 발생합니다. 부트 스트랩은 jQuery에 의존하므로 먼저 jQuery를 참조해야합니다. 따라서 jquery.min.js를 호출 한 다음 bootstrap.min.js를 호출해야합니다. 또한 부트 스트랩 모달 오류는 실제로 모달 함수를 호출하기 전에 부트 스트랩의 javascript를 포함하지 않은 결과입니다. 모달은 jQuery가 아닌 bootstrap.js에 정의되어 있습니다. 따라서 스크립트는 이러한 방식으로 포함되어야합니다.

       <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또는 .errorjQuery를 1.8부터 사용되지 않습니다.

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

    또는 모달 팝업을 직접 열어보십시오.

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

감사합니다. 제 경우에는 두 개의 jQuery 인스턴스를로드했습니다.
Sanjay Achar


5

import 문을 변경했습니다. 에서

import * as $ from 'jquery';

에:

declare var $ : any;

4

운영

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 파일의 types 필드에 " jquery "를 포함 합니다.

그러면 Angular 프로젝트에서 '모달'과 '$'의 모든 오류가 제거됩니다.


4

모달 부트 스트랩을 각도로 통합 할 때이 오류가 발생합니다.

이것이이 문제를 해결하기위한 나의 해결책입니다.

나는 누구의 관심사를 공유합니다.

첫 번째 단계는 설치 필요 jquerybootstrap에 의한 npm명령.

두 번째로 추가 declare var $ : any;구성 요소 가 필요합니다 .

$('#myModal').modal('hide');onSave () 메서드에서 사용할 수 있습니다 .

데모 https://stackblitz.com/edit/angular-model-bootstrap-close?file=src/app/app.component.ts



0

HTTPS가 아닌 HTTP로 jquery를 가져 왔기 때문에 프로덕션에서 문제가 발생했습니다 (그리고 프로덕션은 HTTPS입니다)


0

파티에 조금 늦었지만 중요한 메모가 있습니다.

스크립트는 올바른 순서 일 수 있지만 async스크립트 태그 (예 :이) 에있는 모든를주의하십시오.

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

이로 인해 문제가 발생할 수 있습니다. 특히 async프로덕션 환경에 대해서만 이 세트 가있는 경우 추론하기가 매우 어려울 수 있습니다.


질문의 코드는 (a) 올바른 순서가 아니며 (b) 비동기 속성을 사용하고 있지 않음을 명확하게 보여줍니다
Quentin

1
그것은 자주 봤 질문과 사람이 혜택을 누릴 수 있기 때문에 나는 내 대답을주는거야
마틴 Shishkov

0

이 문제를 해결하기 위해 고군분투하고로드 순서를 확인하고 jQuery가 번들링을 통해 두 번 포함되었는지 확인했지만 그 원인이 아닌 것 같습니다.

마지막으로 다음과 같이 변경하여 수정했습니다.

(전에):

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

(후):

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

여기에서 답을 찾았습니다 : https://github.com/ColorlibHQ/AdminLTE/issues/685


-1

다음을 포함해야합니다.

bootstrap.min.css
jquery.min.js
bootstrap.min.js

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.