Modal de bootstrap: não é uma função


108

Eu tenho um modal na minha página. Quando tento chamá-lo quando o Windows carrega, ele imprime um erro no console que diz:

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

Este é o meu HTML modal:

<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 este é o meu JavaScript para executá-lo quando uma janela é carregada:

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

Como posso resolver este problema?


1
escreva seu código de gatilho modal na função janela pronta
yugi

"$ (window) .load (function () {" me salvou
khaled_webdev

1
Definindo a instância JQuery duas vezes, o problema aparecerá. <script src = "// code.jquery.com/jquery-1.11.0.min.js"> </script>
pragadeesh

Respostas:


168

Você tem um problema na ordem dos scripts. Carregue-os nesta ordem:

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

Porque isso? Como o Bootstrap JS depende do jQuery :

Dependências de plug-in

Alguns plug-ins e componentes CSS dependem de outros plug-ins. Se você incluir plug-ins individualmente, certifique-se de verificar essas dependências nos documentos. Observe também que todos os plug-ins dependem do jQuery (isso significa que o jQuery deve ser incluído antes dos arquivos do plug-in ).


2
Ainda tenho esse problema quando tento executar o modal usando o google dev tools.
Contêiner Codificado de

@CodedContainer Certifique-se de que $é a função jQuery. Muito provavelmente é a querySelectorfunção (nomeada $) que é exposta pelas ferramentas de desenvolvimento do Google Chrome.
Ionică Bizău de

72

Este aviso também pode ser mostrado se jQuery for declarado mais de uma vez em seu código. A segunda declaração jQuery impede que bootstrap.js funcione corretamente.

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

obrigado por este ponto, encontrei esse problema e descobri que meu próprio DataTable.min.js tinha importado bibliotecas jquery para ele, mas minha página importou novamente, esse é o problema raiz que o causou.
Alter Hu

Dica muito boa, eu tinha o jquery npm instalado no Aurelia e também carregado manualmente no index.html. Obrigado!
IngoB

Em um grande framework no qual estou trabalhando, com uma configuração horrível, o jQuery é carregado em algumas páginas, mas em outras: depois de bater minha cabeça algumas vezes, entrei aqui e li a resposta @Nurp. Salvou meu dia.
Nineoclick,

O problema é que estou usando um aplicativo que tem dependências de uma versão mais antiga do jquery e não tenho permissão para alterá-lo e ele está sendo importado posteriormente em algum estágio! Eu usei a versão mais recente do jquery e, em seguida, bootstrap js, causando todos os problemas!
heman123

Esse era o meu problema também. Removi o jquery da seção de scripts no angular.js e também excluí "import * as $ from 'jquery'" do Typescript e tudo funcionou.
Jens Mander

15

O problema é devido a ter instâncias jQuery mais de uma vez. Tome cuidado se estiver usando muitos arquivos com múltiplas instâncias do jQuery. Apenas deixe 1 instância do jQuery e seu código funcionará.

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

14

jQuery deve ser o primeiro:

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

14

Causas para TypeError: $ (…) .modal não é uma função:

  1. Os scripts são carregados na ordem errada.
  2. Várias instâncias jQuery

Soluções:

  1. Nesse caso, se um script tentar acessar um elemento que ainda não foi alcançado, você receberá um erro. O bootstrap depende do jQuery, então jQuery deve ser referenciado primeiro. Portanto, você deve ser chamado de jquery.min.js e, em seguida, bootstrap.min.js e, além disso, o erro modal de bootstrap é na verdade o resultado de você não incluir o javascript do bootstrap antes de chamar a função modal. Modal é definido em bootstrap.js e não em jQuery. Portanto, o script deve ser incluído desta maneira

       <script src="//code.jquery.com/jquery-1.11.0.min.js"></script> 
       <script type="text/javascript" src="js/bootstrap.js"></script>
    
  2. No caso de haver várias instâncias de jQuery, a segunda declaração jQuery impede que bootstrap.js funcione corretamente. então, use-o jQuery.noConflict();antes de chamar o pop-up modal

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

    jQuery aliases evento como .load, .unloadou .errorobsoleto desde o jQuery 1.8.

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

    OU tente abrir o pop-up modal diretamente

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

Obrigado, no meu caso, eu estava carregando duas instâncias do jQuery.
Sanjay Achar

10

mude a ordem do script

Como o bootstrap é um plugin jquery, ele exige que o Jquery seja executado


5

Alterar a instrução de importação funcionou. De

import * as $ from 'jquery';

para:

declare var $ : any;

4

Corre

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

no projeto para adicionar os tipos jquery em seu projeto Angular. Depois disso, inclua

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

em seu app.module.ts

Adicionar

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

em seu index.html logo antes da tag de fechamento do corpo.

E se você estiver executando o Angular 2-7, inclua " jquery " no campo de tipos do arquivo tsconfig.app.json.

Isso removerá todos os erros de 'modal' e '$' em seu projeto Angular.




0

O problema aconteceu comigo apenas na produção, porque importei jquery com HTTP e não HTTPS (e a produção é HTTPS)


0

Estou um pouco atrasado para a festa, mas há uma observação importante:

Seus scripts podem estar na ordem certa, mas preste atenção a qualquer asyncs em sua tag de script (como este)

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

Isso pode estar causando o problema. Especialmente se você tiver esse asyncconjunto apenas para ambientes de produção, pode ser muito frustrante raciocinar sobre isso.


O código na pergunta mostra claramente que (a) eles não estão na ordem certa e (b) eles não estão usando o atributo assíncrono
Quentin

1
Estou dando minha resposta porque é uma pergunta frequente no Google e alguém pode se beneficiar dela
Martin Shishkov

0

Tive dificuldade em resolver este, verifiquei a ordem de carregamento e se o jQuery foi incluído duas vezes via empacotamento, mas essa não parecia ser a causa.

Finalmente consertou fazendo a seguinte alteração:

(antes):

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

(depois de):

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

Encontre a resposta aqui: https://github.com/ColorlibHQ/AdminLTE/issues/685


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.