`
wwwlgy
  • 浏览: 8688 次
社区版块
存档分类
最新评论

编程小技巧共享(用js实现的页面单元复制)

 
阅读更多

当时也没有查到其他有没有现成的东西,不过在写这段脚本的时候,确实把我快弄吐血了。
目的是这样的:
当在组件化管理html页面,尤其是用ajax的技术时,我们通常会用到模板技术。而这段代码也是想实现客户端的模板技术。
使用时,显示的方式,如html上有个大快里面有若干个div有若干个table不管。总之把这一个完整的单元作为一个整理。
用这个函数可以把这个整体随意的复制多份!
而且通过传入的替换函数,可以在拷贝时将这个单元里面的某些标签的某些属性的值进行替换。就真的想脚本一样。注意,连代变量的onclick事件也支持替换的。
当初之所以写这段代码,是因为我的美工太差,所以我决定将页面代码分离。后台用ajax获取数据,整合到页面单元。页面单元用这个方法封装。具时只要让美工替换对应的页面单元就可以达到美化效果了。
这是拆离出来的文件,不一定能跑。如果大家觉得感兴趣,可以找我提供源文件。里面还有很多很方便的方法封装。都是源创,写的时候都快吐血了。
/**
标签拷贝函数,有一个回调类,类的回调函数名为doProcess(copyType,null,nVavlue);,第一个是标签名,第二个是属性值,第三个是输入的属性内容,返回是处理后的属性值
*/
Global.copyHTML = function(srcObj,descObj,pcount,converter){
for(var rcount = 0; rcount<pcount;rcount++){
var copyType = srcObj.nodeName;
var appendObj;
if (copyType == "#text" || copyType==null || copyType==""){
//说明这是文本节点
var nVavlue = srcObj.nodeValue;
if (converter != null){
nVavlue = converter.doProcess(descObj.nodeName,copyType,nVavlue);
}

appendObj = document.createTextNode(nVavlue);
descObj.appendChild(appendObj);
return;
}
appendObj = document.createElement(copyType);
//下面要给这个新建立的节点复制属性
var parser = new Global_HTMLAttrParser(srcObj);
for (var i = 0;i<parser.getAttLen();i++){
//设置属性前要检查属性的值是否要转化
var attValue = parser.getValue(i);

//转化值
if (converter != null){
attValue = converter.doProcess(copyType,parser.getName(i),parser.getValue(i));
}


//区分事件和属性
if ((/^(on).+/i).test(parser.getName(i))){
//说明这是一个事件,要绑定事件
Global.EventDBinding(appendObj,parser.getName(i),attValue);
}else{
var evalStr = parser.getEvalValue('appendObj',parser.getName(i),attValue);
if (evalStr != null){
//说明要用eval付值
eval(evalStr);
}else{
//绑定属性
appendObj.setAttribute(parser.getName(i),attValue);
}
}

}

//加入的父节点中
descObj.appendChild(appendObj);

//下面对子节点处理
for(var i = 0 ;i < srcObj.childNodes.length ; i++){
Global.copyHTML(srcObj.childNodes[i],appendObj,1,converter);
}
}

}

Global.EventDBinding = function(tagObj,eventName,eventCommand){
tagObj[eventName] = function(){
//因为eval对return是不支持的,所以这里要针对不同的情况解析执行
if (/return/.test(eventCommand)){
var inFunction_commStrs = eventCommand.match(/[^;]+/ig);//将按照语句拆分,主语局部变量不要和eventCommand里面冲突了,加统一的前缀
for(var inFunction_i=0;inFunction_i<inFunction_commStrs.length;inFunction_i++){
var inFunction_comm = inFunction_commStrs[inFunction_i];
if (/^/s*$/.test(inFunction_comm)){
//全是空格,直接返回
continue;
}
if (/return/s+true/.test(inFunction_comm)){
return true;
}
if (/return/s+false/.test(inFunction_comm)){
return false;
}
if (/return/s+/.test(inFunction_comm)){
return eval(inFunction_comm.replace(/return/g,''));
}
eval(inFunction_comm);
}
}else{
//没有return情况,直接执行。
eval(eventCommand);
}
//return eval(returnFlag);
}
}
/**
处理解析html的属性字符串
*/
function Global_HTMLAttrParser(obj){
this.htmlStr = obj.outerHTML.match(/<[^<>]+>/i)[0];
this.tarName = obj.nodeName;
this.attr = {};
this.attr.name = new Array();
this.attr.value = new Array();
//var atts = this.htmlStr.match(//S+/s*=/s*[^>/s]+/ig);
var atts = this.htmlStr.match(/(/S+/s*=/s*[^>/s'"=]+)|(/S+/s*=/s*['"][^=]+['"])/ig);

this.len = 0;
for (var i=0;atts!= null && i<atts.length;i++){
//var atts_name_value = atts[i].match(/[^/s=]+/ig);
var atts_name_value = atts[i].match(/[^=]+/ig);
this.attr.name[i]=atts_name_value[0].trim();
this.attr.value[this.attr.name[i]]=atts_name_value[1].replace(//s*['"]?([^'"]+)['"]?/s*/ig,'$1');
}

this.len = i;

this.attr.name = this.reOrder(this.tarName,this.attr.name);

this.getAttLen = function(){
return this.len;
}
this.getName = function(pi){
var result = this.attr.name[pi];
result = this.dictionary[result];
if (result != undefined){
return result;
}
return this.attr.name[pi];
}
this.getValue = function(pi){
return this.attr.value[this.attr.name[pi]];
}

}

/**
在使用的时候遇到一个设置样式的问题,不能用setAttribute("class","inputbox2");而应该使用setAttribute("className","inputbox2")
下面就是转换字典表
*/
Global_HTMLAttrParser.prototype.dictionary = new Array();
if (Global.browser == 'IE'){
Global_HTMLAttrParser.prototype.dictionary["class"] = 'className';
}
/**
另外一个字典表,表示那些标签是需要将属性重新排序的
例如象IMG标签,该标签比较可恶,如果有height和src属性同时存在时,用outHTML必定是先显示height再到src
这样,上面设置时,也是先设置图片的height属性,然后再设置src而src一旦设置,之前设置的height就无效了
*/
Global_HTMLAttrParser.prototype.reOrderTags = new Array();
Global_HTMLAttrParser.prototype.reOrderTags['IMG'] = new Array();
Global_HTMLAttrParser.prototype.reOrderTags['IMG'][0] = 'id';
Global_HTMLAttrParser.prototype.reOrderTags['IMG'][1] = 'src';
Global_HTMLAttrParser.prototype.reOrder = function(tagName,orgArray){

var tmpTagName = tagName.toUpperCase();//转成大写,保证能用

if (Global_HTMLAttrParser.prototype.reOrderTags[tmpTagName] == undefined){
//不用重新排列,将原数组返回
return orgArray;
}
var standArr = Global_HTMLAttrParser.prototype.reOrderTags[tmpTagName];
var resultArr = new Array();
var resultIdx = 0;

for(var i = 0; i< standArr.length;i++){
var topTag = standArr[i];
for(var j=0;j<orgArray.length;j++){
if(orgArray[j] == null){
continue;//第一轮下来,可能有些元素被置空,不加这行第二次循环就可能空指针
}
var tt = orgArray[j].toLowerCase();//属性都转化成小写,便于匹配
if (topTag == tt){
//匹配上了,要记录记录下来
resultArr[resultIdx++] = orgArray[j];//注意:这里要回原来的值,否则外面的标签属性值匹配不上
//将原来的值清空
orgArray[j] = null;
//结束本次循环
break;
}
}
}
//更新完所有优先级最高的数组了,下来要再最后循环一次,剩余的没有顺序要求
for(var k =0;k<orgArray.length;k++){
//加入到新数组中
if (orgArray[k] != null){
resultArr[resultIdx++] = orgArray[k];
}
}

return resultArr;
}
/**
针对style='display:none'这类型的设置,直接用dom上的setAttribute是不行的
因为style是一个对象,这种要专用evale方法设置
例如:设置img的属性,将可以变成eval("img['style'].display = 'none'")
本方法将作判断是否要转移及转化名字值对的作用
输入的是对象名,变量名字和值
输出的是形如:img['style'].display = 'none'的字符串
如果不用转化,则返回null
*/
Global_HTMLAttrParser.prototype.getEvalValue = function(ndeObjName,tagName,tagValue){

if (!(/^style$/i).test(tagName)){
//如果不是style就不用转化
return null;
}
var vvStr = tagValue.match(/[^;]+/ig);
var result = '';
for(var i=0;i<vvStr.length;i++){
//分析值域
var vStr = vvStr[i].match(/[^:]+/ig);
if (vStr.length != 2){
continue;
}
var vName = vStr[0].trim();
var vValue = vStr[1].trim();
result = result + ndeObjName+"['style']."+vName.toLowerCase() + " = '" + vValue + "';";
}
return result;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

分享到:
评论

相关推荐

    iOS版微信抢红包Tweak.zip小程序

    iOS版微信抢红包Tweak.zip小程序

    毕业设计&课设_篮球爱好者网站,含前后台管理功能及多种篮球相关内容展示.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    基于springboot社区停车信息管理系统.zip

    基于springboot社区停车信息管理系统.zip

    基于springboot南皮站化验室管理系统源码数据库文档.zip

    基于springboot南皮站化验室管理系统源码数据库文档.zip

    重磅,更新!!!上市公司全要素生产率TFP数据及测算方法(OL、FE、LP、OP、GMM)(2000-2023年)

    ## 数据指标说明 全要素生产率(TFP)也可以称之为系统生产率。指生产单位(主要为企业)作为系统中的各个要素的综合生产率,以区别于要素生产率(如技术生产率)。测算公式为:全要素生产率=产出总量/全部资源投入量。 数据测算:包含OL、FE、LP、OP、GMM共五种TFP测算方法!数据结果包括excel和dta格式,其中重要指标包括证券代码,固定资产净额,营业总收入,营业收入,营业成本,销售费用,管理费用,财务费用,购建固定资产无形资产和其他长期资产支付的现金,支付给职工以及为职工支付的现金,员工人数,折旧摊销,行业代码,上市日期,AB股交叉码,退市日期,年末是否ST或PT等变量指标分析。文件包括计算方法说明及原始数据和代码。 数据名称:上市公司全要素生产率TFP数据及测算方法(OL、FE、LP、OP、GMM) 数据年份:2000-2023年 数据指标:证券代码、year、TFP_OLS、TFP_FE、TFP_LP1、TFP_OP、TFP_OPacf、TFP_GMM

    多种编程语言下算法实现资源汇总

    内容概要:本文详细总结了多种编程语言下常用的算法实现资源,涵盖Python、C++、Java等流行编程语言及其相关的开源平台、在线课程和权威书籍。对于每种语言而言,均提供了具体资源列表,包括开源项目、标准库支持、在线课程及专业书籍推荐。 适合人群:适用于所有希望深入研究并提高特定编程语言算法能力的学习者,无论是编程新手还是有一定经验的技术人员。 使用场景及目标:帮助开发者快速定位到合适的算法学习资料,无论是出于个人兴趣自学、面试准备或是实际工作中遇到的具体算法问题,都能找到合适的解决方案。 其他说明:文中提及多个在线学习平台和社区网站,不仅限于某一特定语言,对于跨学科或多元化技能培养也具有很高的参考价值。

    基于springboot的交通旅游订票系统源码数据库文档.zip

    基于springboot的交通旅游订票系统源码数据库文档.zip

    GO语言教程:基础知识与并发编程

    内容概要:本文档是一份详细的GO语言教程,涵盖了Go语言的基础语法、数据类型、控制结构、函数、结构体、接口以及并发编程等多个方面。主要内容包括Go语言的基本概念和历史背景、环境配置、基本语法(如变量、数据类型、控制结构)、函数定义与调用、高级特性(如闭包、可变参数)、自定义数据类型(如结构体、接口)以及并发编程(如goroutine、channel、select)等内容。每部分内容都附有具体的代码示例,帮助读者理解和掌握相关知识点。 适合人群:具备一定编程基础的开发者,尤其是希望深入学习和应用Go语言的技术人员。 使用场景及目标:①初学者通过本教程快速入门Go语言;②有一定经验的开发者系统复习和完善Go语言知识;③实际项目开发中利用Go语言解决高性能、高并发的编程问题。 阅读建议:本文档全面介绍了Go语言的各项基础知识和技术细节,建议按章节顺序逐步学习,通过动手实践代码示例加深理解。对于复杂的概念和技术点,可以通过查阅更多资料或进行深入研究来巩固知识。

    time_series_at_a_point.ipynb

    GEE训练教程

    memcached笔记资料

    memcached笔记资料,配套视频:https://www.bilibili.com/list/474327672?sid=4486766&spm_id_from=333.999.0.0&desc=1

    基于springboot校内跑腿业务系统源码数据库文档.zip

    基于springboot校内跑腿业务系统源码数据库文档.zip

    计算机控制光感自动窗帘控制系统设计.doc

    计算机控制光感自动窗帘控制系统设计.doc

    基于SpringBoot的校园服务系统源码数据库文档.zip

    基于SpringBoot的校园服务系统源码数据库文档.zip

    基于SpringBoot+Vue的美容店信息管理系统源码数据库文档.zip

    基于SpringBoot+Vue的美容店信息管理系统源码数据库文档.zip

    基于springboot程序设计基础课程辅助教学系统源码数据库文档.zip

    基于springboot程序设计基础课程辅助教学系统源码数据库文档.zip

    原生JS实现斗地主小游戏源码.zip

    这是一个原生的JS网页版斗地主小游戏,代码注释全。带有斗地主游戏基本的地主、选牌、提示、出牌、倒计时等功能。简单好玩,欢迎下载

    基于springboot亚运会志愿者管理系统源码数据库文档.zip

    基于springboot亚运会志愿者管理系统源码数据库文档.zip

    毕业设计&课设_含多功能的远程控制工具集(已停维护),含命令行、文件管理、桌面功能.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    Sen2_NDVI_Max.txt

    GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载

    基于springboot家校合作平台源码数据库文档.zip

    基于springboot家校合作平台源码数据库文档.zip

Global site tag (gtag.js) - Google Analytics