forked from samsonos/js_core
-
Notifications
You must be signed in to change notification settings - Fork 0
/
_samsonjs.js
331 lines (289 loc) · 16.1 KB
/
_samsonjs.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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
/**
* Samson JavaScript Framework
* @author Vitaly Iegorov vitalyiegorov@gmail.com
* @type SamsonJS
* @param {String} selector CSS селектор для получения элемента(ов) DOM
* @param {SamsonJS} [parent] Родительский элемент SamsonJS в котором необходимо выполнить получение элемента(ов) DOM
* @returns {SamsonJS} Объект фреймворка
*/
var SamsonJS = (function(selector, parent)
{
/**
* Внутренний объект-функция который создается для установки в него основных
* методов и свойств и возврата его экземпляра из главной функции
* window.SamsonJS()
*
* @param {String|SamsonJS} selector CSS селектор для получения элемента(ов) DOM
* @param {SamsonJS} [parent] Родительский элемент SamsonJS в котором необходимо выполнить получение элемента(ов) DOM
* @returns {SamsonJS} Объект фреймворка
*/
var SamsonJS = function( selector, parent) {
// Создадим модифицированный объект ссылающийся сам на себя
// как через свой прототип(описано ниже) так и через конструктор
return new SamsonJS.fn.init(selector, parent);
};
/**
* Сокращении для доступа к прототипу фреймворка
*/
SamsonJS.fn = SamsonJS.prototype;// = new Array;
/**
* Текущая версия фреймворка
*/
SamsonJS.version = '0.3.3';
/**
* Флаг вывода отладочных сообщений
*/
SamsonJS.debug = true;
/**
* Инициализатор - будущий экземпляр данного объекта при вызове
* родительской функции
* @constructor
* @param {String|SamsonJS} selector Селектор для получения элемента DOM
* @returns {SamsonJS} Указатель на самого себя для цепирования
*/
SamsonJS.fn.init = function( selector, parent )
{
/**
* Для начала определим к каким элементам DOM будет привязан текущий
* объект и запишем коллекцию этих элементов в this.elements
*/
// Если нам хоть что-то передано
if (selector)
{
// Если нам передали уже существующий SamsonJS
if ((typeof (selector) === 'object') && (selector instanceof SamsonJS)) {
// Переберем все поля которые имеет переданный объект SamsonJS
for ( var attr in selector) {
// Если это поле принадлежит самому объекту - скопируем его значение
if (selector.hasOwnProperty(attr)) this[attr] = selector[attr];
}
// Если у переданногор объекта есть выборка DOM
if (selector.elements)
{
// Очистим массив подчиненных элементов
this.elements = [];
// Скопируем элементы выборки DOM из переданного объекта в текущий
for ( var i = 0; i < selector.elements.length; i++)
this.elements[this.elements.length] = selector.elements[i].DOMElement;
}
// Получим селектор объекта дял сохранения дальнейшей логики работы функции инициализации объекта
selector = selector.selector;
// Дальше этот метод инициализации все сделает сам
}
// Попытаемся найти элементы в дереве DOM
else this.elements = SamsonJS.fn.find(selector, parent);
// Если нам не удалось получить элементы DOM из дерева документа и передана строка
if (this.elements === undefined) {
/**
* Теперь МАГИЯ - дадим браузеру шанс создать DOM элементы
* самостоятельно, тоесть не важно что нам передали, браузер
* сам разберется что и как надо создать и если это у него
* выйдет то он насоздает в нашем "виртуальном" контейнере
* DIV все переданное в виде строки. А нам останется это
* перебрать и заполнить текущую выборку элементов DOM.
*
* Если что-то не вышло то catch это поймает.
*/
// Попытаемся создать новый элемент DOM
try {
// Создадим временный контейнер DIV для заполнения
newDOMElement = document.createElement('DIV');
// Заполним временный контейнер DIV полученным HTML кодом
newDOMElement.innerHTML = selector;
// Коллекция элементов DOM для заполнения из переданно контента
this.elements = [];
// Переберем созданные браузером элементы DOM
for ( var i = 0; i < newDOMElement.childNodes.length; i++) {
// Добавим в коллекцию текущих элементов DOM новый "виртуальный" элемент
this.elements[this.elements.length] = newDOMElement.childNodes[i];
}
} catch (e) {s.trace('Ошибка создания элемента DOM: '+ e.toString());}
}
}
/**
* Селектор по которому был создан данный объект
*/
this.selector = selector;
// Установим количество элементов по умолчанию
this.length = 0;
// Если в текущей выборке есть элементы DOM
if (this.elements && this.elements.length)
{
/**
* Указатель на элемент DOM к которому привязан данный SamsonJS
* по умолчанию мы привязываем его к 1-му элементу полученной
* коллекции элементов DOM
*/
this.DOMElement = this.elements[0];
/**
* Сохраним количество элементов принадлежащих текущей выборки
*/
this.length = this.elements.length;
// Замкнем коллекцию на себе же, мы нечего не потеряем т.к.сохранили привязанный элемент DOM в
// отдельную переменную, но выполним это только тогда когда ввыборке DOM находится всего один
// элемент, и данный объект фатически является "атомарным" - имеет наименьшее возможное количество
// подчиненных узлов = 1, то есть ссылается сам на себя.
if (this.length == 1) this.elements[0] = this;
// Иначе, данный объект имеет несколько подчиненных элементов DOM и нам необходимо для каждого из них
// создать свой собственный "атомарный" объект, и так делать бесконечно глубоко
// Создадим коллекцию подчиненных SamsonJS для полученных элементов DOM из текущей выборки
else for ( var i = 0; i < this.length; i++) this.elements[i] = new SamsonJS( this.elements[i], this );
}
// Обнулим указатель на коллекцию элементов DOM - объект пустой
else this.elements = null;
};
/**
* Функция обертка для выборки элементов Пока что выбираем элементы
* используя JQuery, но в дальнейшем намерены переписать собственный
* метод.
* @private
* @param {String} selector CSS селектор для выборки элементов DOM
* @param {SamsonJS} [_context] Контекст для выборки элементов DOM
* @returns {Array} Группу найденных объектов из дерева DOM
*/
SamsonJS.fn.find = function(_selector, _context)
{
// Если передан объект элемента DOM
if (typeof _selector === 'object') return [ _selector ];
// Иначе попытаемся выбрать элементы из дерева элементов DOM
// документа по селектору
// используя внешнюю библиотеку Sizzle
else {
try {
// Если указан контекст для запроса
if (_context && (_context instanceof SamsonJS))
{
// Соберем все элементы DOM сюда
DOMElements = [];
// Переберем все элементы из полученного контекста
for ( var i = 0; i < _context.elements.length; i++)
{
// Получим текущий элемент их выборки элементов DOM переданнгого контекста
contextDOMElement = _context.elements[i].DOMElement;
// Для фреймов как контекст передадим его "окно" для поиска
if (contextDOMElement.tagName
&& (contextDOMElement.tagName.toLowerCase() == 'iframe')
&& contextDOMElement.contentDocument) {
contextDOMElement = contextDOMElement.contentDocument;
}
// Выберем элементы DOM по селектору для каждого элемента из выборки переданного контекста
// Сохраним результат выборки по текущему элементу из переданного контекста
Sizzle(_selector, contextDOMElement, DOMElements);
}
// Вернем "собранную" коллекцию элементов DOM
return DOMElements;
}
// Или просто общая выборка
else return Sizzle(_selector);
}
// Обработаем ошибку в init()
catch (e) { /*s.trace('Sizzle не смог найти объект DOM по селектору: '+_selector);*/}
}
};
/**
* Выполнить указанный обработчик над всеме элемента DOM из текущей
* выборки Функция может работать как в контексте текущего объекта
* используя текущую выборку элементов DOM
*
* @author Vitaliy Egorov <vitalyiegorov@gmail.com>
* @memberOf SamsonJS
*
* @param {Function} handler Функция обработчик для каждого элемента DOM из выборки
* @returns {SamsonJS} Указатель на самого себя для цепирования
*/
SamsonJS.fn.each = function( handler )
{
// Указатель на самого себя
var _self = this;
// Если мы получили обработчик
if (_self.elements && handler)
{
// Переберем все элементы из коллекции DOM элементов и вызовем для каждого элемента переданный обработчик, передав
// в него указатель на обрабатываемый объект
for ( var index = 0; index < _self.elements.length; index++) handler( _self.elements[index] );
}
// Вернем самого себя
return _self;
};
/**
* Главная функции для расширения функционала SamsonJS фреймворка
* <p>
* Функция принимает своим аргументом объект <code>{ funcName : function() { * ..code..}, ... }</code>
* c описанными функциями и привязывает их глобальному объекта SamsonJS,
* а так же к его прототипу. Что по сути и является расширением функционала фреймворка.
* </p>
*
* @author Vitaliy Egorov <vitalyiegorov@gmail.com>
* @memberOf SamsonJS
*/
SamsonJS.extend = function()
{
// Указатель на объект для "расширения"
target = arguments[0] || {};
// Если этот аргемент функция
if (typeof target == 'object')
{
// Переберем поля переданного объекта и принимаем только функции
for (name in target) if (typeof target[name] == 'function')
{
// Добавим к SamsonJS и к его прототипу новую функцию по имени name
SamsonJS[name] = SamsonJS.fn[name] = target[name];
}
}
};
/**
* Вывести отладочное сообщение в консоль браузера.
*
* <p>
* Функция проверяет поддержку вывода сообщений в консоль браузера во избежании ошибок
* и всегда возвращает значение <code>undefined</code>
* </p>
*
* @author Vitaliy Egorov <vitalyiegorov@gmail.com>
* @memberOf SamsonJS
*
* @param {String} text Текст сообщения для вывода
* @param {Boolean} stack Выводить ли дерево вызовов
* @returns {undefined} undefined Пустое значение
*/
SamsonJS.trace = function(text, stack)
{
// Если есть отладочная консоль и она поддерживается
if( this.debug && window.console)
{
console.log(text);
// Если необходимо вывести стек вызовов
if( stack && !s.IEVersionLowerThan(9)) console.trace();
}
// Всегда возвоащаем пустое значение
return undefined;
};
/**
* Связем прототипную функцию инициализации с общим прототипом что бы
* получить "замыкание" объекта самого в себе при вызове функции
*/
SamsonJS.fn.init.prototype = SamsonJS.fn;
/**
* Вернем самого себя
*/
return SamsonJS;
})();
/**
* Получить экземппяр SamsonJS для статического контекста
*/
var s = SamsonJS;
/**
* Получить экземппяр SamsonJS для динамического контекста
* @returns {SamsonJS} экземппяр SamsonJS
*/
function s( selector, parent ){ return SamsonJS( selector, parent ); };
// Инициализируем фреймворк
(function(window)
{
// Сделать SamsonJS глобальным и привязать спецсимвол "_"
window.SamsonJS = window.S = window.s = SamsonJS;
// Сообщим всем что SamsonJS успешно загружен
s.trace('Фреймворк SamsonJS '+SamsonJS.version+' - Успешно загружен в систему');
// Предложения по работе
s.trace('Нравится JavaScript, хочешь узнать много нового и зарабатывать на этом деньги? Пиши info@samsonos.com');
})(window); // Выполним привязку фреймворка к "окну" приложения