2016-12-19 4 views
1

jQueryと入力フィールドで簡単にdivフィルタリングを実行しています。 "Ctrl + + バックスペース"を使用して入力を削除すると、つまり、すべてのテキストを選択して削除すると、空であることが検出されません。この原因は何ですか?"ctrl + a + backspace"でテキストを削除すると、入力が空であることが検出されない

キーボードコマンドを使用している場合は、デフォルトに戻すdivsは戻っていませんが、バックスペースすべての文字の場合は通常に戻ります。

これは私がそれを行う方法です。

$('#brandSearch').keyup(function() { 
    var valThis = $(this).val().toLowerCase(); 
    if (valThis.length == 0) { 
     $('.card').show(); 
    } else { 
     $('.card').each(function() { 
      var text = $(this).text().toLowerCase(); 
      (text.indexOf(valThis) >= 0) ? $(this).parent().show(): $(this).parent().hide(); 
     }); 
    }; 
}); 
+3

* "" ctrl + a "を使用して入力を削除した場合" * 'CTRL + A 'は入力を削除しません。 –

+0

を入力し、バックスペースを押します。ごめんなさい! –

+1

この場合は重要ではありませんが、 'keyup'ではなく' input'イベントを使用してみませんか? – canon

答えて

1

空の文字列を扱うあなたのifブロックが表示されていませんブロックが隠すのと同じ要素です。 elseブロックは.parent()を呼び出しますが、ifブロックはコールしません。

だからelse場合を示しているか、各.card要素のを隠しますが、if場合は、両親を非表示解除せずに.card要素自体— を示しています。それが空でない文字列の場合は正しく動作しているように、それだけの問題であるべき聞こえるので

$('#brandSearch').keyup(function() { 
    var valThis = $(this).val().toLowerCase(); 
    if (valThis.length == 0) { 
     // Show all of the .card elements 
     $('.card').show(); 
    } else { 
     $('.card').each(function() { 
      var text = $(this).text().toLowerCase(); 
      // Show or hide the *parent* of this .card element 
      text.indexOf(valThis) >= 0 ? 
       $(this).parent().show() : 
       $(this).parent().hide(); 
     }); 
    }; 
}); 

:私のコメントは、コード(私も明確にするためelseで条件式を再フォーマット)に追加を参照してください。それは他の人と一致するようにifブロックで.parent()を追加:

$('#brandSearch').keyup(function() { 
    var valThis = $(this).val().toLowerCase(); 
    if (valThis.length == 0) { 
     // Show the parent of each .card element 
     $('.card').parent().show(); 
    } else { 
     // Show or hide the parent of each .card element 
     $('.card').each(function() { 
      var text = $(this).text().toLowerCase(); 
      text.indexOf(valThis) >= 0 ? 
       $(this).parent().show() : 
       $(this).parent().hide(); 
     }); 
    }; 
}); 

これは、ブラウザのデバッグツールに精通は大きな時間をオフに支払うことになる状況の一種です。 .show()または.hide()メソッドはDOMを操作し、DOMインスペクタを使用することでどの要素が隠れて表示されているかを簡単に確認できます。

実際、学習の練習として、元のコードに戻って一時的にバグを解消し、DOMインスペクタを開いて問題がどのように現れているかを確認することをおすすめします。そこにいる間に、JavaScriptデバッガなどのツールも試してみてください。

Chromeをお使いの場合は、introduction to the Chrome Developer Toolsです。他のブラウザにも同様のツールとドキュメントがあります。

+0

あなたは絶対に正しいです。私は実際にあなたの前にあなたのコメントを見ていませんでした。しかし、 '.length == 0'と' val == "" 'の違いは何ですか? –

+0

私は 'val ==" "'をコード中に見ませんが、 'val'が単一のスペース文字からなる文字列かどうかをテストします。 'val ==" "'について質問しているのであれば、 'val.length == 0'と本質的に同じで、' val'が文字列であると仮定します。 –

+0

これをクリアしてくれてありがとう、Jqueryとjavascript言語を始めたばかりで、たくさんのことが宣言されています。 –

1

それはうまく動作しているようだ:

$('#brandSearch').keyup(function() { 
 
    var valThis = $(this).val().toLowerCase(); 
 
    if (valThis.length == 0) { 
 
     $('.card').show(); 
 
     console.log("input is empty"); 
 
    } else { 
 
     console.log("input is not empty");     
 
     $('.card').each(function() { 
 
      var text = $(this).text().toLowerCase(); 
 
      (text.indexOf(valThis) >= 0) ? $(this).parent().show(): $(this).parent().hide(); 
 
     }); 
 
    }; 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input id="brandSearch">

+0

奇妙なことに、本当にうまくいっています。私はmaterializecss入力フィールドを使用していますか?そのコンソールは入力が空ではないが、戻っていないことを示しています。 –

+0

私はそのタイプの入力に慣れていませんが、印刷可能な文字が押されたときでさえ、それを引き起こすことは確かです。 –

+0

また、適時に変更を検出したい場合は、 '.keyup'が登録するのに最適なイベントではありません。 –

関連する問題