7

コンボボックスプラグインを作成しました。それを使用するには、あなたはただ呼び出す必要があります

$(elem).combobox(compensateElement);

編集:問題はあなたがそうするならそれです

$('#1').combobox('form');
$('#2').combobox('form');

プラグインが壊れます...

elemはコンボボックスに変換される選択であり、compensateElementは要素であり、その後、プラグインは、suggestionsDivの長さ(高さ20px)のdivを挿入できます。(絶対位置の要素によって押し下げられないフッターがページにあります...)

現在、問題は、このプラグインは1つの要素でのみ使用できることです。一度に複数の要素で動作できるように変更するにはどうすればよいですか?100行以上のJSコードなので、「変換された」コードは期待していません。

すべての要素固有の変数をthis.data「オブジェクト」に入れることを考えましたが、それはまったく良い解決策のようには感じられませんでした。正規表現の検索と置換を実行し、数時間設定した後、まったく機能しませんでした...

どのようなテクニックを使用できますか?

どうもありがとうございました!

4

2 に答える 2

12

問題は、リテラルオブジェクトがあり、呼び出すたびにそのコンテンツが置き換えられることですm.init()

JQueryプラグインを作成するための優れたアプローチを説明しているこの投稿をご覧になることをお勧めします。「LightweightStart」が表示された場合、次に例を示します。

$.fn[pluginName] = function ( options ) {
        return this.each(function () {
            if (!$.data(this, 'plugin_' + pluginName)) {
                $.data(this, 'plugin_' + pluginName,
                new Plugin( this, options ));
            }
        });   
    }

これにより、要素ごとにプラグインオブジェクトの新しいインスタンスが作成されるため、状態を一貫して維持できます。

于 2012-11-30T15:16:48.857 に答える
0

jQueryの各関数を使用して、各要素でプラグインメソッドを呼び出すことができます。メソッド内では、キーワードthisがjQueryオブジェクトではなく現在の要素を指していることを忘れないでください。

   $.fn.combobox = function(form) {
        var $this = this;

        return $this.each(function () {
             if (!m.initialized) {
                m.init.apply(this, [form]);
                $this.data('initialized', true);
             } else {
                m.updateList.apply(this);
             }
        });
    };
于 2012-11-30T15:09:08.730 に答える