3 回答
TA贡献1818条经验 获得超3个赞
如果节点是可变的,我们可以尝试为每个节点创建并为其分配唯一的ID:
function NodeStore() {
this.nodesValueMap = {};
this.lastId = 0;
}
NodeStore.prototype.set = function(node, value) {
// text nodes do not have dataset (DOMStringMap), create simple object
node.dataset = node.dataset || {};
node.dataset.uniqueId = node.dataset.uniqueId || ++this.lastId;
this.nodesValueMap[node.dataset.uniqueId] = value;
}
NodeStore.prototype.get = function(node) {
return node.dataset.uniqueId && this.nodesValueMap[node.dataset.uniqueId];
}
NodeStore.prototype.has = function(node) {
return !!(node.dataset.uniqueId && this.nodesValueMap[node.dataset.uniqueId]);
}
var textNode = document.querySelector("#a").childNodes[0];
var b = document.querySelector("#b");
var c = document.querySelector("#c");
var store = new NodeStore();
store.set(textNode, '1');
store.set(b, '2');
console.log(store.has(textNode), store.get(textNode));
console.log(store.has(b), store.get(b));
console.log(store.has(c), store.get(c));
<div id="a">asdf</div>
<div id="b"></div>
<div id="c"></div>
所有方法现在都将以O(1)的复杂度运行。
不必使用dataset
,我们可以在节点本身上写入唯一ID。
另一件事是,在同一页面上有多个商店的情况下,我们可能会发生ID冲突,其中每个商店可能会在同一节点上更改相同的属性。为了解决这个问题,我们可以在store salt的当前实例中添加一些唯一的实例,例如可以通过构造函数传递这些实例,然后将其用作前缀或后缀uniqueId
。
TA贡献1911条经验 获得超7个赞
function Store () {
this.store = {};
}
Store.prototype.set = function(node, v) {
this.store[node] = v;
}
Store.prototype.get = function(node) {
return this.store[node];
}
Store.prototype.has = function(node) {
return this.store[node] !== undefined
}
添加回答
举报