當我有一個這樣的HTML:如何區分空字符串和不存在的值?
<input type="text" id="a" value="" />
<input type="text" id="b" />
如果我做了$("#a").val()
如果存在價值,這是空的或者沒有價值存在我無法分辨。有什麼辦法可以區分這兩種情況嗎?
當我有一個這樣的HTML:如何區分空字符串和不存在的值?
<input type="text" id="a" value="" />
<input type="text" id="b" />
如果我做了$("#a").val()
如果存在價值,這是空的或者沒有價值存在我無法分辨。有什麼辦法可以區分這兩種情況嗎?
是的,你可以檢查是否存在value
屬性。
$('#a[value]')
這意味着找到ID a
也有屬性的元素value
如果您要檢查您所選擇的元素之後,如果它有一個value
屬性,那麼
var elem = $('#a');
if (elem.is('[value]')) {
// it has a value attribute
}
這將給IE7帶來誤判,並且在屬性不存在的情況下會降低,遺憾的是。 –
@安迪..謝謝你的擡頭.. –
你可以用這個:
$('#a').is('[value]') // true
$('#b').is('[value]') // false
Live de de mo:http://jsfiddle.net/simevidas/w8gFF/1/
你有沒有檢查過是不同版本的IE瀏覽器? – RobG
@RobG它可以在IE9中使用,但不能在IE8中使用...... –
@ŠimeVidas:奇怪 - 我曾預料它可以在支持'hasAttribute()'的IE 8中工作。 IE 7及更低版本不支持'hasAttribute',更糟糕的是,'attributes'集合預先填充了一系列可能的屬性。 –
老版本的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,很酷的解決方法。它會丟失沒有值的屬性..(*'''''''''''''''''''''''''''選擇'元素'''''選中'收音機/複選框等。*)但它看起來很棒!也許使用正則表達式的最後一部分將使其更強大.. –
@Gaby:的確,我沒想過布爾屬性。非布爾屬性是標準化的,如果你離開的價值,我認爲這是扔了我。看起來我必須編寫一個正則表達式並更新我使用的代碼... :-) –
想想看,如果屬性的名稱包含在其他屬性中,這樣的正則表達式可能會帶來誤判值。由於這段代碼對於這個問題來說很好,所以我會保持原樣,看看我能否在我擁有的項目中獲得更強大的解決方法。 –
這是一個很好的問題,但我認爲你不會在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的任何技巧都不能幫助我們獲得更多的現有屬性。
實際區別是什麼? –
我有一個「日期」輸入,必須設置爲今天的日期,如果沒有任何價值。如果它有一個值=「」它必須保持空 – Ivan
請注意,沒有任何發佈的解決方案在IE8中工作...... –