2012-11-27 74 views
3

當我做了以下的比較,我得到錯誤的,雖然這兩個VAL()和值直觀地顯示相同的值:12如何比較jQuery的VAL()和JavaScript價值

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

當我提醒雙方$(本).val()和txt.value我得到12.是他們中的一個字符串和另一個int?如果是這樣,哪一個是什麼?

+1

這是指什麼類型的節點,以及如何定義txt? –

+0

我有一個選擇和一個輸入文本元素。我將txt.value與select中的每個選項值進行比較。我用$(this).val()得到選項值,並用txt.value得到文本框的值。請注意,這是在$ .each內執行的。 –

+0

你可以在JSFiddle上運行一個簡單的演示嗎? – Joseph

回答

8

通過typeof瞭解您的值的類型。

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

使用.val()像修剪空格應該是目前jQuery的時候可能已經改變了值。爲了確保,你可以避免使用val()

this.each()以及第二個參數是每個迭代的DOM元素。你可以get the value of the option directly

$('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 

在這一點上,我們已經淘汰所有可以想象的陷阱。如果沒有工作,首先兩者可能是完全不同的價值。

+0

有關鬆散比較的有用信息。謝謝! – MJQ

+1

「12」== 12 // true; Chrome 23測試 –

+0

對不起,我已經意識到問題不在於值不匹配,而是因爲如果條件成立,我試圖從函數中返回。條件確實如此,但代碼在離開$ .each循環後仍然繼續。 –

0

我覺得在寫了這麼多評論後,我發現這些評論非常有用,在這裏花了很多時間在這裏討論。所以我的問題是這樣的:

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

雖然條件$(本).VAL()== txt.value的結果是真實的代碼之後每個循環仍然執行。這就是爲什麼我認爲這兩個值不匹配。但如果 我提出了一個警報在這種情況下它出現了。這意味着每個循環內部「返回」的行爲有錯誤。我最近才明白,儘管返回在每個循環內停止執行代碼,但它並不妨礙代碼在每個塊之後執行。因此,爲了在jquery每個循環內實現完整的函數返回,我們似乎必須放置一個標誌並根據此標誌決定是否在每個循環之後返回。以下代碼適用於我:

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

注意在迭代中返回(false)。這意味着,如果條件成立,則繼續迭代並離開循環。