2011-12-22 9 views
2

私は以下のようなHTMLが見える、シンプルスキンスイッチャーを作りたい:イベントをバインドする最も良い方法は?

<ul id="switcher"> 
    <li class="skin selected"> 
    <a href="#">Skin 1</a> 
    <ul class="color-variants"> 
     <li><label for="white"><input type="radio" name="skin" id="white" value="skin1-white" /></label></li> 
     <li><label for="black"><input type="radio" name="skin" id="black" value="skin1-black" /></label></li> 
    </ul> 
    </li> 
    <li class="skin no-variants"> 
    <label for="skin2">Skin 2</label> 
    <input type="radio" name="skin" id="skin2" value="skin2" /> 
    </li> 
</ul> 

第二は、ラジオを備えた単一のラベルである一方、第一皮膚は、カラーバリエーションのラジオボタンのいずれかを選択することによって活性化されますバリアントのないボタン。

私がいることをJSが必要になります。

  • がli.skinとカラーバリエーションラベル

私に「選択された」カラーバリエーション

  • と皮膚のデフォルトリンクのアクションは、クラスを追加し停止しますコード:

    var $switcher = $('#switcher'); 
    $switcher.delegate('.skin a','click',function() { return false; }) 
    .delegate('.color-variants label','click',function() { 
        var $this = $(this); 
        $switcher.find('.selected').removeClass('selected'); //remove all .selected 
        $this.closest('.skin').addClass('selected'); // add .selected to .skin 
        $this.parent().addClass('selected'); // add .selected to .color-variants label 
    }) 
    .delegate('.novariants label','click',function() { 
        $switcher.find('.selected').removeClass('selected'); //remove all .selected 
        $this.parent().addClass('selected'); // add .selected to skin 
    }); 
    

    ここでコードのパフォーマンスを向上させる方法はありますか?

    $switcher.delegate('.skin a','click',function() {}). 
    delegate('.color-variants label','click',function() {});
    代わりのようなイベントリスナーを結合:

    $switcher.find('.skin a').bind('click',function() {}) 
    .end().find('.color-variants label').bind('click',function() {});

    それとも、それはこのようなものになります。

    $switcher.find('.skin').delegate('a','click',function() {}) 
    .end().find('.color-variants').delegate('label','click',function() {});
    をそれを使用する方が効率的ですか?

  • 答えて

    0

    あなたが持っている要素の数によっては、.delgate()がもっと効率的かもしれません。例としてthis testをチェックしてください。

    私はちょうど.find().end()の両方を避ける最初のオプションを使用します。

    +0

    私はそのテストについて少し懐疑的です。パフォーマンスは主にセレクタのパフォーマンスによって左右されます。デリゲートは、jQueryが最適化する '#nav'で最も単純なセレクタを使用します。ライブ/デリゲートはまた、このようなテストでは明らかではない新しく作成されたDOM要素にイベントをバインドするための追加の機械を必要とします。いずれにしても、ここでのパフォーマンスの問題は洗濯であり、著者はこのような場合に可読性と保守性に焦点を当てるべきだと思います。 – Koobz

    +2

    私はあなたの最後の文に確かに同意します。しかし、私は昨日、デリゲート(またはjQuery 1.7のように 'on ')のパフォーマンスを調べていましたが、代替要素があなたにさまざまな要素を束縛する必要がある場合、より速いと多くの人々が見出しました。ハンドラの実行ではなく、速くなるバインディングだと思います(デリゲートされた要素にバブルする必要があるため、必ず遅くなります)。 – maxedison

    関連する問題