2012-01-24 9 views
0

私は動作しますが、実際にそれが唯一の1行にする必要がありますように感じているこのコードこのjqueryスクリプトを1行に減らすことはできますか?

if (forw == true) 
    { 
    if ($('.tickertape li.active')[0] != $('.tickertape li').last()[0]) 
     { 
     $('.tickertape li.active').removeClass('active').next().addClass('active'); 
     } 
    else 
     { 
     $('.tickertape li.active').removeClass('active'); 
     $('.tickertape li').first().addClass('active'); 
     } 
    } 
else 
    { 
    if ($('.tickertape li.active')[0] != $('.tickertape li').first()[0]) 
     { 
     $('.tickertape li.active').removeClass('active').prev().addClass('active'); 
     } 
    else 
     { 
     $('.tickertape li.active').removeClass('active'); 
     $('.tickertape li').last().addClass('active'); 
     } 
    } 

を書かれています。これはこれを行う方法がありますか?

答えて

5
$('.tickertape li.active').removeClass('active')[forw == true ? 'next' : 'prev']().addClass('active'); 

角括弧表記および条件演算子の組み合わせは、プロパティnext又はprevを選択するために使用することができます。個人的に私は何を上記の持っていることは罰金だと思いますが

var ticker = $('.tickertape li.active'); 

ticker.removeClass('active'); 

(forw == true) ? ticker.next().addClass('active') : ticker.prev().addClass('active'); 


は...

$('.tickertape li.active') 
    .removeClass('active') 
    [forw == true ? 'next' : 'prev']() // select the 'next' or 'prev' property 
    .addClass('active'); 
+1

これは賢いですね。あなたは私の+1を持っています。 – Bojangles

+1

nice!私は、三元演算子が方法だと思った。 –

0

三項演算子を使用できますが、正直なところ、それはそのままでは読みにくいです。

forw == true ? $('.tickertape li.active').removeClass('active').next().addClass('active') : $('.tickertape li.active').removeClass('active').prev().addClass('active'); 

Terany Operator

0

3ライン(簡潔にするためのスペース)を改行と明確かもしれませ;上記で使用されているconditional operatorよりも読みやすく、それほど長くないか、それほど遅くはありません。

0

可能であれば、私はそれをお勧めしません。それはすでに読みにくいです。ただ1つの行で何かができるのであれば、そうするべきではありません。また、コードの可読性について考える必要があります。あなたがそうのような非常に長い一行を行うことができ

0

...

forw ? $('.tickertape li.active').removeClass('active').next().addClass('active') : $('.tickertape li.active').removeClass('active').prev().addClass('active'); 

しかし、多くの批判に耐えられる解決策は、しかしその後方法

(function($) { 
    $.fn.nextOrPrev = function(useNext) { 
    return this.each(function() { 
     if (useNext) { 
     return $(this).next(); 
     } else { 
     return $(this).prev(); 
     } 
    } 
    }; 
}); 

のこのタイプのためのjQueryの拡張機能を追加することです

$('.tickertape li.active').removeClass('active').nextOrPrev(forw).addClass('active'); 
関連する問題