Javascript 如何区分空字符串和不存在的值?
当我有这样的HTML时:Javascript 如何区分空字符串和不存在的值?,javascript,jquery,html,Javascript,Jquery,Html,当我有这样的HTML时: <input type="text" id="a" value="" /> <input type="text" id="b" /> 如果执行$(“#a”).val()操作,我无法区分是否存在值,该值是否为空或是否不存在值。有没有办法区分这两种情况?是的,您可以检查值是否存在 $(“#a[value]”)这意味着查找id为a且具有属性value 如果要在选择元素后进行检查,如果元素具有值属性,则 var elem = $('#a'); if
<input type="text" id="a" value="" />
<input type="text" id="b" />
如果执行
$(“#a”).val()
操作,我无法区分是否存在值,该值是否为空或是否不存在值。有没有办法区分这两种情况?是的,您可以检查值是否存在
$(“#a[value]”)
这意味着查找id为a
且具有属性value
如果要在选择元素后进行检查,如果元素具有值
属性,则
var elem = $('#a');
if ( elem.is('[value]') ) {
// it has a value attribute
}
您可以使用以下选项:
$( '#a' ).is( '[value]' ) // true
$( '#b' ).is( '[value]' ) // false
实时演示:旧版本的IE不支持hasAttribute
,因为即使是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");
不幸的是,在InternetExplorer8和更低版本中,这仍然不是很健壮。对于不同的属性,这些浏览器会返回误报和否定,不幸的是,我不相信有解决办法 这是一个好问题,但我认为在IE8或早期中,您将无法获得任何解决方法。在我做了一些实验之后,我想是的。顺便说一下,你可以用自己安装的IE9或IE10测试版进行实验。只需使用meta
“X-UA-Compatible”即可更改文档兼容性模式(请参阅)
我测试了:
document.getElementById("a").outerHTML = "<input type='text' id='a' value='' />";
alert(document.getElementById("a").outerHTML);
在“IE=8”的情况下,上面的代码显示文本“
”。如果我们将“X-UA-Compatible”
的值更改为“IE=7”,我们甚至会看到“实际的区别是什么?我有一个“日期”输入,必须设置为今天。如果日期没有任何值,则它有一个值=”“必须留空注意,所有发布的解决方案都不能在IE8中工作……您检查过IE的不同版本吗?@ŠimeVidas:wird-我本以为它能在IE8中工作,IE8支持hasAttribute()
。IE 7和更低版本不支持hasAttribute
,更糟糕的是,属性
集合预先填充了一个可能的属性列表。@并且IE9实现了hasAttribute
,但没有IE8-。@ŠimeVidas:Wikipedia再次失败-。我已经测试过了,它肯定在IE8中。@Andy啊哈,好的。我的机器上只有IE9,我可以在IE9兼容性视图中确认它失败。不幸的是,如果属性不存在,这将在IE7和更低版本中给出误判。+1,很酷的解决方法。它将丢失没有值的属性。。(如多个
用于选择
元素,选中
用于收音机/复选框等),但它看起来很棒!也许在最后一部分使用正则表达式会使它更强大。@Gaby:事实上,我没有想到布尔属性。如果你不使用这个值,非布尔属性就会被规范化,我想这就是我不喜欢的地方。看起来我必须写一个正则表达式并更新我正在使用的代码…:-)仔细想想,如果属性的名称包含在任何其他属性的值中,这样的正则表达式可能会给出一个误判。既然这段代码可以回答这个问题,我就让它保持原样,看看我能不能在我的项目中找到一个更健壮的解决方法。这在InternetExplorer8.0上不起作用。hasAttribute(el,“value”)总是为
@Ivan返回false:你说得对,IE 8中似乎有一个bug,它为已定义但为空的属性返回false。我修改了代码,并在IE8中快速测试了它,效果很好。直到星期一我才有时间做得更彻底,但我不能预见会有任何问题。无论如何,我希望它能为你解决这个问题。
<!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>