-
Notifications
You must be signed in to change notification settings - Fork 16
/
index.js
139 lines (106 loc) · 3.07 KB
/
index.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
// nameStorage
//
// 利用 window.name 实现跨页面跨域的数据传输。
var win = window;
var SCHEME = "nameStorage:";
//var RE_NAMES = /^nameStorage:([^?]*)(?:\?(?:([^=]+)=([^&]*))*)?/g;
var RE_PAIR = /^([^=]+)(?:=(.*))?$/;
var Q = "?";
var EQ = "=";
var AND = "&";
var encode = encodeURIComponent;
var decode = decodeURIComponent;
var STORAGE = {};
var ORIGIN_NAME;
var data = {};
var nameStorage = {};
// 解析并初始化 name 数据。
// 标准的 nameStorage 数据格式为 `nameStorage:origin-name?key=value`
// @param {String} name.
(function parse(name){
if(name && name.indexOf(SCHEME)===0){
var match = name.split(/[:?]/);
match.shift(); // scheme: match[0];
ORIGIN_NAME = decode(match.shift()) || ""; // match[1]
var params = match.join(""); // match[2,...]
var pairs = params.split(AND);
for(var i=0,pair,key,value,l=pairs.length; i<l; i++){
pair = pairs[i].match(RE_PAIR);
if(!pair || !pair[1]){continue;}
key = decode(pair[1]);
value = decode(pair[2]) || "";
STORAGE[key] = value;
}
}else{
ORIGIN_NAME = name || "";
}
})(win.name);
// 写入数据。
// @param {String} key, 键名。
// @param {String} value, 键值。
nameStorage.setItem = function(key, value){
if(!key || "undefined"===typeof value){return;}
STORAGE[key] = String(value);
save();
};
// 读取数据。
// @param {String} key, 键名。
// @return {String} 键值。如果不存在,则返回 `null`。
nameStorage.getItem = function(key){
return STORAGE.hasOwnProperty(key) ? STORAGE[key] : null;
};
// 移除数据。
// @param {String} key, 键名。
nameStorage.removeItem = function(key){
if(!STORAGE.hasOwnProperty(key)){return;}
STORAGE[key] = null;
delete STORAGE[key];
save();
};
// 清空 nameStorage。
nameStorage.clear = function(){
STORAGE = {};
save();
};
nameStorage.valueOf = function(){
return STORAGE;
};
nameStorage.toString = function(){
var name = win.name;
return name.indexOf(SCHEME)===0 ? name : SCHEME + name;
};
// 保存数据到 window.name
// 如果没有存储数据,则恢复原始窗口名称(window.name)。
function save(){
var pairs = [];
var empty = true;
var value;
for(var key in STORAGE){
if(!STORAGE.hasOwnProperty(key)){continue;}
empty = false;
value = STORAGE[key] || "";
pairs.push( encode(key) + EQ + encode(value) );
}
win.name = empty ? ORIGIN_NAME :
SCHEME + encode(ORIGIN_NAME) + Q + pairs.join(AND);
}
// addEventLister implementation
// @param {HTMLElement} element.
// @param {String} eventName.
// @param {Function} handler.
function addEventListener(element, eventName, handler) {
if (!element){return;}
if(element.addEventListener) {
element.addEventListener(eventName, handler, false);
} else if(element.attachEvent) {
element.attachEvent('on' + eventName, function(evt) {
handler.call(element, evt);
});
}
}
// Save the last data for the next page.
addEventListener(win, 'beforeunload', function(){
save()
});
win.nameStorage = nameStorage;
module.exports = nameStorage;