javascript - jQuery $.data() 函数的 Vanilla 替代品 : any native javascript alternative?

标签 javascript jquery

我通常避免在我的脚本中包含 jQuery 库,但是我最近才发现 jQuery $.data() 的函数能够关联数据,以键值对、对象甚至函数的形式,与任何元素。

据我所知,jQuery 的 $.data() 函数还内置了保护措施,可以防止与此类做法相关的内存泄漏,但是为该单个函数包含整个 JQ 库就有点过分了。

有人知道原生替代品吗?

编辑 为了让自己更清楚,我不是在寻找检索元素属性的 native 函数。 jQuery 的 $.data() API 远远超出了这种用途,扩展到将 javascript 对象和函数与 jQuery 元素节点相关联的能力。

本文 ( http://tutorialzine.com/2010/11/jquery-data-method/ ) 涉及这种用法,但作为示例,我目前正在使用它来将 GSAP 时间轴动画与对象相关联,以便我可以在外部访问和调用 GSAP 时间轴的 .reverse() 动画函数它所创建的功能。例如:

function doAnimation(){
    var element = document.createElement('div'),
        timeline = new TimelineMax({....GSAP related fns...}),
        options = {
            ....
            timeline: timeline
        };
   $(element).data('options', options);
}


function reverseAnimation($element){
    var options = $element.data('options'),
        previouslyCreatedTimeline = options.timeline;

    previouslyCreatedTimeline.reverse();
}

如果您不是 GSAP 的用户,这可能不是最清楚的示例,但本质上,$.data() 方法允许我将 javascript 对象与元素相关联,以便我可以在函数中访问它的方法超出其原始范围。

最佳答案

我已经围绕 WeakMap 和 Map 编写了一个包装器,它应该可以完成这项工作。 WeakMap 的好处在于,一旦元素被删除,该值就会被垃圾回收。这应该可以避免内存泄漏。

/** A storage solution aimed at replacing jQuerys data function.
 * Implementation Note: Elements are stored in a (WeakMap)[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap].
 * This makes sure the data is garbage collected when the node is removed.
 */
window.dataStorage = {
    _storage: new WeakMap(),
    put: function (element, key, obj) {
        if (!this._storage.has(element)) {
            this._storage.set(element, new Map());
        }
        this._storage.get(element).set(key, obj);
    },
    get: function (element, key) {
        return this._storage.get(element).get(key);
    },
    has: function (element, key) {
        return this._storage.has(element) && this._storage.get(element).has(key);
    },
    remove: function (element, key) {
        var ret = this._storage.get(element).delete(key);
        if (!this._storage.get(element).size === 0) {
            this._storage.delete(element);
        }
        return ret;
    }
}

像这样使用它:

var myElement = document.getElementById("myId");
dataStorage.put(myElement, "myKey", "myValue");

这比 $.data() 快得多,但仍然比将信息作为属性存储在元素上慢一点。

关于javascript - jQuery $.data() 函数的 Vanilla 替代品 : any native javascript alternative?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29222027/

相关文章:

javascript - 在 jQuery 中追加

javascript - 使用 jquery 无限滚动自动加载设置的 tumblr 页面数

javascript - Gulp watch - 按顺序执行任务(同步)

javascript - 如何在 mongo shell 中显示 "require(module)"

javascript - 在 Javascript 中使用 Jinja2 模板的最佳方式?

javascript - 如何将razor变量传递给js

javascript - 如何从 DOM 中警告该数组的值

JavaScript 正则表达式 : replace text in string between two "markers"

jquery - 对新元素使用现有处理程序

jquery - 使用 jQuery 更改输入字段的类型(文本 -> 密码)