[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 相关文章推荐
Extjs学习过程中新手容易碰到的低级错误积累
Feb 11 Javascript
js日历功能对象
Jan 12 Javascript
javascript如何动态加载表格与动态添加表格行
Nov 27 Javascript
jQuery中:submit选择器用法实例
Jan 03 Javascript
深入探究使JavaScript动画流畅的一些方法
Jun 30 Javascript
RequireJS入门一之实现第一个例子
Sep 30 Javascript
老生常谈的跨域处理
Jan 11 Javascript
详解Node全局变量global模块
Sep 28 Javascript
node.js学习之事件模块Events的使用示例
Sep 28 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
Jul 19 Javascript
React+TypeScript+webpack4多入口配置详解
Aug 08 Javascript
javascript实现切割轮播效果
Nov 28 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调用Webservice实例代码
2011/07/29 PHP
PHP结合Ffmpeg快速搭建流媒体服务的实践记录
2018/10/31 PHP
thinkPHP框架实现的简单计算器示例
2018/12/07 PHP
一个加载js文件的小脚本
2007/06/28 Javascript
jQuery获取浏览器中的分辨率实现代码
2013/04/23 Javascript
jquery的attr方法禁用表单元素禁用输入内容
2014/06/23 Javascript
jQuery实现Email邮箱地址自动补全功能代码
2015/11/03 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
Bootstrap Table使用整理(三)
2017/06/09 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
JavaScript设计模式之装饰者模式实例详解
2019/01/17 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
layer.alert自定义关闭回调事件的方法
2019/09/27 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
[03:15]DOTA2-DPC中国联赛1月22日Recap集锦
2021/03/11 DOTA
Python输入二维数组方法
2018/04/13 Python
python判断数字是否是超级素数幂
2018/09/27 Python
对python指数、幂数拟合curve_fit详解
2018/12/29 Python
python中的RSA加密与解密实例解析
2019/11/18 Python
TensorFlow tf.nn.conv2d实现卷积的方式
2020/01/03 Python
解决python gdal投影坐标系转换的问题
2020/01/17 Python
Python如何实现小程序 无限求和平均
2020/02/18 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
html5的新增的标签和废除的标签简要概述
2013/02/20 HTML / CSS
台湾乐天市场:日本No.1的网路购物网站
2017/03/22 全球购物
Sunglasses Shop英国:欧洲领先的太阳镜在线供应商之一
2018/09/19 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?
2012/06/20 面试题
党员承诺书内容
2014/03/26 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
汽车技术服务与贸易专业求职信
2014/07/20 职场文书
慰问信范文
2015/02/14 职场文书
升学宴祝酒词
2015/08/11 职场文书
python b站视频下载的五种版本
2021/05/27 Python