检查对象是否具有属性的Javascript错误

时间:2012-10-14 04:56:29

标签: javascript jquery object properties comparison

我有一个对象,我存储在一个cookie中,然后获取该对象并使用它进行一些检查,这很好,除了我所拥有的问题之外的所有问题

if(!arr.hasOwnProperty($(this).val())){

in

$(".not").click(function() {
//alert($(this).val()+JSON.stringify(arr));
    if(!arr.hasOwnProperty($(this).val())){
    $.getJSON("<?php echo BASE_URL;?>json/startup/not", {id: $(this).val()}, function(json){
    if(json.status == "OK"){
        arr[json.data.id] = json.data.id;
        arr = JSON.stringify(arr);
        $.cookie('votedId', arr);
        $('#percent'+json.data.id).html(json.data.percent);
        $('#votes'+json.data.id).html(json.data.votes);
    }
    });
    }else{
        alert("Already voted on this startup!");
    }
    //alert($(this).val());
});

当我第一次这样做时,它意识到传递的值没有属性,并让投票发生。然后它不会让它投票,因为它应该。

问题是,在页面上的其他元素上,他们可以投票然后说传入的id有一个属性,即使它不存在,在第一个元素被投票之后。如果我刷新页面,它可以让我投票。

仅仅因为我觉得上面的解释有点难以理解,让我举一个例子。

我投票热得多,投票不多。第一个的id是1,第二个是2,依此类推。我投票认为1很热,因此cookie和arr数组更新为具有属性1,因此无法再次投票。然而,在那之后,所有其他事情都说他们也被投了票,即使他们没有。所以现在我不能投票2.但如果我刷新页面就没关系了。但是如果我想对元素3进行投票,那么我必须刷新页面。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

在您的代码中,您有:

...
arr[json.data.id] = json.data.id;
arr = JSON.stringify(arr); // <-- this is likely the reason for the error
...

上面的第二行会将您的arr变量覆盖为字符串。第二次,它是你要调用的字符串对象.hasOwnProperty(...) - 这将导致JS错误。

这应解决它:

...
arr[json.data.id] = json.data.id;
// arr = JSON.stringify(arr); // drop this line
$.cookie('votedId', JSON.stringify(arr)); // assign directly without overwriting arr
...