4

当前代码

我已经构建了函数来对 jQuery 元素的集合做一些事情:

var collection = $([]); //empty collection

我将它们添加到:

collection = collection.add(e);

并删除:

collection = collection.not(e);

这是非常简单的解决方案,效果很好。

问题

现在,我想要一个由各种设置组成的对象,设置为任何 jQuery 元素,即:

function addObject(e){
  var o = {
    alpha: .6 //float
    base: {r: 255, g: 255, b: 255} //color object
  }

  e.data('settings', o);
}

但是当我将 jQuery 对象/元素传递给函数(即 as e)时,调用e.data不起作用,尽管这将是最简单且非常好的解决方案。

问题

如果我有一个 jQuery 元素的“集合”,那么为集合的每个元素存储一些数据的最简单方法是什么?

4

4 回答 4

2

如果这些“元素”是实际的 DOM 元素(节点),那么您不能只使用$(e).data(...)吗?

于 2010-03-31T12:35:47.943 回答
2

啊,已经解决了:)

最后一个版本:

这是一些简化的代码:

function setData(e,key,data){
  if(typeof(e)==string){ e = $(e); }

   $(e).data(key,data);
}

解决方案

问题是,我想保留通过$('element'),'element'或来添加元素的选项$(this),所以我必须typeof在设置数据之前添加检查 - 与 jQuery 的工作方式相同。

如果我只添加元素作为选择器,它是$(e),如果我添加jQuery 对象,它是e

function setData(e,key,data){
  if(typeof(e)==string){
    $(e).data(key,data);
  }else{
    e.data(key,data);
  }
}

所以你们都得到了投票,我会在两天内把自己选为赢家,所以任何偶然发现这个问题的人都会知道该怎么做(显然,经过测试,有效:])以及为什么:)

编辑:注意:这可能不是最终版本——我已经阅读了更多文档,所以这个setData函数支持所有支持的类型jQuery.add

于 2010-03-31T12:44:25.133 回答
1

我认为问题在于,当您以这种方式处理集合并添加项目时……如果它没有用 jquery 包装,但它不会。因此,当再次访问它时,它只是原始元素。

如果我在这方面的想法是正确的,那么 ane实际上是一个 dom 元素/节点(或其字符串表示形式),那么一个简单的$(e)应该可以让您访问它的data方法。

function addObject(e){
  var o = {
    alpha: .6 //float
    base: {r: 255, g: 255, b: 255} //color object
  }

  $(e).data('settings', o);
}
于 2010-03-31T12:36:11.527 回答
1

是因为您错过了两个属性之间的逗号吗?

  var o = {
    alpha: .6 <-- here 
    base: {r: 255, g: 255, b: 255} 
  }

(我对此表示怀疑,但觉得有必要指出这一点)

这行得通,而且更整洁(至少在 IMO):

    $.fn.addObject = function(){
        var o = {
            alpha: .6, //float
            base: {r: 255, g: 255, b: 255} //color object
        }
         $(this).data('settings', o);
    };

    // simple test
    $("div").addObject();
    alert($("div").data("settings").alpha); // alerts 0.6
于 2010-03-31T12:36:46.197 回答