【问题标题】:Javascript error with checking if a object has a property检查对象是否具有属性的Javascript错误
【发布时间】:2012-10-14 04:56:28
【问题描述】:

我有一个对象,我将它存储在一个 cookie 中,然后获取该对象并将其用于一些检查,这很好,但我遇到的问题都在于该行

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

$(".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 进行投票,我必须刷新页面。

有什么想法吗?

【问题讨论】:

  • 它是一个 JSON 对象,它只跟踪已投票的单个事物的 id。

标签: javascript jquery object properties comparison


【解决方案1】:

在您的代码中,您有:

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

【讨论】:

  • 所以我应该创建第二个变量,以便将其作为字符串发送到 cookie,并让 arr 保持安静?
  • 是的,应该这样做。因为您希望 arr 保留一个数组/对象以供下次使用。
  • 由于您没有使用arr 的字符串化版本,除了用于设置cookie,您不需要为它设置另一个变量。查看我的更新。
  • 是的,好的,看起来很棒!感谢您的建议!我还在习惯非类型敏感的语言。
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 2017-01-09
  • 2012-04-16
  • 2014-01-01
  • 2013-12-26
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多