объект, состоящий из элемента jQuery - PullRequest
4 голосов
/ 31 марта 2010

текущий код

Я построил функцию для выполнения чего-либо над коллекцией элементов 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, какой самый простой способ хранения некоторых данных для каждого элемента множества?

Ответы [ 4 ]

2 голосов
/ 31 марта 2010

Ах, уже решил:)

последняя версия:

Это несколько упрощенный код:

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.

2 голосов
/ 31 марта 2010

Если эти "элементы" являются фактическими DOM-элементами (узлами), то нельзя ли просто использовать $(e).data(...)?

1 голос
/ 31 марта 2010

Это потому, что вы пропустили запятую между двумя свойствами?

  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
1 голос
/ 31 марта 2010

Я думаю, что проблема заключается в том, что вы имеете дело с коллекцией таким способом и добавляете элемент ... если он еще не был упакован в 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);
}
...