HTML5数据属性为空,但javascript不同意这种情况

时间:2013-12-24 12:10:38

标签: javascript jquery html5

我正在尝试使用JavaScript创建一些功能,但JavaScript不同意逻辑。

在我的控制台中,我检查了我试图操作的元素,并且我有这个代码:

<input type="text" id="address" autocomplete="off" data-lat="" data-lng="">

然后我想检查data-latdata-lng属性是否为空。

在我的JavaScript文件中,我有以下代码:

$addressField.on(
    'blur',
    function()
    {
        console.assert($addressField.attr('data-lat') != '',    'Address latitude it is not empty');

        if($addressField.val() == '')
        {
            $addressField.attr('data-lat', '').attr('data-lng', '').val('');
        }
        else if($addressField.attr('data-lat') == '' || $addressField.attr('data-lng') == '')
        {
            $addressField.attr('data-lat', '').attr('data-lng', '').val('');
        }
    }
)

当我加载页面时,我在控制台中收到以下消息:

Assertion failed: Address latitude it is not empty

我做错了吗?或者只是JavaScript得到理智?

更新#1

我很抱歉,但我没有说明我在$addressField的模糊事件上运行此代码。我修改了代码,以便了解实际的代码。

更新#2

大多数人都在console.assert上有堆叠,但即使我不使用console.assertelse if( .... )语句也会再次变为false,而第二个块不会执行。

console.assert仅用于帮助我确定问题。

3 个答案:

答案 0 :(得分:1)

在Javascript中,比较运算符==和===表示不同的东西。最佳做法是在几乎所有情况下都避免使用==并使用===。

答案 1 :(得分:1)

这是确切的行为。

由于值为空,$addressField.attr('data-lat') != '' false ,因此断言正在执行。这是对的。

这是消息以Chrome格式记录的方式,请查看此docs

如果指定的表达式为false,则将消息与堆栈跟踪一起写入控制台。

答案 2 :(得分:1)

关于UPDATE #2

@Praveen Jeganathan已经断言你的断言失败了,这意味着$addressField.attr('data-lat') != ''false。这意味着$addressField.attr('data-lat') 的值相等(或可以评估)为''(即为空),因此第一个 if 语句为 true ,第一个块被执行:

if($addressField.val() == '') //this expression is true
{
    //this code is going to be executed
    $addressField.attr('data-lat', '').attr('data-lng', '').val('');
}
else if($addressField.attr('data-lat') == '' || $addressField.attr('data-lng') == '')
{
    //this block it's not going to be executed, because the first one
    //was, EVEN THOUGH the expression from this if statement
    //evaluates to TRUE
    $addressField.attr('data-lat', '').attr('data-lng', '').val('');
}

这与写作相同:

var someVar = 5;
if(someVar === 5) { /* Do something here */}
else if(someVar === 5) {
    //How am I going to execute this code!?!
    //The first one will always get executed
    //If the first one will not get executed, I will never be executed too.
}