0

我想要一个status基于 DOM 中存在的元素返回 true/false 的对象。我无法让变量实际保持加载页面状态以外的状态。我的最后一次尝试相当愚蠢,结果是Maximum call stack size exceeded,这是意料之中的。有什么方法可以让这些变量随 DOM 改变?

var navigation = function runNav(){
  runNav();
  var navigation = {
    globe : {
      element : $("#icons .globe"),
      status : (function(){
        return ($(".window_stable.globe").length == 1) ? true : false;
      })()
    },
    cart : {
      element : $("#icons .cart"),
      status : (function(){
        return ($(".window_stable.cart").length == 1) ? true : false
      })()
    },
    phone : {
      element : $("#icons .phone"),
      status : (function(){
        return ($(".window_stable.phone").length == 1) ? true : false
      })()
    }
  }
  return navigation;
}();

例子

navigation.cart.status
false
-- Enabled the element
navigation.cart.status
false
($(".window_stable.cart").length == 1) ? true : false
true
4

3 回答 3

2

runNav()您应该在代码开头删除对的调用。它导致无限递归循环。除此之外,您的代码看起来不错。

于 2012-09-17T18:12:06.700 回答
1

我想我明白你想要做什么。我认为您希望status每次访问该status属性时都运行您定义的功能。

据我所知,我认为你不能仅仅通过将其作为财产来做到这一点。我认为你需要使它成为一个功能。

像这样:(jsFiddle

var navigation = {
    globe: {
        element: $("#icons .globe"),
        getStatus: function() { return ($(".window_stable.globe").length > 0); }
    },
    cart: {
        element: $("#icons .cart"),
        getStatus: function() { return ($(".window_stable.cart").length > 0); }
    },
    phone: {
        element: $("#icons .phone"),
        getStatus: function() { return ($(".window_stable.phone").length > 0); }
    }
};

alert("status = "+ navigation.cart.getStatus());
于 2012-09-17T18:31:13.713 回答
1

您看到的问题是因为正在立即设置“状态”属性。因此,如果导航对象在这些元素添加到 DOM 之前被初始化,“状态”将始终为 false。

如果您像访问属性一样无法访问“状态”,则可以使用以下Object.defineProperty模式:http: //jsfiddle.net/TFVFS/

var navigation = (function runNav(){
    var navigation = {
        globe : {
            element : $("#icons .globe")
        },
        cart : {
            element : $("#icons .cart")
        },
        phone : {
            element : $("#icons .phone")
        }
    };

    Object.defineProperty(navigation.globe, "status", {
        get:function(){return $(".window_stable.globe").length == 1 ? true : false;}   
    });
    Object.defineProperty(navigation.cart, "status", {
        get:function(){return $(".window_stable.cart").length == 1 ? true : false;}   
    });
    Object.defineProperty(navigation.phone, "status", {
        get:function(){return $(".window_stable.phone").length == 1 ? true : false;}   
    });
    return navigation;
})();

console.log(navigation.cart.status);
console.log(navigation.globe.status); 
console.log(navigation.phone.status);  

这不完全向后兼容,并且在 IE 9 之前的版本中不完全支持。

@Travesty3 的答案将向后兼容,但需要更改语法。就个人而言,如果您需要支持 9 之前的 IE 版本,我会推荐他的答案。

于 2012-09-17T18:50:27.563 回答