0

次の Javascript/jQuery があります。

$('#List').keypress(function (e) {
  if (e.which == 13) {
    var lines = $('#List').val().split('\n');
    mylast = lines[lines.length - 1];
    mylen = mylast.length;
    if ((mylen != 8) || (mylen != 4)) {
      lines = lines.slice(lines.length-1);
      $('#List').val(lines.join("\n"));
      alert(mylen);
      return false;
    }
    return true;
  }
});

しかし、長さが 4 または 8 であっても if の後にコード ブロックにジャンプします。

私のエラーはどこですか?

指定された長さでない場合、テキストエリアの最後の行を削除したい。

4

4 に答える 4

2

次のようなものであってはなりません。

if ((mylen != 8) || (mylen != 4)) {

そのはず:

if ((mylen != 8) && (mylen != 4)) {

8 だった場合は 4 ではなかったので通過していたか、4 だった場合は 8 ではありませんでした。どちらでもないことを確認する必要があります。

于 2013-05-09T14:58:08.377 に答える
0

この行:

if ((mylen != 8) || (mylen != 4)) {

「長さが 8 でないか、長さが 4 でない場合」を意味します。たとえば、4 は 8 ではないので、条件は true です (2 番目の部分はテストされません。JavaScript 式が短絡されているためです)。同様に、8 の場合、式の最初の部分は false ですが、2 番目の部分 (8 != 4) は true であるため、式は true です。

あなたはおそらく欲しい:

if ((mylen != 8) && (mylen != 4)) {

&&「そして」という意味です。

于 2013-05-09T14:58:27.503 に答える
0

が の場合を調べてみましょmylen4

mylen != 8 //true

mylen != 4 //false

true || false // true

おそらくあなたが望むのは、 であることを防ぎmylen、 であること8 防ぐmylenこと4です:

(mylen != 8) && (mylen != 4)
于 2013-05-09T14:59:19.553 に答える
0

FWIW、これがあなたのコードのより良いバージョンです:

$('#List').keypress(function (e) {
    var lines, last, valid;

    if (e.which === 13) {
        lines = $(this).val().split('\n');
        last  = lines.pop();
        valid = last.length === 4 || last.length === 8;

        if (!valid) {
            $(this).val(lines.join("\n"));
            e.preventDefault();
        }
    }
});
  • すべての変数をローカルとして宣言します (キーワードを忘れないでください!)var
  • $(this)を繰り返す代わりに使用します$('#List')
  • e.preventDefault()返す代わりに使用しますfalse
  • valid意味をより明確に伝えるために名前付きの変数を使用します
  • 厳密な比較を使用します ( ===)
  • submitコードがフォームの有効性チェックの一部である場合は、Enter キーをキャプチャする代わりに、イベント ハンドラーにコードを配置することを検討してください。
于 2013-05-09T15:17:35.407 に答える