博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[js高手之路]HTML标签解释成DOM节点
阅读量:6701 次
发布时间:2019-06-25

本文共 2447 字,大约阅读时间需要 8 分钟。

最近在封装一个开源框架,已经写了500行, 已经具备jquery的大多数常用功能,后面还会扩展大量的工具函数和MVVM双向驱动等功能。跟jquery的使用方法完全一样,jquery的选择器,几乎都能支持,为什么说这事,跟这篇文章的主题有毛关系呢?因为这篇文章要讲的就是我在写框架过程中碰到的一个问题,封装jquery的after方法,支持DOM和html标签两种用法,html标签传参,我要把html解释成DOM结构,用DOM的方法插入.

首先,我们写个通用的html标签:

<div οnclick="test();" style="color:red;background:green;" name="test" id="test">this is a test string</div>
这个html包括了事件,样式,属性,内容.
我们接着用正则把这个html的每一部分匹配出来,我们需要的是:
1、标签名, 因为创建dom节点的时候需要
2、属性和内容都要单独分离出来
为了便于创建dom,我们用一个json保存,比如这个标签,我们要处理成的最终结果是:
{
id:"test
inner:"this is a test string
name:"test"
onclick:"test();"
style:"color:red;background:green;"
tag:"div"
}
如果有了这个结构,只要拿到对应的键和值,组装成一个dom就可以搞定了
  
1         var o = document.createElement( obj['tag'] );2         o.innerHTML = obj['inner'];3         delete obj['inner'];4         delete obj['tag'];5         for( var key in obj ){6             o.setAttribute( key, obj[key] );7         } 8         document.body.appendChild( o );

解释思路已经明确,那么我们首先就要把html标签的每部分用正则表达式匹配出来

1         var re = /<(\w+\s*)(\w+[=][\'\"](.*)?[\'\"]\s*)*>(.*)?<\/\w+>/;2         var str = '
this is a test string
';3 var res = str.match(re);

恩,这就是我们匹配出来的结果,从图中可以看出,

res[1]存储的是标签名称,只需要把两边的空格去掉

res[2]存储的是属性和值,我们用split函数按空格切割一次,再用split函数按'='切割一次,就能分解出来了

res[4]存储的就是字符串的内容

上面3部分,只要用循环和字符串稍加处理就可以得出目标结果了

那么完整的处理代码就是:

1         var re = /<(\w+\s*)(\w+[=][\'\"](.*)?[\'\"]\s*)*>(.*)?<\/\w+>/; 2         var str = '
this is a test string
'; 3 var res = str.match(re); 4 5 var tagName = null, attrList = [], arr = [], obj = {}; 6 if( res[1] ) { 7 tagName = res[1].trim(); 8 obj['tag'] = tagName; 9 }10 if( res[4] ) {11 obj['inner'] = res[4];12 }13 if ( res[2] ) {14 attrList = res[2].split( /\s+/ );15 for( var i = 0, len = attrList.length; i < len; i++ ){16 arr = attrList[i].split("=");17 // console.log( arr );18 obj[arr[0]] = arr[1].replace( /(^[\'\"]+|[\'\"]$)/g, function(){19 return '';20 } );21 }22 }23 24 var o = document.createElement( obj['tag'] );25 o.innerHTML = obj['inner'];26 delete obj['inner'];27 delete obj['tag'];28 for( var key in obj ){29 o.setAttribute( key, obj[key] );30 } 31 document.body.appendChild( o );

可以自行封装一个函数,我相信你应该轻易就能封装出来吧.

 

转载地址:http://vlgoo.baihongyu.com/

你可能感兴趣的文章
你好,C++(34)有一只叫做多利的羊 6.2.4 拷贝构造函数
查看>>
[Android Studio] Android Studio如何提示函数用法
查看>>
[Web 前端] 解决因inline-block元素导致的空白间距和元素下沉
查看>>
ORACLE数据库 常用命令和Sql常用语句
查看>>
《结对-贪吃蛇-需求分析》
查看>>
面向对象编程
查看>>
java 常用工具类的使用<一>
查看>>
A Neural Algorithm of Artistic Style
查看>>
Camera Calibration 相机标定:原理简介(三)
查看>>
ArrayList的使用方法【转载】
查看>>
String.Format格式说明
查看>>
Linux的proc文件系统详解
查看>>
Beta 冲刺(6/7)
查看>>
Kubernetes集群(概念篇)
查看>>
微软Hololens学院教程- Holograms 101: Introduction with Device【微软教程已经更新,本文是老版本】...
查看>>
Frequent Pattern 挖掘之二(FP Growth算法)(转)
查看>>
int * const 和 const int *
查看>>
requests模块相关用法
查看>>
linux
查看>>
vue菜单切换
查看>>