

jqueryの初心者です。

まことに申し訳ありませんが、下の意味を教えていただけませんか？

[code]

    fields.eq( index + (event.shiftKey ? (index > 0 ? -1 :  0 ) : (index < total ? +1 : total ) ) ).focus();
    
[/code]


CC BY-SA 3.0
2016-03-13T08:44:30.000
23085
2016-03-14T06:07:31.523
2016-03-14T06:07:31.523
3054
14769
question
javascript jquery
引数部に「?」と「:」が多用されたコードの意味


質問コメントに書いたように情報が足りませんので、細部が推測にならざるをえないのですが、提示いただいたコードは初心者でなくてもかなりわかりにくいコードなので若干説明を試みたいと思います。

`fields`: 複数のinput要素を束ねたjQueryオブジェクト  
`index`: 上記のinput要素の中で、現在フォーカスが当たっているもののインデックス(0〜)番号  
`total`: 上記のinput要素のすべての個数  
と言うことにしておきます。

3項演算子(`?:`)のネスト、3項演算子を長い式の内側で使うことは、コードを読みにくくするための2大テクニックですが、どちらも使われていますのでかなり読みにくいですね。その部分をif文に置き換えてみると、少し長くなりますがこんな感じになります。

[code]

                var newFocusedIndex;
                if( event.shiftKey ) {
                    //シフトキーが同時に押されていたらこちら
                    if( index > 0 ) {
                        //indexを1減らしても大丈夫なら減らす
                        newFocusedIndex = index + (-1);
                    } else {
                        //大丈夫じゃないならそのまま
                        newFocusedIndex = index + (0);
                    }
                } else {
                    if( index < total ) { //`index < total - 1`の誤り?
                        //indexを1増やしても大丈夫(?)なら1増やす
                        newFocusedIndex = index + (+1);
                    } else {
                        //大丈夫でないなら、…何をしたいんでしょうね???
                        newFocusedIndex = index + (total); //本当は減らす時と同じ`newFocusedIndex = index + (0);`にしたいのではないの? 
                    }
                }
                //fieldsの中のnewFocusedIndex番目の要素にフォーカスを当てる
                fields.eq(newFocusedIndex).focus();
    
[/code]

(冗長なカッコに囲まれた部分が元のコードで3項演算子のネストによって計算しているところです。)  
と言うコードになっています。一部を修正して「タブキーが押された時の処理」として実行してやると、自前でタブによるフォーカス移動を制御できるコードになりますが、`?`を付記した箇所のせいで、何をやりたいのか全くわからないコードになっていますね。

と言うわけで、結局「何をやりたいのか全くわからない」で終わってしまいましたが、『こんなコードが1行で書けちゃったよ、俺ってすげー』的なコードを書くべきか、少しでも他の人が見た時にわかりやすいコードを書くべきか、考えさせてくれるネタにはなりそうです。


CC BY-SA 3.0
2016-03-13T12:05:14.680
23094
2016-03-13T12:16:57.020
2016-03-13T12:16:57.020
13972
13972
23085
answer