2

正在发生的事情的示例:

> $('#start_date').dateTime = {bacon:5, myFunc: function() { ... }}
Object {bacon: 5, myFunc: function}
> $('#start_date').dateTime
undefined

如果我使用相同的选择器,我希望能够检索我的“培根”对象。

我知道$()每次都返回一个不同的对象-有解决方法吗?

我知道我可以使用.data,但 API 不是很好。我不得不这样做$('#start_date').data('dateTime').myFunc()而不是$('#start_date').dateTime.myFunc().

4

3 回答 3

2

如果你这样做,你会感觉好一点吗?

$('#start_date').data().dateTime.myFunc()


或者,您可以扩展 jQuery 以使您的生活更轻松,或者让 jQuery 以您喜欢的方式工作

在这里,我为您量身定制了一个小插件,以便您可以传入一个点符号字符串来检索您想要的数据。在这种情况下,它返回一个函数,所以我们可以直接调用它。

演示:http: //jsfiddle.net/terryyounghk/8tWLn/

插件代码

// Small plugin
$.fn.myData = function (namespace) {
    var namespaces = namespace.split('.'),
        data = this.data();
    $.each(namespaces, function (i, that) {
        data = data[that];
    });
    return data;
}

使用示例

// set your data
$('#start_date').data('dateTime', {
    bacon:5, 
    myFunc: function() { 
        alert('mmm, bacon') 
    }
});


// call your function, note the dot notation
$('#start_date').myData('dateTime.myFunc')(); // better?

这里的哲学是,如果我们不断重复一些事情,那么一定有一些愚蠢的事情发生。有没有办法扩展 jQuery 让我的生活更轻松?你来做法官。

就个人而言,我不喜欢这个插件。如果我正在编写单行代码,我更喜欢我的第一个建议。但谁知道呢?你可能喜欢后者。

于 2013-04-26T16:56:28.043 回答
1

您可以将属性添加到 DOM 元素,而不是 jQuery 对象:

$('#start_date')[0].dateTime = {bacon:5};
console.log($('#start_date')[0].dateTime);

或者您可以使用选择器作为键来维护某种字典。但是,调用仍然不是很时尚,并且值与 DOM 无关:

//for example save your data by id attribute
DOMData[$('someselector').attr('id')].dateTime = {bacon: 5}; 
于 2013-04-26T16:40:56.870 回答
1

将数据与 DOM 元素关联的 jQuery 方法是使用以下data方法

$('#start_date').data('dateTime', {bacon:5, myFunc: function() { ... }});

设置数据后,您可以调用:

baconTime = $('#start_date').data('dateTime');
baconTime.myFunc();

就 API 而言,它与 jQuery api 的其余部分保持一致,其中访问器版本为:

$(...).method(key);

突变器版本是:

$(...).method(key, value);
于 2013-04-26T17:05:40.153 回答