2012-01-26 19 views
0

私が構築しているシステム用に再利用可能なプラグインを作成しました。ページに1つの要素しかない限り、すべて正常に動作しているようです。私は2を持っている場合、リンクとパネルは、1回のクリックで両方のために非表示になります。プラグインがそれぞれ独立して動作するように範囲を設定するにはどうすればよいですか?各要素のjQueryプラグイン

ありがとうございます。

プラグインは、タブの作成のためのものであり、このように書きます:

(function($){ 

     $.fn.wbTabs = function() { 

      return this.each(function(){ 

       // caching selectors 
       $this = $(this); 
       $tabLinks = $this.find('.tabs li a'); 
       $firstTab = $this.find('.tabs li:first a'); 
       $panels = $this.find('.panel');    

       // function on tab click 
       $tabLinks.click(function() { 
        $panels.hide(); 
        $tabLinks.removeClass('active'); 
        $(this).addClass('active').blur(); 
        var panel = $(this).attr('href'); 
        $(panel).show(); 

        // prevent link from clicking 
        return false; 
       }); 

       // make first tab active 
       $firstTab.click();   
      }); 
     }; 
    })(jQuery); 

は、その後、私はこれでプラグインを呼び出す:

$('.wb-tabs-container').wbTabs(); 
+0

例やjsfiddleを置くことはできますか? – j08691

答えて

1

プラグインの中に変数varを宣言すればよいでしょう。あなたはあなたのプラグインを壊すようになるグローバルバールを設定しています(とにかく一部のブラウザでは失敗します)。フィドル:http://jsfiddle.net/brentmn/uJbxz/3/

 var $this = $(this); 
     var $tabLinks = $this.find('.tabs li a'); 
     var $firstTab = $this.find('.tabs li:first a'); 
     var $panels = $this.find('.panel'); 
+0

これは素晴らしいです。ブレントに感謝します。私はあなたが言っていることを正確に見ます。 – Adam

0

私はおそらく異なるセレクターのアプローチをしようと:

$this = $(this); 
$tabLinks = $('.tabs li a', $this); 
$firstTab = $('.tabs li:first a', $this); 
$panels = $('.panel', $this); 

これは、ブラウザにとってはるかに迅速な処理です。

+0

私はそれをやることができなかったことを知りませんでした.find()を避ける良い方法を探したかったのです。私はこれを撃つだろう。おかげでスティーブO .... – Adam

+0

probsの男だ。どのようにあなたが乗っているか教えてください:) –

0

jQuery Plugins/Authoringガイドラインは、「jQueryのデータメソッドを使用すると、要素ごとに変数を追跡するための素晴らしい方法です。」という助言しますこれはまさにあなたが必要とするものです。

主にクロージャを利用するアプローチがありますが、データメソッドはより直感的です。

推奨するプラグインパターンは、特にご注意くださいsection 6.3 Dataにしてください。それは非常に簡単です。

+0

ありがとうビートルート、私は間違いなくこれに近づくでしょう。 – Adam

関連する問題