1

Bootstrap/jQuery で拡張したい$.fn.modalので、追加のオプションを渡してモーダルが初期化される前に、拡張バージョンが「実行」します。jQueryプロトタイプを拡張するために何度か行うように、これを試しました:

var modal = $.fn.modal;

$.fn.modal = function() {
    this.each(function() {
        // do stuff
    });
    modal.apply(this, arguments);
}

$('#modal').modal(); // fails

他の多くの非ブートストラップ jQuery プロトタイプでも同じパターンが機能しますが、上記の例は機能しません。

これを示すフィドルがあります: http://jsfiddle.net/eTWSb/ (オーバーライドのものをコメントして、動作を確認してください)。

カスタム機能を追加したい場合、関数を複製してから「スーパー」として呼び出すことが実行可能なオプションであるという印象を受けました。

助言がありますか?

4

2 に答える 2

8

わかりました。オーバーライドすると、ブートストラップが配置したデフォルトのオプション$.fn.modalも削除されます(なぜですか?)。$.fn.modal.defaults

show: trueそのため、拡張すると、実際にモーダルを表示するデフォルトのオプションが失われました...

これで解決します(ただし、コンストラクターもコピーしない限り失われます):

var modal = $.fn.modal,
    defaults = $.extend({}, $.fn.modal.defaults);

$.fn.modal = function(options) {
    options = $.extend( defaults, options );
    this.each(function() {
        // do stuff
    });
    return modal.call( this, options );
};
于 2012-10-01T22:12:47.970 に答える
0

Davidが提供する解決策は正しいですが、これを行うには、ここで述べたようにjQueryがロードされていることを確認する必要があるため、最終的な解決策は次の とおりです。

window.onload = function() {
    if (window.jQuery) {  
        //modal extension
        var modal = $.fn.modal,
        defaults = $.extend({}, $.fn.modal.defaults);
        $.fn.modal = function(options) {
        options = $.extend( defaults, options );
        this.each(function() {
          // do stuff
        });
        return modal.call( this, options );
        };
    }
}
于 2015-10-23T16:48:59.720 に答える