3

次の比較を行うと、val() と値の両方が視覚的に同じ値を表示しますが、false になります:12

if ($(this).val() == txt.value)//returns false

$(this).val() と txt.value の両方を警告すると、12 が返されます。一方は文字列で、もう一方は int ですか? もしそうなら、どれが何ですか?

4

2 に答える 2

8

typeof値のタイプを知るためにaを実行します。

console.log(typeof $(this).val());
console.log(typeof txt.value);

.val()jQuery は、存在するはずのトリム空白のようなものを使用すると、値を変更する可能性があります。念のため、使用を避けることができますval()

thisinと 2 番目の.each()引数は、反復ごとの DOM 要素です。の値をoption直接取得できます。

$('select > option').each(function(i,el){
   //we should be getting small caps values
   console.log(this.value);
   console.log(el.value);
});

緩やかな比較 ( ==) を使用する場合、数値 12 と文字列 12 は同じである必要があります。さらに驚くべきことは、文字列の周りに空白が含まれていても、それが正しいことです。しかし、厳密な比較 ( ===) では、次のようにすべきではありません。

"12"    ==  12  // true
" 12  " ==  12  // true; tested on Firefox 20 (nightly)
"12"    === 12  // false

この時点で、考えられるすべての落とし穴を取り除きました。どれも機能しない場合、そもそも両方がまったく異なる値になる可能性があります。

于 2012-11-27T06:29:53.573 に答える
0

この辺りの人たちの時間をたくさん取った後、私はとても役に立つと思うコメントを書く義務があると感じています。だから私の問題はこれでした:

('#mySelect option').each(function({
  if ($(this).val() == txt.value)
    return;
});
alert('Code still continues');

条件$(this).val()== txt.valueの結果はtrueでしたが、各ループの後のコードはまだ実行されていました。そのため、2つの値が一致しないと思いました。しかし、この状態の中にアラートを入れると、それが現れました。これは、各ループ内の「リターン」の動作に問題があったことを意味します。最近、returnは各ループ内でコードの実行を停止しますが、各ブロックの後でコードの実行を妨げることはないことを理解しました。したがって、jqueryの各ループ内で完全な関数の戻りを実現するには、フラグを設定し、このフラグに従ってそれぞれの後に戻るかどうかを決定する必要があるようです。次のコードは私のために働いた:

var shouldContinue = true;
('#mySelect option').each(function ()
{
    if ($(this).val() == txt.value) {
        shouldContinue = false;
        return (false);
    }
});
if (!shouldContinue)
    return; 

反復内のreturn(false)に注意してください。これが意味するのは、条件が真の場合、それ以上反復を続けずにループを離れることです。

于 2012-11-27T07:35:26.237 に答える