[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 相关文章推荐
JavaScript 捕获窗口关闭事件
Jul 26 Javascript
EXTJS记事本 当CompositeField遇上RowEditor
Jul 31 Javascript
单击复制文字兼容各浏览器的完美解决方案
Jul 04 Javascript
js获取时间(本周、本季度、本月..)
Nov 22 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
Aug 21 Javascript
JS清除文本框内容离开在恢复及鼠标离开文本框时触发js的方法
Jan 12 Javascript
javascript基本算法汇总
Mar 09 Javascript
原生js实现类似fullpage的单页/全屏滚动
Jan 22 Javascript
JavaScrpt判断一个数是否是质数的实例代码
Jun 11 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
Aug 18 Javascript
javascript自定义日期比较函数用法示例
Jul 22 Javascript
js实现限定区域范围拖拉拽效果
Nov 20 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实现将GB编码转换为UTF8
2006/11/25 PHP
php入门学习知识点三 PHP上传
2011/07/14 PHP
PHP register_shutdown_function函数的深入解析
2013/06/03 PHP
PHP如何将log信息写入服务器中的log文件
2015/07/29 PHP
php实现的微信红包算法分析(非官方)
2015/09/25 PHP
PHP redis实现超迷你全文检索
2017/03/04 PHP
详解php中curl返回false的解决办法
2019/03/18 PHP
JavaScript控制图片加载完成后调用回调函数的方法
2015/03/20 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
JavaScript动态改变div属性的实现方法
2015/07/22 Javascript
jQuery简单实现页面元素置顶时悬浮效果示例
2016/08/01 Javascript
只要1K 纯JS脚本送你一朵3D红色玫瑰
2016/08/09 Javascript
微信小程序-详解数据缓存
2016/11/24 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
Bootstrap框架安装使用详解
2017/01/21 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
vue 设置proxyTable参数进行代理跨域
2018/04/09 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
angular组件间传值测试的方法详解
2020/05/07 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
python缩进区别分析
2014/02/15 Python
python将文本转换成图片输出的方法
2015/04/28 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Pycharm学习教程(1) 定制外观
2017/05/02 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
Python获取二维矩阵每列最大值的方法
2018/04/03 Python
python+webdriver自动化环境搭建步骤详解
2019/06/03 Python
Python中list的交、并、差集获取方法示例
2019/08/01 Python
Python continue语句实例用法
2020/02/06 Python
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
文明礼仪伴我行演讲稿
2014/05/12 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
Vue提供的三种调试方式你知道吗
2022/01/18 Vue.js
Win10鼠标轨迹怎么开 Win10显示鼠标轨迹方法
2022/04/06 数码科技
如何Tomcat中使用ipv6地址
2022/05/06 Servers