Javascript 查找每个元素的data()键值对

Javascript 查找每个元素的data()键值对,javascript,jquery,jquery-data,Javascript,Jquery,Jquery Data,查看每个元素(在jQuery2.x中)的所有jQuery数据键值对的最佳方式是什么 面向选择的方法(例如,$('*').data())显然不起作用,因为返回值绑定到单个元素 我知道我可以迭代每个元素,检查每个元素的数据: var allData = []; $('html *').each(function() { if($.hasData(this)) { allData.push({ el: this, data: $(this).data() }) } })

查看每个元素(在jQuery2.x中)的所有jQuery
数据
键值对的最佳方式是什么

面向选择的方法(例如,
$('*').data()
)显然不起作用,因为返回值绑定到单个元素

我知道我可以迭代每个元素,检查每个元素的数据:

var allData = [];
$('html *').each(function() {
    if($.hasData(this)) {
        allData.push({ el: this, data: $(this).data() })
    }
})

这确实会产生预期的输出,但对每个可能的数据键进行迭代感觉像是对这个问题的倒退

是否有直接查找所有元素数据的方法


注意:我感兴趣的是调试,而不是生产代码。

您可以使用
$(“body*”)
选择body中的每个元素,并对其应用jQuery。工作示例:

var $elementsContainingData $("body *").filter(function() {
    if($.hasData(this)) return this;  
});
console.log($elementsContainingData);
编辑


正如前面提到的@spokey,jQuery对象中有一个名为“cache”的内部变量:
$.cache

此变量由一组包含“数据”或“事件”等键的对象组成:

您可以迭代该对象并筛选数据:

var filteredCache = $.each($.cache,function() {
        if(typeof this["data"] === "object") return this;
    });
下面是一个工作示例和一个函数,用于将这些内容合并到一个更方便的对象中,该对象仅由dataKey=>dataValue对组成:

编辑

如注释中所述,此解决方案在jQuery 2.x版中不起作用,因为
$.cache
已被弃用

我的最后一个建议是为jQuerys数据函数创建一个钩子,以便扩展自己的对象
$。dataCache={}每次调用
data()
时。 通过访问
$.fn.functionName
,可以扩展、替换或添加jQuerys函数:

$.fn.data = function(fn,hook) {
    return function() {
        hook.apply(this,arguments);
        return fn.apply(this,arguments);
    }
}($.fn.data,function(key,value) {
    var objReturn = {};
    objReturn[key] = value;
    $.extend($.dataCache,objReturn);
});

这在jQuery第2版中也非常有效:

jQuery使用数据创建一个内部缓存变量。我能看到这种情况发生的唯一方法是访问cache variable.yes。我已经阅读了一些源代码,它似乎隐藏了缓存变量,但我希望有人能知道得更好。谢谢你的回答。这回答了一些不同的问题—“使用jQuery数据查找所有元素”,而不是“在不迭代每个元素的情况下查找所有数据”。顺便说一句,您可以使用
return$.hasData(this)
更简洁。正如@spokey前面提到的,jQuery对象中有一个名为“cache”的内部变量:
$.cache
。此变量由一组对象组成,这些对象包含“数据”或“事件”等键。请参阅我的初始帖子,以了解更多详细信息和技巧。
$.cache
在jQuery1.x中存在,但在2.x中似乎已被弃用+1尽管如此,谢谢。这肯定是1.x的答案。我发布了另一个同样适用于jQuery2.x的解决方案。这是通过挂接data()函数来完成的。这看起来像ace。一条注释-不同元素上的重复键将被覆盖。有没有办法确定k/v对属于哪个元素?
$.fn.data = function(fn,hook) {
    return function() {
        hook.apply(this,arguments);
        return fn.apply(this,arguments);
    }
}($.fn.data,function(key,value) {
    var objReturn = {};
    objReturn[key] = value;
    $.extend($.dataCache,objReturn);
});