HTML#DOM树的遍历

来源:互联网 发布:加工中心螺旋编程实例 编辑:程序博客网 时间:2024/06/03 01:09

有很长时间没有接触HTML相关的开发了,最近有机会接触到这块,感觉做前端很容易,但要做好就不容易,好的前端一点也不比后端容易.变化多端的代码都会有共通的思想.

1、功能描述

1.1、解析特定的HTML结构

1.2、传递给后台做Excel处理

1.3、响应给客户端一个文件流

 

/** * 结点实体结构 * @param {} p 上级 * @param {} t 关联的当前DOM * @param {} v 值 * @return {} */var DomTree = function(p,t,v) {var parent = p;var target = t;var childs = [];var value = v;var attr = [];return {"getTarget":function() {return target;},"getParent":function() {return parent;},"getChilds":function() {return childs;},"addChild":function(child) {childs.push(child);},"getValue":function() {return value;},"addAttr":function(k,v) {attr.push({'KEY':k,'VALUE':v});},"toString":function() {return '{target:' + target + ';parent:' + (parent==null?"NULL":parent) + ';childs:' + childs.length + ';value:' + (value==null?"NULL" : value) + '}';},"toHTML":function(filter) {if (filter(target)) {var rtnStr = '<'.concat(target['tagName']);//附加属性_Beginfor (var i = 0; i < attr.length; i++) {var obj = attr[i];rtnStr = rtnStr.concat(" ").concat(obj["KEY"]).concat("='").concat(obj["VALUE"]).concat("' ");}//附加属性_End//不要忘记标签结束rtnStr = rtnStr.concat('>');//递归的思想/分层处理HTML的转换for (var index = 0; index < childs.length; index++) {var child = childs[index];rtnStr = rtnStr.concat(child.toHTML(filter));}rtnStr = rtnStr.concat((value == null) ? "" : value).concat("</").concat(target['tagName']).concat('>');return rtnStr;} else {return value == null ? '' : value;}}}};/** * 临时对象,负责DOM处理 */var tmpObj = function(){/** * 调试 */function debug(str) {//document.getElementById('wst_acc_101.remark').value = document.getElementById('wst_acc_101.remark').value + str + "\r\n";}/** * 取子节点 */function getChildren(domTree) {var target = domTree.getTarget();if (target.children) {for (var index = 0; index < target.children.length; index++) {var child = target.children[index];var childDomTree = new DomTree(domTree, child, getChildValue(child));domTree.addChild(childDomTree);getChildren(childDomTree);}}}/** * 取给定节点的值 */function getChildValue(child) {if (child['tagName'] == 'SELECTE') {return (child['options'][child['selectedIndex']]['value']);} else if (child['tagName'] == 'INPUT') {var rtnValue = null;switch(child['type']) {case 'text':rtnValue = child['value'];break;case 'hidden':rtnValue = child['value'];break;default:rtnValue = null;break;}return rtnValue;} else if (child['tagName'] == 'LABEL') {return child['innerText'];}return (child.children==null)?child['innerHTML']:null;}return {"sayHello":function() {alert('Hello');},"ergodicTableDom":function(tableElemId, parentObj) {var tableElemObj = document.getElementById(tableElemId);if (!tableElemObj) {return null;}var root = new DomTree(null, tableElemObj, null);root.addAttr('border','1');getChildren(root);//debug(root.toHTML(filerElem));return root;}}}();org.ybygjy.util.exportTable = tmpObj;

测试

/** * 导出Excel_过滤元素,此方法在dom转换过程中的回调处理,通过true/false决定逻辑处理分支 * <p>{true:表示该dom需要被处理;false:表示不会被处理}</p> */function smartForm_filterElem(elem) {if (elem['tagName'] == 'INPUT') {return false;} else if (elem['tagName'] == 'LABEL') {return false;} else if (elem['tagName'] == 'SELECT') {return false;} else if (elem['tagName'] == 'A') {return false;} else if (elem['tagName'] == 'TEXTAREA') {return false;}return true;}/** * 导出Excel_入口 * @param {} obj 参数列表 {exportTableId:指定导出Table的Id;fileName:指定导出文件名称} */function smartForm_doExport(obj) {try {var exportTableId = obj.id.split('.')[0];var result = org.ybygjy.util.exportTable.ergodicTableDom(exportTableId);var htmlContent = (result.toHTML(smartForm_filterElem));window.exportWindow = window.open('ExportExcelAction.sf?EXPORT_FILENAME=' + exportTableId + '&EXPORT_CONTENT=' + htmlContent,'ExportWindow','width:300,height:300,scroll:no');} catch (e) {alert(e.message);}}
原创粉丝点击