2012-02-10 5 views
3

私はこのスクリプトを合理化しようとしています。私はこれらの文のうちの50個を持っているので、if/else文を二重に入れ子にするのはばかげているようですが、私が作った他の試みはうまくいきません。if-else文が多すぎます。彼らはグローバル化することができますか?

最初のif/else文if(e.keyCode == 66 && e.shiftKey)が必要ですが、あまりにも多くの文字が一定の幅を基準にして入力された場合、警告をスローしている第2のif (typedAdjusted >= paperWidth % charWidth)についてはわかりません。

機能if (typedAdjusted >= paperWidth % charWidth)は私をグローバルにすることができますか?それは特定のkeyCodesに対してチェックされる必要があります。たとえば、 "B"という文字はtypedAdjustedになりますが、BACKSPACEとTABとCOMMANDは使用しないでください。

var typed = $("span.char").length; 
var typedAdjusted = typed+1; 
var paperWidth = 900; 
var charWidth = 44; 

if (e.keyCode == 66) { 
    if (e.keyCode == 66 && e.shiftKey) { 
     $('#charLine-1').append('<span class="char">B</span>'); 
     if (typedAdjusted >= paperWidth % charWidth) { 
      $('body').append('<span id="warning">WARNING!</span>'); 
     } 
     else { 
      return false; 
     } 
    } 
    else { 
     $('#charLine-1').append('<span class="char">b</span>'); 
     if (typedAdjusted >= paperWidth % charWidth) { 
      $('body').append('<span id="warning">WARNING!</span>'); 
     } 
     else { 
      return false; 
     }   
    } 
} 

答えて

2

あなたはスイッチ一つ一つの使用をチェックするような場合:必要に応じてイベントを渡すcheckKey関数を呼び出します。

function checklen() { 
    var typed = $("span.char").length; 
    var typedAdjusted = typed + 1; 
    var paperWidth = 900; 
    var charWidth = 44; 
    return (typedAdjusted >= paperWidth % charWidth); 
} 

function checkKey(e) { 
    var mychar = ''; 
    var checkit = false; 
    switch (e.keyCode) { 
    case 66: 
     mychar = e.shiftKey ? 'B' : 'b'; 
     checkit = checklen(); 
     break; 
    case 67: 
     mychar = e.shiftKey ? 'C' : 'c'; 
     checkit = checklen(); 
     break; 
    case 68: 
     mychar = e.shiftKey ? 'D' : 'd'; 
     checkit = checklen(); 
     break; 

    default: 
     checkit = false; 
     break; 
    } 
    if (!checkit) { 
     $('#charLine-1').append('<span class="char">' + mychar + '</span>'); 
    } 
    else { 
     $('body').append('<span id="warning">WARNING!</span>'); 
    } 
} 

それは文書全体で動作するように取得する:

$(document).ready(function(){ 
    $(document).keydown(function(e) { 
    checkKey(e); 
    }); 
}); 

、ページ上だけをクリックして、文字を入力する - コードの「D」、「C」、唯一の「b」を注意してください上記。

+0

'mychar = e.shiftKey? mychar = 'B':mychar = 'b'; 'ちょっと冗長であるようです:P –

+0

@MarkSchultheissこれは私が行くはずのようですが、動作していないようです - http://jsbin.com/owaraw/ 2 – pardon

+0

私の愚かな高速入力の構文を修正しました:)サンプル:http://jsfiddle.net/MarkSchultheiss/6Svcb/ –

6

これらのうち50個を意味するとはどういう意味ですか?あなたは...それぞれの手紙のためのものを意味するものではありませんか?

なぜ、キーコードの値が2回確認されますか?キャラクター以外のコードはまったく同じであることがわかりますか?

は、ルックアップテーブルを保持し、または直接文字変換、および単一の方法にそれを短縮:

var c = lookup(e.keyCode, e.shiftKey); 
$('#charLine-1').append('<span class="char">' + c + '</span>'); 
if (typedAdjusted >= paperWidth % charWidth) { 
    $('body').append('<span id="warning">WARNING!</span>'); 
} else { 
    return false; 
} 

スパンの全体の束を作成するために起こっています。


var normal = { 
    66: 'b', 67: 'c', // etc. 
}; 

var shifted = { 
    66: 'B', 67: 'C', // etc. 
}; 

/** 
* Looks up keycode using appropriate map. 
* 
* Returns `undefined` if not found; shouldn't insert. 
*/ 
function lookup(code, shift) { 
    return shift ? shifted[code] : normal[code]; 
} 
+0

私は50種類のキーを備えた実際のタイプライターに基づいて仮想タイプライターを作成しているため、50種類あります。 50個すべてのキーにif(e.keyCode == ##)があります。キーコードはキーコードの組み合わせを考慮して2回チェックされます(シフト+ b = B;シフト+ 2 = @)。ルックアップテーブルに関するヒントをありがとう。私はそれを試して、それが私のために働くかどうかを見てみましょう(JSの新しい、ちょうど彼らの存在を学んだ)。 – pardon

+0

@pardonしかし、キーコードを再確認する必要はありません。最初の 'if'を過ぎてしまった場合、あなたはすでにキーコードがあなたがチェックしたものであることを知っています。しかし、ルックアップテーブルははるかに合理的なソリューションです。これは単なるマップ/ハッシュまたは配列です。シフトを処理するためのJ. Random Mechanism(インデックスオフセットの追加、マップ/配列の切り替えなど)です。 –

+0

提案に感謝します。うまくいけば助けになると思う。ハッシュについて混乱しているビット。次のようなものを提案していましたか? 'var myChar = {}; myHash ['a'] = [65]; myHash ['b'] = [66]; myHash ['c'] = [67]; ' とシフトキー検出では、呼び出し... 'var myShiftChar = {}; myHash ['A'] = [65]; myHash ['B'] = [66]; myHash ['C'] = [67]; ' – pardon

0

keypressイベントが発生した場合は、String.fromCharCode(event.keyCode)を使用して入力した文字を取得し、ルックアップテーブルを混乱させる必要はありません。

function (event) { 
    var key = event.keyCode; 
    if (key > 31 && key < 127) return String.fromCharCode(key); 
} 
+0

これはキーコードの組み合わせを検出するためには役に立たない。 – pardon

+0

はい、そうです。少なくともそれはChromeの私のために働く。 "a"キーを押すと、 "a"を返します。 Shift + aを押すと "A"が返されます。 2を押すと "2"が返されます。 Shift + 2を押すと "@"が返されます。 Shiftキーが押されたかどうかを知る必要がある場合は、 'event.shiftKey'をチェックしてください。 – Steve

+0

残念ながら私はキーボードのデフォルトのキーコードの組み合わせを使用していません。例えば、私のキーボードの 'shift + 6 = ^'では、 'shift + 6 = - 'が必要です – pardon

関連する問題