2011-10-18 42 views
2

當我有一個這樣的HTML:如何區分空字符串和不存在的值?

<input type="text" id="a" value="" /> 
<input type="text" id="b" /> 

如果我做了$("#a").val()如果存在價值,這是空的或者沒有價值存在我無法分辨。有什麼辦法可以區分這兩種情況嗎?

+2

實際區別是什麼? –

+0

我有一個「日期」輸入,必須設置爲今天的日期,如果沒有任何價值。如果它有一個值=「」它必須保持空 – Ivan

+0

請注意,沒有任何發佈的解決方案在IE8中工作...... –

回答

2

是的,你可以檢查是否存在value屬性。

$('#a[value]')這意味着找到ID a也有屬性的元素value

如果您要檢查您所選擇的元素之後,如果它有一個value屬性,那麼

var elem = $('#a'); 
if (elem.is('[value]')) { 
    // it has a value attribute 
} 
+0

這將給IE7帶來誤判,並且在屬性不存在的情況下會降低,遺憾的是。 –

+1

@安迪..謝謝你的擡頭.. –

2

你可以用這個:

$('#a').is('[value]') // true 
$('#b').is('[value]') // false 

Live de de mo:http://jsfiddle.net/simevidas/w8gFF/1/

+1

你有沒有檢查過是不同版本的IE瀏覽器? – RobG

+0

@RobG它可以在IE9中使用,但不能在IE8中使用...... –

+0

@ŠimeVidas:奇怪 - 我曾預料它可以在支持'hasAttribute()'的IE 8中工作。 IE 7及更低版本不支持'hasAttribute',更糟糕的是,'attributes'集合預先填充了一系列可能的屬性。 –

2

老版本的IE不支持hasAttribute,並且作爲Šime Vidas discovered甚至jQuery不能在這些瀏覽器上信任。

我不得不這樣做,當我需要在舊版本的IE瀏覽器的類似的方法是:

function hasAttribute(el, attr) { 
    if ("hasAttribute" in el) 
     return el.hasAttribute(attr); 

    else if ("outerHTML" in el) { 
     return (el.outerHTML 
        // remove content 
        .replace(el.innerHTML, "") 
        // remove attribute values with quotes 
        .replace(/=(?:(["'])[^\1]*\1)?/, " ") 
        // remove attribute values without quotes 
        .replace(/=[^\s>]+/, "") 
        // normalize 
        .toLowerCase() 
        // search for attribute 
        .indexOf(" " + attr.toLowerCase()) > -1); 
    } 
} 

在你的情況,你可以使用此功能,像這樣:

var hasValue = hasAttribute($("a")[0], "value"); 

不幸的是,在Internet Explorer 8和更低版本中,這仍然不是很健壯。假陽性和陰性將在這些瀏覽器中返回各種屬性,不幸的是,我不認爲有解決方法。

+1

+1,很酷的解決方法。它會丟失沒有值的屬性..(*'''''''''''''''''''''''''''選擇'元素'''''選中'收音機/複選框等。*)但它看起來很棒!也許使用正則表達式的最後一部分將使其更強大.. –

+0

@Gaby:的確,我沒想過布爾屬性。非布爾屬性是標準化的,如果你離開的價值,我認爲這是扔了我。看起來我必須編寫一個正則表達式並更新我使用的代碼... :-) –

+0

想想看,如果屬性的名稱包含在其他屬性中,這樣的正則表達式可能會帶來誤判值。由於這段代碼對於這個問題來說很好,所以我會保持原樣,看看我能否在我擁有的項目中獲得更強大的解決方法。 –

1

這是一個很好的問題,但我認爲你不會在IE8或早期的得到任何解決方法。在我做了一些實驗之後,我這麼認爲。順便說一下,可以使用已安裝的IE9或IE10測試版進行實驗。應該只使用meta「X-UA兼容」來更改文檔兼容模式(請參閱here)。

document.getElementById("a").outerHTML = "<input type='text' id='a' value='' />"; 
alert(document.getElementById("a").outerHTML); 

並且僅alert(document.getElementById("a").outerHTML)

我與測試

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title></title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <meta http-equiv="X-UA-Compatible" content="IE=7" /> 
</head> 

<body> 
    <fieldset><input type="text" id="a" value="" /></fieldset> 
    <script type="text/javascript"> 
    //<![CDATA[ 
     //document.getElementById("a").outerHTML = '<input type="text" id="a" value="" />'; 
     alert('In IE7 outerHTML for <input type="text" id="a" value="" />:\n' + 
      document.getElementById("a").outerHTML); 
    //]]> 
    </script> 
</body> 
</html> 

在 「IE = 8」 上面的代碼顯示文本"<INPUT id=a type=text>"情況。如果我們將"X-UA-Compatible"的值更改爲「IE = 7」,我們甚至會看到"<INPUT id=a">。與「IE =邊緣」相同的代碼顯示<input id="a" value="" type="text">。相應的演示在這裏:IE=edge,IE=8,IE=7

因此,在解析HTML時,IE似乎做了某種「優化」。 outerHTML將獲得的屬性的順序和屬性與原始代碼中的不同。 IE通過「優化」解析HTML代碼,我們後來看到的代碼沒有更多value=""。所以jQuery的任何技巧都不能幫助我們獲得更多的現有屬性。

相關問題