代码之家  ›  专栏  ›  技术社区  ›  Adam Kiss

由jquery元素组成的对象

  •  4
  • Adam Kiss  · 技术社区  · 15 年前

    现行规范

    我构建了一个函数来对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元素的“集合”,那么为set的每个元素存储一些数据的最简单方法是什么?

    4 回复  |  直到 15 年前
        1
  •  2
  •   Pointy    15 年前

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

        2
  •  2
  •   Adam Kiss    15 年前

    啊,已经解决了:)

    最新版本:

    这是稍微简化的代码:

    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 支持。

        3
  •  1
  •   prodigitalson    15 年前

    我认为当你以这种方式处理一个收藏品,你添加一个项目…如果它还没有用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);
    }
    
        4
  •  1
  •   karim79    15 年前

    是因为你的两个属性之间漏掉了一个逗号吗?

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

    (我怀疑,但觉得有必要指出)

    这很管用,而且比较整洁(至少在国际海事组织中是这样的):

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