ページにモーダルがあります。ウィンドウがロードされたときにそれを呼び出そうとすると、コンソールにエラーを表示します。
$(...).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">
×
</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>
どうすればこの問題を解決できますか?
スクリプトの順番に問題があります。この順番でそれらをロードしてください:
<!-- 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はプラグインファイルの前に含める必要があります)。
この警告は、jQueryがコード内で複数回宣言されている場合にも表示されることがあります。 2番目の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>
この問題は、jQueryインスタンスが複数回発生していることが原因です。 jQueryの倍数インスタンスを持つファイルを多数使用している場合は注意してください。 1つのjQueryのインスタンスを残すだけで、あなたのコードは動作します。
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
jQueryが最初になります。
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script type="text/javascript" src="js/bootstrap.js"></script>
スクリプトの順序を変更する
ブートストラップはjqueryプラグインなので、Jqueryを実行する必要があります
インポート文の変更が機能しました。から
import * as $ from 'jquery';
に:
declare var $ : any;
TypeErrorの原因:$(…).modalは関数ではありません:
解決策:
場合によっては、スクリプトがまだ到達していない要素にアクセスしようとすると、エラーが発生します。 BootstrapはjQueryに依存するため、jQueryを最初に参照する必要があります。したがって、jquery.min.js、bootstrap.min.js、さらにbootstrapモーダルエラーは、実際にはモーダル関数を呼び出す前にブートストラップの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>
JQueryのインスタンスが複数ある場合、2番目のjQuery宣言により、bootstrap.jsが正しく機能しなくなります。モーダルポップアップを呼び出す前に、jQuery.noConflict();
を使用してください
jQuery.noConflict();
$('#prizePopup').modal('show');
.load
、.unload
、または.error
などのjQueryイベントエイリアスは、jQuery 1.8以降廃止されました。
$(window).on('load', function(){
$('#prizePopup').modal('show');
});
または、モーダルポップアップを直接開いてみてください
$('#prizePopup').on('shown.bs.modal', function () {
...
});
角度でモーダルbootstrapを統合すると、このエラーが発生します。
これは、この問題を解決するための私のソリューションです。
私は誰のために懸念を共有します。
最初のステップは、jquery
コマンドでbootstrap
およびnpm
をインストールする必要があります。
次に、コンポーネントにdeclare var $ : any;
を追加する必要があります
また、onSave()メソッドで$('#myModal').modal('hide');
を使用できます
デモ https://stackblitz.com/edit/angular-model-bootstrap-close?file=src/app/app.component.ts
HTTPSではなくHTTPを使用してjqueryをインポートしたため、本番で問題が発生しました(そして本番はHTTPS)
実行する
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>
bodyの終了タグの直前のindex.html内。
また、Angular 2-7を実行している場合は、tsconfig.app.jsonファイルのtypesフィールドに "jquery"を含めます。
これにより、Angularプロジェクト内の 'modal'と '$'のすべてのエラーが削除されます。
パーティーには少し遅れていますが、重要な注意点があります。
あなたのスクリプトは正しい順番になっているかもしれませんが、あなたのscriptタグの中のどんなasync
sにも気をつけてください(このように)
<script type="text/javascript" src="js/bootstrap.js" async></script>
これが問題の原因になっている可能性があります。特に本番環境専用にこのasync
を設定している場合、これは理にかなっていることに本当にイライラすることがあります。