0

サイトに必要ないくつかの追加機能を使用して UI ダイアログを拡張する jquery プラグインを開発しようとしています。追加のオプションの 1 つは、URL を渡すことです (一部の html コンテンツ、iframe のいずれか)。合計で、アプリケーションに 13 のオプションを定義しました。奇妙な動作の 1 つは、コールバック (まだ作成されているがまだ表示されていない要素にコンテンツをロードする ajax) 内で dialog() メソッドを呼び出すと、1 つではなく 13 個のダイアログ ボックスが作成されることです !!!

コードは次のとおりです (不要なコードをカットしました。アップデータ プラグインを使用すると、html コンテンツを要素に直接読み込むことができます。ここに保持しますが、それはそれです)。

jQuery.fn.isset = function(){return this.length>0;}
jQuery.fn.updater = function() {
    var e = this;
    [...]
    options.url         = options.url           || url
    [...]
    $.ajax(options).success(function(data){e.html($(data);});

}; 
jQuery.bzkModal = {
    show :function(content,options){
        options = options ? options : {};
        $j.extend(true, options, {
            modal       : true,
            onClose     : options.onClose   || function(){},
            onOpen      : options.onOpen    || function(){},
            onShow      : options.onShow    || function(){},
            evalScripts : typeof(options.evalScripts)=='boolean' ? options.evalScripts : true,

            /* additional options */
            type : (options.type=='iframe') ? '<iframe>' : '<div>',
            maxHeight   : options.maxHeight || jQuery(window).height() * 0.9,
            maxWidth    : options.maxWidth  || jQuery(window).width() * 0.9,
            width       : 'auto',
            height      : 'auto',
            autoResize  : true,
            position    : options.position  || { my: "center", at: "center", of: 'body' },
        });

        if($('[id="'+content+'"]').isset())  {
            /* just do the standard dialog with options */
            $j('[id="'+content+'"]').dialog(options);
        }   
        else {
            /* create a DOM element */
            var f = $j(options.type);
            /* get content */
            if(options.type=='iframe') {
                [...]               
            }
            else {
                f.updater({url: content, success: function(){
                    f.dialog();
                }});
            } 
            /* if f.dialog(options) here, it works!!! */
        }
    },
        [...]
};

アップデーターの後に f.dialog(options) を呼び出すと、機能し、ダイアログ ボックスが 1 つしか開かれません (ただし、ダイアログ ボックスは html コンテンツが挿入される前に作成されるため、サイズと配置に問題があります)。ダイアログボックス)。

なぜ私がこの奇妙なことをすることができるのか(オプションを定義した限り、13個のボックスが開かれています...)、誰もが考えを持っていますか?

私の質問が包括的であることを願っており、十分な詳細を提供しました。

4

1 に答える 1

0

問題はアップデーターから来ていたようです。以下で、それは動作します:

jQuery.bzkModal = {
    show :function(content,options){
        [...]
        if($('[id="'+content+'"]').isset())  {
            /* just do the standard dialog with options */
            $('[id="'+content+'"]').dialog(options);
        }   
        else {
            /* create a DOM element */
            var f = $(options.type);
            /* get content */
            if(options.type=='iframe') {
                [...]               
            }
            else {
                $.ajax({url: content, evalScripts: options.evalScripts})
                .success(function(data){ f.html(data).dialog(options); });
            }
        }
    },
    [...]
};

難しい、どこに問題があるのか​​ わかりません。

于 2013-01-11T15:00:31.427 に答える