Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何区分空字符串和不存在的值?_Javascript_Jquery_Html - Fatal编程技术网

Javascript 如何区分空字符串和不存在的值?

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

当我有这样的HTML时:

<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>