在写electron项目的时候需要把一个HTML页面根据功能拆分成好几块,用的哪个页面就导入哪个页面,由于官网上没找到这方面的技术文档,所以想了一个办法,通过一个自定义标签把对应的代码块插入当前页面,实现无缝拼接。
目前有两个缺点:
1.为了解决加载顺序的问题,用了jquery的$(function(){}),所以在使用这个小工具的时候需要先引入jquery。(其实也算不上缺点,现在写HTML页面基本都会用到jquery,哈哈哈哈,手动狗头)
2、通过点击按钮触发事件的时候,如果是通过选择器触发,比如$("#xxx").click()时没有反应,估计也是加载顺序的问题,暂时未解决,补救办法是在标签里通过οnclick="xxx()"调用(有大佬知道怎么解决,别忘了通知一声,我也学习学习)。
使用方法:创建js文件,复制粘贴下方的代码,然后在需要导入的地方使用<include src="xxx.html"></include>即可。
使用的js文件代码:
(function (window, document, undefined) {
var Include39485748323 = function () { }
Include39485748323.prototype = {
//倒序循环
forEach: function (array, callback) {
var size = array.length;
for (var i = size - 1; i >= 0; i--) {
callback.apply(array[i], [i]);
}
},
getFilePath: function () {
var curWwwPath = window.document.location.href;
var pathName = window.document.location.pathname;
var localhostPaht = curWwwPath.substring(0, curWwwPath.indexOf(pathName));
var projectName = pathName.substring(0, pathName.substr(1).lastIndexOf('/') + 1);
return localhostPaht + projectName;
},
//获取文件内容
getFileContent: function (url) {
var ie = navigator.userAgent.indexOf('MSIE') > 0;
var o = ie ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
o.open('get', url, false);
o.send(null);
return o.responseText;
},
parseNode: function (content) {
var objE = document.createElement("div");
objE.innerHTML = content;
return objE.childNodes;
},
executeScript: function (content) {
var mac = /<script>([\s\S]*?)<\/script>/g;
var r = "";
while (r = mac.exec(content)) {
eval(r[1]);
}
},
getHtml: function (content) {
var mac = /<script>([\s\S]*?)<\/script>/g;
content.replace(mac, "");
return content;
},
getPrevCount: function (src) {
var mac = /\.\.\//g;
var count = 0;
while (mac.exec(src)) {
count++;
}
return count;
},
getRequestUrl: function (filePath, src) {
if (/http:\/\//g.test(src)) { return src; }
var prevCount = this.getPrevCount(src);
while (prevCount--) {
filePath = filePath.substring(0, filePath.substr(1).lastIndexOf('/') + 1);
}
return filePath + "/" + src.replace(/\.\.\//g, "");
},
replaceIncludeElements: function () {
var $this = this;
var filePath = $this.getFilePath();
var includeTals = document.getElementsByTagName("include");
this.forEach(includeTals, function () {
//拿到路径
var src = this.getAttribute("src");
//拿到文件内容
var content = $this.getFileContent($this.getRequestUrl(filePath, src));
//将文本转换成节点
var parent = this.parentNode;
var includeNodes = $this.parseNode($this.getHtml(content));
var size = includeNodes.length;
for (var i = 0; i < size; i++) {
parent.insertBefore(includeNodes[0], this);
}
//执行文本中的额javascript
$this.executeScript(content);
parent.removeChild(this);
//替换元素 this.parentNode.replaceChild(includeNodes[1], this);
})
}
}
$(function () {
new Include39485748323().replaceIncludeElements();
})
})(window, document)