/**
* vcFramework
*
* @author 吴学文
*
* @version 0.0.1
*
* @description 完成组件化编程思想
*
* @time 2020-03-04
*
* @qq 928255095
*
* @mail 928255095@qq.com
*
*/
(function () {
var vcFramework = window.vcFramework || {};
var componentCache = {};
/**
* 树
* @param {*} _vcCreate 自定义组件
* @param {*} _html 组件内容
* @param {*} _nodeLocation 组件位置 1 开始节点 -1 结束节点
*/
var VcTree = function (_vcCreate, _html, _nodeLocation) {
var o = new Object();
o.treeId = vcFramework.uuid();
o.vcCreate = _vcCreate;
o.html = _html;
o.js = "";
o.vcSubTree = [];
o.nodeLocation = _nodeLocation;
o.putSubTree = function (_vcSubTree) {
o.vcSubTree.push(_vcSubTree);
};
o.setHtml = function (_html) {
o.html = _html;
};
o.setJs = function (_js) {
o.js = _js;
};
o.setLocation = function (_location) {
o.nodeLocation = _location;
};
return o;
};
/**
* 构建 树
*/
builderVcTree = async function () {
let vcElements = document.getElementsByTagName('vc:create');
var treeList = [];
for (let _vcElementIndex = 0; _vcElementIndex < vcElements.length; _vcElementIndex++) {
let _vcElement = vcElements[_vcElementIndex];
let _tree = new VcTree(_vcElement, '', 1);
let _vcCreateAttr = document.createAttribute('id');
_vcCreateAttr.value = _tree.treeId;
_vcElement.setAttributeNode(_vcCreateAttr);
treeList.push(_tree);
//创建div
await findVcLabel(_tree, _vcElement);
let _res = _tree.html;
}
reader(treeList);
};
/**
* 从当前 HTML中找是否存在 标签
*/
findVcLabel = async function (_tree) {
//查看是否存在子 vc:create
var _componentName = _tree.vcCreate.getAttribute('name');
console.log('_componentName', _componentName, _tree);
if (!vcFramework.notEmpty(_componentName)) {
throw '组件未包含name 属性';
}
//开始加载组件
let _componentElement = await loadComponent(_componentName,_tree);
//_tree.setHtml(_componentElement);
console.log('_componentElement>>', _componentElement)
if (vcFramework.notNull(_componentElement)) {
var vcChildElements = _componentElement.getElementsByTagName('vc:create');
if (vcChildElements.length > 0) {
var _vcDiv = document.createElement('div');
for (var _vcChildIndex = 0; _vcChildIndex < vcChildElements.length; _vcChildIndex++) {
console.log('vcChildElements', vcChildElements);
var _tmpChildElement = vcChildElements[_vcChildIndex];
var _subtree = new VcTree(_tmpChildElement, '', 2);
let _vcCreateAttr = document.createAttribute('id');
_vcCreateAttr.value = _subtree.treeId;
_tmpChildElement.setAttributeNode(_vcCreateAttr);
_tree.putSubTree(_subtree);
await findVcLabel(_subtree);
}
}
}
};
reader = function (_treeList) {
console.log('_treeList', _treeList);
let _header = document.getElementsByTagName('head');
let _scripts = [];
for (let _treeIndex = 0; _treeIndex < _treeList.length; _treeIndex++) {
let _tree = _treeList[_treeIndex];
let _vcCreateEl = document.getElementById(_tree.treeId);
let _componentHeader = _tree.html.getElementsByTagName('head');
let _componentBody = _tree.html.getElementsByTagName('body');
if (_vcCreateEl.hasAttribute("location") && 'head' == _vcCreateEl.getAttribute('location')) {
let _componentHs = _componentHeader[0].childNodes;
for(let _hsIndex = 0; _hsIndex < _componentHs.length;_hsIndex ++ ){
console.log('_xxx',_componentHs[_hsIndex]);
//_header[0].appendChild(_componentHeader[0]);
let _componentScript = _componentHs[_hsIndex];
_header[0].appendChild(_componentHs[_hsIndex]);
}
//_header[0].appendChild(_componentHeader[0]);
} else if (_vcCreateEl.hasAttribute("location") && 'body' == _vcCreateEl.getAttribute('location')) {
_vcCreateEl.parentNode.replaceChild(_componentHeader[0].childNodes[0], _vcCreateEl);
} else {
//_vcCreateEl.parentNode.replaceChild(_componentBody[0].childNodes[0], _vcCreateEl);
_vcCreateEl.innerHTML = _componentBody[0].childNodes[0].innerHTML;
}
_scripts.push(_tree.js);
}
//let _scripts = document.body.getElementsByTagName("script");
for(let i=0;i<_scripts.length;i++){
//一段一段执行script
eval(_scripts[i]);
}
};
readerSubTree = function (_tree) {
}
/**
* 加载组件
* 异步去服务端 拉去HTML 和 js
*/
loadComponent = async function (_componentName,_tree) {
//从缓存查询
var _cacheComponent = vcFramework.getComponent(_componentName);
console.log('加载组件名称', _componentName);
if (vcFramework.notNull(_cacheComponent)) {
return _cacheComponent;
}
var filePath = '/components/' + _componentName + '/' + _componentName;
var htmlFilePath = filePath + ".html";
var jsFilePath = filePath + ".js";
//加载html 页面
let [_htmlBody, _jsBody] = await Promise.all([vcFramework.httpGet(htmlFilePath), vcFramework.httpGet(jsFilePath)]);
_tmpJsBody = '';
let parser = new DOMParser();
console.log('htmlBody', _htmlBody);
console.log('jsBody', _tmpJsBody);
let htmlComponentDoc = parser.parseFromString(_htmlBody+_tmpJsBody, 'text/html').documentElement;
//var jsComponentDoc = parser.parseFromString(_jsBody, 'text/html').documentElement;
// var _htmlComponentAttr = document.createAttribute('data-component');
// _htmlComponentAttr.value = _componentName;
// htmlComponentDoc.setAttributeNode(_htmlComponentAttr);
// var _jsComponentAttr = document.createAttribute('data-component');
// _jsComponentAttr.value = _componentName;
// jsComponentDoc.setAttributeNode(_jsComponentAttr);
//创建div
var vcDiv = document.createElement('div');
var _divComponentAttr = document.createAttribute('data-component');
_divComponentAttr.value = _componentName;
vcDiv.setAttributeNode(_divComponentAttr);
vcDiv.appendChild(htmlComponentDoc);
//vcDiv.appendChild(jsComponentDoc);
vcFramework.putComponent(_componentName, vcDiv);
_tree.setHtml(vcDiv);
_tree.setJs(_jsBody);
return vcDiv;
};
vcFramework = {
version: "v0.0.1",
name: "vcFramework",
author: '吴学文',
email: '928255095@qq.com',
qq: '928255095',
description: 'vcFramework 是自研的一套组件开发套件',
componentCache: componentCache,
builderVcTree: builderVcTree
};
window.vcFramework = vcFramework;
})(window);
/**
* vc-util
*/
(function (vcFramework) {
//空判断 true 为非空 false 为空
vcFramework.notNull = function (_paramObj) {
if (_paramObj == null || _paramObj == undefined) {
return false;
}
return true;
};
//空判断 true 为非空 false 为空
vcFramework.notEmpty = function (_paramObj) {
if (_paramObj == null || _paramObj == undefined || _paramObj.trim() == '') {
return false;
}
return true;
};
vcFramework.uuid = function () {
var s = [];
var hexDigits = "0123456789abcdef";
for (var i = 0; i < 36; i++) {
s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1);
}
s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010
s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01
s[8] = s[13] = s[18] = s[23] = "-";
var uuid = s.join("");
return uuid;
};
/**
* 深度拷贝对象
*/
vcFramework.deepClone = function (obj) {
return JSON.stringify(JSON.stringify(obj));
}
})(window.vcFramework);
/**
* 封装 后端请求 代码
*/
(function (vcFramework) {
vcFramework.httpGet = function (url) {
// XMLHttpRequest对象用于在后台与服务器交换数据
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.onreadystatechange = function () {
// readyState == 4说明请求已完成
if (xhr.readyState == 4 && xhr.status == 200 || xhr.status == 304) {
// 从服务器获得数据
// fn.call(this, xhr.responseText);
resolve(xhr.responseText);
}
};
xhr.send();
});
};
vcFramework.httpPost = function (url, data, fn) {
var xhr = new XMLHttpRequest();
xhr.open("POST", url, true);
// 添加http头,发送信息至服务器时内容编码类型
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {
fn.call(xhr.responseText);
}
};
xhr.send(data);
};
})(window.vcFramework);
/**
* vc-cache
*/
(function (vcFramework) {
/**
* 组件缓存
*/
vcFramework.putComponent = function (_componentName, _component) {
var _componentCache = vcFramework.componentCache;
_componentCache[_componentName] = component;
};
/**
* 组件提取
*/
vcFramework.getComponent = function (_componentName) {
var _componentCache = vcFramework.componentCache;
return _componentCache[_componentName];
}
})(window.vcFramework);
/**
* vcFramwork init
* 框架开始初始化
*/
(function (vcFramework) {
//启动 框架
vcFramework.builderVcTree();
})(window.vcFramework)