-
Notifications
You must be signed in to change notification settings - Fork 8
/
core.js
77 lines (63 loc) · 1.49 KB
/
core.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
'use strict';
var isEmptyObject = require("../../js/is-empty-object/is-empty-object");
var data = {};
var expando = "can" + new Date();
var uuid = 0;
// set data for an element
// returns true if this is the first data for this element
// so that caller can track number of elements with data set
var setData = function(name, value) {
var id = this[expando] || (this[expando] = ++uuid),
store = data[id],
newStore = false;
if (!data[id]) {
newStore = true;
store = data[id] = {};
}
if (name !== undefined) {
store[name] = value;
}
return newStore;
};
// delete this node's `data`
// returns true if the node was deleted.
var deleteNode = function() {
var id = this[expando];
var nodeDeleted = false;
if(id && data[id]) {
nodeDeleted = true;
delete data[id];
}
return nodeDeleted;
};
/*
* Core of domData that does not depend on mutationDocument
* This is separated in order to prevent circular dependencies
*/
module.exports = {
_data: data,
getCid: function() {
return this[expando];
},
cid: function(){
return this[expando] || (this[expando] = ++uuid);
},
expando: expando,
get: function(key) {
var id = this[expando],
store = id && data[id];
return key === undefined ? store || setData(this) : store && store[key];
},
set: setData,
clean: function(prop) {
var id = this[expando];
var itemData = data[id];
if (itemData && itemData[prop]) {
delete itemData[prop];
}
if(isEmptyObject(itemData)) {
deleteNode.call(this);
}
},
delete: deleteNode
};