[js高手之路]HTML标签解释成DOM节点的实现方法


Posted in Javascript onAugust 31, 2017

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

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

<div onclick="test();" 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就可以搞定了

var o = document.createElement( obj['tag'] );
  o.innerHTML = obj['inner'];
  delete obj['inner'];
  delete obj['tag'];
  for( var key in obj ){
   o.setAttribute( key, obj[key] );
  } 
  document.body.appendChild( o );

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

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

[js高手之路]HTML标签解释成DOM节点的实现方法

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

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

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

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

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

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

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

  var tagName = null, attrList = [], arr = [], obj = {};
  if( res[1] ) {
   tagName = res[1].trim();
   obj['tag'] = tagName;
  }
  if( res[4] ) {
   obj['inner'] = res[4];
  }
  if ( res[2] ) {
   attrList = res[2].split( /\s+/ );
   for( var i = 0, len = attrList.length; i < len; i++ ){
    arr = attrList[i].split("=");
    // console.log( arr );
    obj[arr[0]] = arr[1].replace( /(^[\'\"]+|[\'\"]$)/g, function(){
     return '';
    } );
   }
  }

  var o = document.createElement( obj['tag'] );
  o.innerHTML = obj['inner'];
  delete obj['inner'];
  delete obj['tag'];
  for( var key in obj ){
   o.setAttribute( key, obj[key] );
  } 
  document.body.appendChild( o );

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

以上这篇[js高手之路]HTML标签解释成DOM节点的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
封装好的省市地区联动控件附下载
Aug 13 Javascript
JavaScript的9个陷阱及评点分析
May 16 Javascript
JS 页面计时器示例代码
Oct 28 Javascript
Event altKey,ctrlKey,shiftKey属性解析
Dec 18 Javascript
js简单的表格添加行和删除行操作示例
Mar 31 Javascript
JavaScript设计模式之单例模式详解
Jun 09 Javascript
使用vue-router完成简单导航功能【推荐】
Jun 28 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
Aug 22 Javascript
详解微信小程序支付流程与梳理
Jul 16 Javascript
Vue前端项目部署IIS的实现
Jan 06 Javascript
Element Dialog对话框的使用示例
Jul 26 Javascript
详解JavaScript自定义函数
Jul 29 Javascript
基于JSON数据格式详解
Aug 31 #Javascript
浅谈js中的this问题
Aug 31 #Javascript
js实现图片放大展示效果
Aug 30 #Javascript
详解js几个绕不开的事件兼容写法
Aug 30 #Javascript
JavaScript实现滑动导航栏效果
Aug 30 #Javascript
详解vue-cli 构建Vue项目遇到的坑
Aug 30 #Javascript
前端开发不得不知的10个最佳ES6特性
Aug 30 #Javascript
You might like
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
PNGHandler-借助JS让PNG图在IE下实现透明(包括背景图)
2007/08/31 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
通过JS来判断页面控件是否获取焦点
2014/01/03 Javascript
jQuery之选项卡的简单实现
2014/02/28 Javascript
让table变成exls的示例代码
2014/03/24 Javascript
js打开windows上的可执行文件示例
2014/05/27 Javascript
javascript实现获取浏览器版本、操作系统类型
2015/01/29 Javascript
Jquery日历插件制作简单日历
2015/10/28 Javascript
JS中JSON对象和String之间的互转及处理技巧
2016/04/06 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
微信小程序 侧滑删除(左滑删除)
2017/05/23 Javascript
vue-cli webpack模板项目搭建及打包时路径问题的解决方法
2018/02/26 Javascript
vue自动路由-单页面项目(非build时构建)
2019/04/30 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
vue-router的hooks用法详解
2020/06/08 Javascript
python算法表示概念扫盲教程
2017/04/13 Python
python将文本中的空格替换为换行的方法
2018/03/19 Python
Python 从相对路径下import的方法
2018/12/04 Python
关于Python内存分配时的小秘密分享
2019/09/05 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
django 实现简单的插入视频
2020/04/07 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
从0到1使用python开发一个半自动答题小程序的实现
2020/05/12 Python
用60行代码实现Python自动抢微信红包
2021/02/04 Python
pycharm 实现光标快速移动到括号外或行尾的操作
2021/02/05 Python
英国最大的汽车交易网站:Auto Trader UK
2016/09/23 全球购物
求职简历自荐信
2013/10/20 职场文书
房产公证委托书范本
2014/09/20 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
歌剧魅影观后感
2015/06/05 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
Golang解析JSON对象
2022/04/30 Golang
python神经网络 tf.name_scope 和 tf.variable_scope 的区别
2022/05/04 Python