2011-08-13 15 views
0

jQueryでカスタム選択ドロップダウンプラグインを作成する際に問題があります。私は1つの時点で開いている機能です。つまり、ドロップダウンを開くと、他のものが閉じます。
最初のアイデアは、すべてのドロップダウンをオブジェクトとしてグローバル配列を作成することでした。次に、 "opening"関数では、まず最初の行を追加して、どれが開いていても閉じていないことを確認します。新しい要素が開かれているときに他の要素を隠す/閉じる方法

私のスクリプトの非常にスケーリングされたバージョンを作成しました:http://jsfiddle.net/ngGGy/1/
アイデアはその時点で1つのドロップダウンを開いておくことです。意味することは、あなたが1つを開くと、他の人は閉じなければならないということです。そうでなければ、新しい人が開かれたときに自動的に閉じます。

答えて

1

http://jsfiddle.net/pimvdb/ngGGy/3/のようにDropDownSelectサイズリストを記録しておくことができます。

(function($){ 
    var lists = $(); // cache of lists 

    $.fn.DropDownSelect = function (settings) { 
     jQuery.globalEval("var zindex = 100"); 

     var thiselement = $(this); 
     var thislist = thiselement.next('ul'); 
     lists = lists.add(thislist); // add current one to cache 

     thiselement.click(function() { 
      lists.slideUp(); // hide all lists initially 

      if (thislist.is(':visible')) { 
       thislist.slideUp(); 
      } else { 
       thislist.css('z-index', ++zindex).slideDown(); 
      } 
     }); 
    }; 
})(jQuery); 
+0

極端な短時間での完全性(まだ受け入れられないことを意味する)余分な質問:ドロップダウンをグループ化して別の設定を行うことは可能ですか?このようなものhttp://jsfiddle.net/ngGGy/5/ –

+1

@ Kalle H.Väravas:これがあなたの意味することを望みます:http://jsfiddle.net/pimvdb/ngGGy/7/。 – pimvdb

+0

さて、はい、いいえ。基本的には、あなたはそれをとにかく解決し、私はその方法を見ることができます。私はgroup1が複数のオープンを持つことができ、group2はその時点で1つしか持たないことを意味しました。しかし、一般的にグループ化は私の問題でした。あなたはそれを解決し、別の設定を追加することは私にとっては問題ではありません。ありがとうございます:) –

0

すべてのプルダウンが登録されているイベントを発生させてみませんか?現在開かれているID(​​またはインスタンス)を渡します。ハンドラでは、ハンドリングインスタンスが開かれているインスタンスかどうかをチェックします。そうでない場合は、閉じます。

2

あなたのドロップダウンセットは、アコーディオンのように動作するようです。

これは、divで各ドロップダウンをラップしてクラスを作成し、それを使用してドロップダウンリストをすべてターゲティングすると簡単に達成できます。実施例の

I forked your jsfiddle

EDIT更新フィドルリンク)

+0

あなたの答えをありがとう。あなたのフォークフィドルは私のオリジナルとまったく同じです。しかし、私はあなたのポイントを得る。メインのスクリプトでは、#global_wrapperを使用していますが、それは周りを回り、私はすでに「現在開いている」クラスのアイデアを試しました。それは何らかの理由でうまくいかなかった。また、より高度なスクリプトの目標を達成するために、私は現在開いているクラスを使用したくありません。 –

+0

私はフィドルの更新をクリックするのを忘れて、私の変更を失った、申し訳ありません!私は[新しいものを作成しました](http://jsfiddle.net/ZzwHJ/1/)(上のリンクも更新)。私が示唆しているのは、各ボタンdiv + ulのペアの周りにクラス 'dropdown'を持つラッパーです。次に、ボタンdivに適用し、ulを次の兄弟としてターゲティングする代わりに、内部の要素をターゲットにして、その外部divにプラグインを適用できます。つまり、別のdiv内の各プラグインインスタンスのHTMLを分離します。 – bfavaretto

+0

ありがとうございます。これは確かに簡単な修正です。本当にいいです。しかし、私はそのようにグループ化することはできません。 –

1

あなたは正しい軌道に間違いだが、あなたが一度にオープン1つのドロップダウンリストを持っているつもりなら、あなたは彼らが何らかの形で関係しているとします。幸いなことに、あなたのマークアップはすでにそこにあるので、私たちがしなければならないことは、JSを修正することだけです。私はあなたのjsFiddleプロジェクトをここで更新しました:http://jsfiddle.net/ninjascript/ngGGy/4/

最初にセレクタ。 jQueryのは、あなたがこのような^=を使用して、類似した属性を選択できます:

$('div[id^=button]').DropDownSelect(); 

今、私たちは自分のプラグインビットを更新する必要があります。 「thislist」であったものが現在「everylist」と呼ばれていることに注目してください。これで、クリックされたボタンに関連付けられたリストを開く前に、すべてのリストがクリックで閉じるように強制できます。

(function($){    
    $.fn.DropDownSelect = function (settings) { 
     jQuery.globalEval("var zindex = 100"); 

     var thiselement = $(this); 
     var everylist = thiselement.next('ul'); 

     thiselement.click(function() { 
      var thislist = $(this).next('ul'); 
      if (everylist.is(':visible')) { 
       everylist.slideUp(); 
      } 
      thislist.css('z-index', ++zindex).slideDown(); 
     }); 
    }; 
})(jQuery); 

幸運!

+0

答えをありがとう。しかし、それらを '$( 'div [id^= button]')'と一緒に呼び出すと、プラグインの機能が制限されます。私はそのスケール版を言った。また、私のアイデアはいつも一度も開いていたものではありませんでした。つまり、スクリプトは最後に開いたままのドロップダウンを常に開いたままにしておき、閉じたときに再び開きます。 –

+0

また、1回の呼び出しで複数のドロップダウンがある場合は、プラグイン内でそれらをループする必要があります: 'return this.each(function(){});' –

+0

あなたのリクエストのパラメータを誤解していることを認めますが私は、コードがどのようなループにも依存することなく、期待どおりに動作することが分かると思います。私の返答でリンクしているjsFiddleプロジェクトをチェックしてみてください。http://jsfiddle.net/ninjascript/ngGGy/4/ – ninjascript

関連する問題