-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtabSignal.js
154 lines (139 loc) · 5.26 KB
/
tabSignal.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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
function tabSignal()
{
if(!tabSignal.custom_id)
{
tabSignal.custom_id = Math.random()+"_"+Math.random()+"_"+Math.random()+"_"+Math.random()
tabSignal.slotArray = new Array()
tabSignal.debug = true
}
if(tabSignal.init === undefined) tabSignal.init = false
return tabSignal;
}
/**
* Подписывает слот на сигнал
*
* Если передать два параметра то они обработаются как connect( signal_name, slot_function )
* Если передать три параметра то они обработаются как connect( slot_name, signal_name, slot_function )
*
* @param slot_name Имя слота
* @param signal_name Имя сигнала
* @param slot_function Функция вызваемая при вызове слота, должна иметь следующию сигнатуру function(param, signal_name){}
*
* <code>
* Пример использования
* new new signal().emit("catalogControl.OpenObject",{})
*
* </code>
*/
tabSignal.connect = function(slot_name, signal_name, slot_function)
{
if(slot_function === undefined)
{
slot_function = signal_name;
signal_name = slot_name;
slot_name = Math.random()+""+Math.random()
}
if (tabSignal.slotArray[signal_name] === undefined)
{
tabSignal.slotArray[signal_name] = new Array()
}
tabSignal.slotArray[signal_name][slot_name] = slot_function;
if(tabSignal.debug) console.log("На прослушивание сигнала " + signal_name + " добавлен слот " + slot_name + "", tabSignal.slotArray[signal_name])
return slot_name;
}
/**
* Отписывает слот slot_name от сигнала signal_name
*/
tabSignal.disconnect = function(slot_name, signal_name)
{
if (tabSignal.slotArray[signal_name] === undefined)
{
tabSignal.slotArray[signal_name] = new Array()
}
if (tabSignal.slotArray[signal_name][slot_name] !== undefined)
{
delete tabSignal.slotArray[signal_name][slot_name]
}
if(tabSignal.debug) console.log("Отписываем слот " + slot_name + " от "+signal_name )
}
/**
* Вызывает слоты подписаные на сигнал signal_name и каждому из них передаёт аруметы signal_name - имя вызвавшего сигнала, и param - объект с параметрами для слота)
* В добавок ретранслирует сигнал в дочернии iframe если они есть и в родительское окно если оно есть
* @param signal_name Имя сигнала
* @param param Параметры переданые слоту при вызове в втором аргументе
*/
tabSignal.emit = function(signal_name, param)
{
if (tabSignal.slotArray[signal_name] === undefined)
{
if(tabSignal.debug) console.log("На сигнал " + signal_name + " нет подписчиков" )
}
else
{
var slots = []
for (var slot in tabSignal.slotArray[signal_name])
{
tabSignal.slotArray[signal_name][slot](param,signal_name)
slots.push(slot)
}
if(tabSignal.debug) console.log("Сигнал " + signal_name + " подписаны слоты", slots )
}
}
/*
* генерация события будут оповещены и соседние вкладки
* @eName string - имя события
* использование .emit('любое название события', [ Параметры события ])
*/
tabSignal.emitAll = function (signal_name, param)
{
tabSignal.emit(signal_name, param)
if(window['localStorage'] !==undefined )
{
var curent_custom_id = Math.random()+"_"+Math.random()+"_"+Math.random()+"_"+Math.random()+"_"+Math.random()
window['localStorage']['tabSignal_storage_emit']= JSON.stringify({name:signal_name, custom_id:curent_custom_id, param:param});
}
}
if(!tabSignal.prototype.init)
{
tabSignal.prototype.init = true
if( window.addEventListener )
{
window.addEventListener('storage', function(e)
{
if(e.key && e.key == 'tabSignal_storage_emit')
{
try{
var data = JSON.parse(e.newValue);
if(data !== undefined && data.name !== undefined )
{
if(tabSignal.debug > 1) console.log( data )
tabSignal().emit( data.name, data.param )
}
}
catch (failed)
{
}
}
}, false);
}
else
{
document.attachEvent('onstorage', function(e)
{
if(e.key && e.key == 'tabSignal_storage_emit')
{
try{
var data = JSON.parse(e.newValue);
if(data !== undefined && data.name !== undefined )
{
if(tabSignal.debug > 1) console.log( data )
tabSignal().emit( data.name, data.param )
}
}
catch (failed)
{
}
}
} );
}
}