Bootstrap modal: non è una funzione


108

Ho un modale nella mia pagina. Quando provo a chiamarlo quando si carica Windows, stampa un errore sulla console che dice:

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

Questo è il mio HTML modale:

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

E questo è il mio JavaScript con cui eseguirlo quando viene caricata una finestra:

<script type="text/javascript">
$(window).load(function() {
    $('#prizePopup').modal('show');
});
</script>

Come posso risolvere questo problema?


1
scrivi il tuo codice di attivazione modale nella funzione finestra pronta
yugi

"$ (window) .load (function () {" mi ha salvato
khaled_webdev

1
Definendo due volte l'istanza di JQuery il problema si presenterà. <script src = "// code.jquery.com/jquery-1.11.0.min.js"> </script>
pragadeesh

Risposte:


169

Hai un problema nell'ordine degli script. Caricali in questo ordine:

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

Perchè questo? Poiché Bootstrap JS dipende da jQuery :

Dipendenze dei plugin

Alcuni plugin e componenti CSS dipendono da altri plugin. Se includi i plug-in singolarmente, assicurati di controllare queste dipendenze nei documenti. Nota anche che tutti i plugin dipendono da jQuery (questo significa che jQuery deve essere incluso prima dei file del plugin ).


2
Ho ancora questo problema quando provo a eseguire il modale utilizzando gli strumenti di Google Dev.
Contenitore codificato

@CodedContainer Assicurati che $sia la funzione jQuery. Molto probabilmente è la querySelectorfunzione (denominata $) che è esposta da Google Chrome Dev Tools.
Ionică Bizău

72

Questo avviso può essere visualizzato anche se jQuery viene dichiarato più di una volta nel codice. La seconda dichiarazione jQuery impedisce a bootstrap.js di funzionare correttamente.

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

grazie per questo punto, ho incontrato questo problema e ho scoperto che il mio DataTable.min.js aveva importato le librerie jquery in esso, ma la mia pagina lo importava di nuovo, questo è il problema principale che l'ha causato.
Alter Hu

Ottimo suggerimento, avevo jquery npm installato in Aurelia e anche caricato manualmente in index.html. Grazie!
IngoB

In un grande framework su cui sto lavorando, con una configurazione orribile, jQuery è caricato in alcune pagine ma in altre: dopo aver sbattuto la testa un paio di volte, sono andato qui e ho letto la risposta di @Nurp. Mi ha salvato la giornata.
Nineoclick

Il problema è che sto usando un'applicazione che ha delle dipendenze da una vecchia versione di jquery e non mi è permesso cambiare e ad un certo punto verrà importata in seguito! ho usato l'ultima versione di jquery e poi bootstrap js, causando tutti i problemi!
heman123

Anche questo era il mio problema. Ho rimosso jquery dalla sezione degli script in angular.js e ho anche eliminato "import * as $ from 'jquery'" dal Typescript e tutto ha funzionato.
Jens Mander

15

Il problema è dovuto alla presenza di istanze jQuery più di una volta. Fai attenzione se stai usando molti file con istanze multiple di jQuery. Basta lasciare 1 istanza di jQuery e il tuo codice funzionerà.

<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>

14

jQuery dovrebbe essere il primo:

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/bootstrap.js"></script>

14

Cause di TypeError: $ (…) .modal non è una funzione:

  1. Gli script vengono caricati nell'ordine sbagliato.
  2. Istanze multiple di jQuery

soluzioni:

  1. Nel caso in cui, se uno script tenta di accedere a un elemento che non è stato ancora raggiunto, verrà visualizzato un errore. Bootstrap dipende da jQuery, quindi è necessario prima fare riferimento a jQuery. Quindi, devi essere chiamato jquery.min.js e quindi bootstrap.min.js e inoltre l'errore modale di bootstrap è in realtà il risultato di non aver incluso il javascript di bootstrap prima di chiamare la funzione modale. Modal è definito in bootstrap.js e non in jQuery. Quindi lo script dovrebbe essere incluso in questo modo

       <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> 
       <script type="text/javascript" src="js/bootstrap.js"></script>
  2. Nel caso in cui siano presenti più istanze di jQuery, la seconda dichiarazione jQuery impedisce a bootstrap.js di funzionare correttamente. quindi usalo jQuery.noConflict();prima di chiamare il popup modale

    jQuery.noConflict();
    $('#prizePopup').modal('show');

    alias eventi jQuery piace .load, .unloado .errordeprecate da jQuery 1.8.

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

    O prova ad aprire direttamente il popup modale

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

Grazie, nel mio caso stavo caricando due istanze di jQuery.
Sanjay Achar

10

modificare l'ordine dello script

Poiché bootstrap è un plugin jquery quindi richiede l'esecuzione di Jquery


5

La modifica dell'istruzione di importazione ha funzionato. A partire dal

import * as $ from 'jquery';

per:

declare var $ : any;

4

Correre

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

nel progetto per aggiungere i tipi di jquery nel tuo progetto angolare. Dopo di che includi

import * as $ from "jquery";
import * as bootstrap from "bootstrap";

nella tua app.module.ts

Inserisci

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>

nel tuo index.html appena prima del tag di chiusura del corpo.

E se stai eseguendo Angular 2-7 includi " jquery " nel campo dei tipi del file tsconfig.app.json.

Questo rimuoverà tutti gli errori di "modal" e "$" nel tuo progetto Angular.




0

Il problema mi è capitato solo in produzione solo perché ho importato jquery con HTTP e non HTTPS (e la produzione è HTTPS)


0

Sono un po 'in ritardo alla festa, tuttavia c'è una nota importante:

I tuoi script potrebbero essere nell'ordine giusto ma asyncfai attenzione a eventuali messaggi di posta elettronica nel tag script (come questo)

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

Ciò potrebbe causare il problema. Soprattutto se hai questo asyncset solo per ambienti di produzione, questo può diventare davvero frustrante da ragionare.


Il codice nella domanda mostra chiaramente che (a) non sono nell'ordine corretto e (b) non stanno usando l'attributo asincrono
Quentin

1
Sto dando la mia risposta perché è una domanda frequente su Google e qualcuno potrebbe trarne vantaggio
Martin Shishkov,

0

Ha lottato per risolvere questo problema, ha controllato l'ordine di caricamento e se jQuery è stato incluso due volte tramite bundling, ma non sembra essere quella la causa.

Infine risolto il problema apportando la seguente modifica:

(prima):

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

(dopo):

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

Ho trovato la risposta qui: https://github.com/ColorlibHQ/AdminLTE/issues/685


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.