我已经构建了一些函数来对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对象/元素传递给函数(即e
)时,调用e.data
不起作用,尽管它是最简单且非常好的解决方案。
如果我有一个jQuery元素的“集合”,那么为集合的每个元素存储一些数据的最简单方法是什么?
答案 0 :(得分:2)
如果这些“元素”是实际的DOM元素(节点),那么你不能只使用$(e).data(...)
吗?
答案 1 :(得分:2)
啊,已经解决了:)
这是一些简化的代码:
function setData(e,key,data){
if(typeof(e)==string){ e = $(e); }
$(e).data(key,data);
}
问题是,我想让自己选择通过$('element')
,'element'
或$(this)
添加元素,因此我必须在设置数据之前添加typeof
检查 - 就像jQuery一样工作。
如果我将元素添加为选择器,则为$(e)
,如果我添加 jQuery对象,则为e
:< / p>
function setData(e,key,data){
if(typeof(e)==string){
$(e).data(key,data);
}else{
e.data(key,data);
}
}
所以你们都得到了投票,我会在两天内选择自己作为胜利者,所以任何偶然发现这个问题的人都会知道该怎么做(明确,经过测试,有效:])以及为什么:)
编辑:注意:这可能不是最终版本 - 我已阅读更多文档,因此此setData
函数支持jQuery.add
支持的所有类型。
答案 2 :(得分:1)
我认为问题是当你以这种方式处理一个集合并且你添加一个项目...如果它还没有被jquery包裹但它不会。因此,当再次访问时,它只是原始元素。
如果我在这个思路中是正确的,e
实际上是一个dom元素/节点(或其字符串表示),那么一个简单的$(e)
应该可以让你访问它的data
方法
function addObject(e){
var o = {
alpha: .6 //float
base: {r: 255, g: 255, b: 255} //color object
}
$(e).data('settings', o);
}
答案 3 :(得分: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