forked from RubyLouvre/mass-Framework
-
Notifications
You must be signed in to change notification settings - Fork 0
/
data_neo.js
123 lines (120 loc) · 4.38 KB
/
data_neo.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
//==================================================
// 数据缓存模块(本模块只是用于试验WeakMap与Element.dataset)
//==================================================
define( "data", ["lang"], function( $ ){
var caches = new WeakMap;//FF6+
function innerData( owner, name, data, pvt ) {//IE678不能为文本节点注释节点添加数据
var table = caches.get( owner );
if(!table){
table = {
data:{}
}
caches.set(table);
}
var getOne = typeof name === "string", cache = table;//dataset
//私有数据都是直接放到table中,普通数据放到table.data中
if ( !pvt ) {
table = table.data;
}
if ( name && typeof name == "object" ) {
$.mix( table, name );//写入一组方法
}else if(getOne && data !== void 0){
table[ name ] = data;//写入单个方法
}
if(getOne){
if(name in table){
return table[name]
}else if( !pvt && owner && owner.nodeType === 1){
//对于用HTML5 data-*属性保存的数据, 如<input id="test" data-full-name="Planet Earth"/>
//我们可以通过$("#test").data("full-name")或$("#test").data("fullName")访问到
return $.parseData( owner, name, cache );
}
}else{
return table
}
}
function innerRemoveData( owner, name, pvt ){
var table = caches.get(owner);
if ( !table ) {
return;
}
var ret = typeof name == "string", cache = table;
if ( table && ret ) {
if(!pvt){
table = table.data
}
if(table){
ret = table[ name ];
delete table[ name ];
}
}
if( JSON.stringify(cache) == '{"data":{}}'){
$["@data"]["delete"](owner);
}
return ret;
}
$.mix( {
hasData: function( target ) {
return caches.has(target);////判定是否关联了数据
},
data: function( target, name, data ) { // 读写用户数据
return innerData(target, name, data);
},
_data: function(target,name,data){//读写私有数据
return innerData(target, name, data, true);
},
removeData: function(target, name){ //移除用户数据
return innerRemoveData(target, name);
},
_removeData: function(target, name){//移除私有数据
return innerRemoveData(target, name, true);
},
parseData: function(target, name, table, value){
var data, key = $.String.camelize(name),_eval
if(table && (key in table))
return table[key];
value = target.dataset[key]
if ( typeof value === "string") {//转换 /^(?:\{.*\}|null|false|true|NaN)$/
if(/^(?:\{.*\}|\[.*\]|null|false|true|NaN)$/.test(value) || +value + "" === value){
_eval = true
}
try {
data = _eval ? eval("0,"+ value ) : value
} catch( e ) {
data = value
}
if(table){
table[ key ] = data
}
}
return data;
},
//合并数据
mergeData: function( cur, src){
if( $.hasData(cur) ){
var oldData = $._data(src),
curData = $._data(cur),
events = oldData.events;
if(events){
curData.events = [];
for (var i = 0, item ; item = events[i++]; ) {
$.event.bind( cur, item );
}
}
}
}
});
});
/**
2011.9.27 uniqueID改为uniqueNumber 简化data与removeData
2011.9.28 添加$._data处理内部数据
2011.10.21 强化mergeData,可以拷贝事件
2012.1.31 简化$.Object.merge的调用
2012.4.5 修正mergeData BUG, 让$.data能获取HTML5 data-*
2012.5.2 $._db -> $["@data]
2012.5.21 抽象出validate私有方法
2012.9.29 对parseData的数据进行严格的验证后才转换
2012.11.7 添加这实验性质的模块
2012.11.14 使用JSON.stringify代替双层循环检测缓存体是否为空
2013.1.3 保持与data模块的接口一致
*/