开发者

object consisting of jQuery element

开发者 https://www.devze.com 2022-12-25 10:12 出处:网络
current code I\'ve built function to do something over collection of jQuery elements: var collection = $([]); //empty collection

current code

I've built function to do something over collection of jQuery elements:

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

I add them with:

collection = collection.add(e);

and remove with:

collection = collection.not(e);

It's pretty straightforward solution, works nicely.

problem

Now, I would like to have an object consisting of various settings set to any jQuery element, i.e.:

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

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

But when I pass jQuery object/element to function (i.e. as e), calling e.data doesn'开发者_开发技巧t work, although it would be simplest and really nice solution.

question

If I have an "collection" of jQuery elements, what is the simplest way of storing some data for each element of set?


If those "elements" are actual DOM elements (nodes), then can't you just use $(e).data(...)?


Ah, solved it already :)

last version:

This is somewhat simplified code:

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

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

solution

Problem was, that I wanted to keep myself option to add element via $('element'), 'element', or $(this), so I had to add typeof check before setting data - the same way jQuery works.

if I'm adding element as selector only, it's $(e), if I'm adding jQuery object, it's e:

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

So you all get upvote, and I'll pick myself as a winner in two days, so anyone who will stumble upon this question will know what to do (clearly, tested, works :]) and why :)

Edit: note: This probably isn't final version - I have read more documentation, so this setData function supports all types which jQuery.add supports.


I think the problwm ia when youre dealing with a collection in this fashion and you add an item... if it hasnt been wrapped with jquery yet it wont be. Thus, when accessed again its simply the raw element.

If i am correct in this line of thinking an e is infact a dom element/node (or its string representation) then a simple $(e) should give you access to its data method.

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

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


Is it because you've missed a comma between your two properties?

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

(I doubt it, but felt the need to point it out)

This works, and is somewhat neater (IMO at least):

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

精彩评论

暂无评论...
验证码 换一张
取 消