UNPKG

application-prototype

Version:
223 lines (206 loc) 6.14 kB
// jshint -W083 // jshint -W002 // jshint -W088 // jshint -W014 ((function () { if (!('_elements' in module.cache())) { module.cache()._elements = {}; } if (!('_elementsKeys' in module.cache())) { module.cache()._elementsKeys = []; } if (!('_pendingList' in module.cache())) { module.cache()._pendingList = {}; } var target = document.body; var _elements = module.cache()._elements; var _elementsKeys = module.cache()._elementsKeys; var _pendingList = module.cache()._pendingList; var trackNodes = function (nodeList, cbName, attrs) { if (nodeList.length) { var i, tagName, er; for (i=0;i<nodeList.length;i++) { if (nodeList[i].nodeType === Node.ELEMENT_NODE) { tagName = nodeList[i].tagName.toLowerCase(); if (_elementsKeys.indexOf(tagName) !== -1) { if (typeof(_elements[tagName][cbName]) === "function") { try { // console.log({tagName, cbName}); _elements[tagName][cbName].apply(nodeList[i], []); } catch (er) { console.error(er); } } } else if (tagName in _pendingList) { if (typeof(_pendingList[tagName]) === "function") { try { ((_pendingList[tagName])()); } catch (er) { console.error(er); } } delete _pendingList[tagName]; } var _found = false; if (cbName === "__onAttrChange" || cbName === "__onContentChange") { var _current = nodeList[i], _currentTagName = nodeList[i].tagName.toLowerCase(); while (_current && !_found) { if (_elementsKeys.indexOf(_currentTagName) !== -1) { _found = true; } _current = _current.parentElement; if (_current) { _currentTagName = _current.tagName.toLowerCase() } } if (!_found) return; } else { _found = true; } if (_found) { // console.log({ cbName, nodes: nodeList[i].childNodes }); trackNodes(nodeList[i].childNodes, cbName, attrs); } } else if (nodeList[i].nodeType === Node.DOCUMENT_NODE) { trackNodes(nodeList[i].childNodes, cbName, attrs); } else if (nodeList[i].nodeType === Node.DOCUMENT_FRAGMENT_NODE) { trackNodes(nodeList[i].childNodes, cbName, attrs); } } } }; var observer = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { var attrs = []; if (mutation.type === "childList") { trackNodes(mutation.addedNodes, "__onInit", attrs); trackNodes([mutation.target], "__onContentChange", attrs); trackNodes(mutation.removedNodes, "__onRemove", attrs); } else if (mutation.type === "attributes") { trackNodes([mutation.target], "__onContentChange", attrs); trackNodes([mutation.target], "__onAttrChange", [mutation.attributeName, mutation.oldValue]); } // console.log(mutation.type, mutation); }); }); // configuration of the observer: var config = { attributes: true, childList: true, subtree: true, attributeOldValue: true }; // pass in the target node, as well as the observer options observer.observe(target, config); // later, you can stop observing // observer.disconnect(); if (typeof(document.createElement('span').methods) !== "object") { /** * @memberof HTMLElement# * @var {Object<string,function>} methods */; Object.defineProperty(HTMLElement.prototype, 'methods', { get : function () { var tagName = this.tagName.toLowerCase(); var node = this; var method = function (name) { return function () { return _elements[tagName][name].apply(node, arguments); }; }; var methods = {}; if (tagName in _elements) { for (i in _elements[tagName]) { if (typeof(_elements[tagName][i]) === "function") { methods[i] = method(i); } else { ;((function (name) { Object.defineProperty(methods, name, { enumerable : true, configurable : true, get : function () { return _elements[tagName][name]; }, set : function (v) { _elements[tagName][name] = v; } }); })(i + '')); } } } return methods; }, set : function (methods) { var tagName = this.tagName.toLowerCase(); if (methods && typeof(methods) === "object") { var i; if (!(tagName in _elements)) { _elements[tagName] = {}; _elementsKeys.push(tagName); } for (i in methods) { _elements[tagName][i] = methods[i]; } } }, enumerable: true, configurable: false }); } var _private = { registerMethods : function (nodeName, prototypeMethods) { if ( nodeName && typeof(nodeName) === "string" && prototypeMethods && typeof(prototypeMethods) === "object" ) { var tagName = nodeName.toLowerCase(); _elements[tagName] = prototypeMethods; _elementsKeys.push(tagName); _private._initCreatedNodes(tagName); } }, _initCreatedNodes : function (nodeName) { var tagName = nodeName.toLowerCase(); if (typeof(_elements[tagName].__onInit) === "function") { var list = document.getElementsByTagName(nodeName); var er; for (var i = 0; i < list.length; i++ ) { try { _elements[tagName].__onInit.apply(list[i], []); } catch(er) { console.error(er); } } } } }; var _methods = { registerMethods : _private.registerMethods, lazyLoadModules : function (list) { var moduleName, tagName, cb; if (typeof(list) === "object" && list) { for (moduleName in list) { tagName = moduleName.toLowerCase(); cb = undefined; if (typeof(list[tagName]) === "string") { cb = ((function (moduleName) { return function () { Application.require(moduleName, function () {}); }; })(list[tagName] + "")); } else if (typeof(list[tagName]) === "function") { cb = list[tagName]; } if (typeof(cb) === "function") { if (document.getElementsByTagName(tagName).length) { try { cb(); } catch (er) { console.error(er); } } else { _pendingList[tagName] = cb; } } } } } }; module.exports = _methods; })());