jQuery.data() 存储在哪里?

发布于 2024-11-04 02:27:29 字数 128 浏览 2 评论 0原文

jQuery 将设置为 DOM 对象的 data() 值存储在哪里?

是否有某种变量,例如 jQuery.dataDb 或其他变量,甚至可能是私有变量?

有什么办法可以访问这个对象吗?

Where does jQuery store the values of the data() that it sets to DOM objects?

Is there some kind of variable like jQuery.dataDb or something, maybe even something private?

Is there any way to gain access to this object?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

醉城メ夜风 2024-11-11 02:27:29

在内部,jQuery 创建一个名为 $.cache 的空对象,用于存储您通过 data 方法设置的值。您添加数据的每个 DOM 元素都会被分配一个唯一的 ID,该 ID 用作 $.cache 对象中的键。

Internally, jQuery creates an empty object called $.cache, which is used to store the values you set via the data method. Each DOM element you add data to, is assigned a unique ID which is used as a key in the $.cache object.

远山浅 2024-11-11 02:27:29

jQuery 以 3 种不同的方式为 3 种不同类型的对象获取或设置数据。

对于 DOM 元素,jQuery 首先获取一个唯一的 id,然后为元素创建一个名为 expando 的自定义属性:

var counter = 0;
function uid() {
    // only example
    return 'jQuery' + counter;
}
function getExpando(element) {
    var expando = element['jQueryExpando'];
    // for those without expando, create one
    if (!expando) {
        expando = element['jQueryExpando'] = uid();
    }
    return expando;
}

另一方面,jQuery 有一个 $.cache 对象,它存储每个元素的数据映射,jQuery 搜索$.cache by Expando 并获取某个元素的数据映射,获取或设置该映射中的数据:

function data(element, name, value) {
    var expando = getExpando(element);
    var map = $.cache[expando];

    // get data
    if (value === undefined) {
        return map && map[name];
    }
    // set data
    else {
        // for those without any data, create a pure map
        if (!map) {
            map = $.cache[expando] = {};
        }
        map[name] = value;
        return value;
    }
}

对于自定义对象(不是 DOM 元素或窗口对象),jQuery 直接通过名称从该对象设置或获取属性

function data(obj, name, value) {
    if (!obj) {
        return obj;
    }
    // get data
    if (value === undefined) {
        return obj[name];
    }
    // set data
    else {
        obj[name] = value;
        return value;
    }
}

:最后,对于特殊的窗口对象,jQuery 在闭包中有一个特殊的 windowData 变量来存储窗口的数据:

function data(obj, name, value) {
    if ($.isWindow(obj)) {
        obj = windowData;
    }
    // same as data for custom object
}

jQuery gets or sets data in 3 different ways for 3 different type of object.

For DOM element, jQuery first get a unique id, than create a custom property for element called expando:

var counter = 0;
function uid() {
    // only example
    return 'jQuery' + counter;
}
function getExpando(element) {
    var expando = element['jQueryExpando'];
    // for those without expando, create one
    if (!expando) {
        expando = element['jQueryExpando'] = uid();
    }
    return expando;
}

On the other hand, jQuery has a $.cache object which stores data map for each element, jQuery searches $.cache by expando and get a data map for certain element, getting or setting data in that map:

function data(element, name, value) {
    var expando = getExpando(element);
    var map = $.cache[expando];

    // get data
    if (value === undefined) {
        return map && map[name];
    }
    // set data
    else {
        // for those without any data, create a pure map
        if (!map) {
            map = $.cache[expando] = {};
        }
        map[name] = value;
        return value;
    }
}

For custom object(which is not DOM element or window object), jQuery directly set or get a property from that object by name:

function data(obj, name, value) {
    if (!obj) {
        return obj;
    }
    // get data
    if (value === undefined) {
        return obj[name];
    }
    // set data
    else {
        obj[name] = value;
        return value;
    }
}

At last, for the special window object, jQuery has a special windowData variable in closure to store data for window:

function data(obj, name, value) {
    if ($.isWindow(obj)) {
        obj = windowData;
    }
    // same as data for custom object
}
苏大泽ㄣ 2024-11-11 02:27:29

好吧,我想通了。

jQuery.expando 包含附加到每个元素的字符串,即 jQuery + new Date()

HTMLElement[jQuery.expando] 包含该元素的 data

jQuery.cache[HTMLElement[$.expando]] 包含元素

这是一个演示

Ok I figured it out.

jQuery.expando contains a string that's appended to each element which is jQuery + new Date()

HTMLElement[jQuery.expando] contains the key to that element's data

jQuery.cache[HTMLElement[$.expando]] contains the data on the element

Here is a demo

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文