[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 相关文章推荐
显示、隐藏密码
Jul 01 Javascript
关于javascript function对象那些迷惑分析
Oct 24 Javascript
JavaScript事件处理器中的event参数使用介绍
May 24 Javascript
非常漂亮的JS+CSS图片幻灯切换特效
Nov 20 Javascript
JavaScript保存并运算页面中数字类型变量的写法
Jul 06 Javascript
javascript类型系统——日期Date对象全面了解
Jul 13 Javascript
不间断循环滚动效果的实例代码(必看篇)
Oct 08 Javascript
微信小程序 request接口的封装实例代码
Apr 26 Javascript
把vue-router和express项目部署到服务器的方法
Feb 21 Javascript
JS中使用new Option()实现时间联动效果
Dec 10 Javascript
Vue学习之组件用法实例详解
Jan 06 Javascript
vue.js+element 默认提示中英文操作
Nov 11 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导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
PHP对接微信公众平台消息接口开发流程教程
2014/03/25 PHP
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
thinkPHP批量删除的实现方法分析
2016/11/09 PHP
详解使用php调用微信接口上传永久素材
2017/04/11 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
js获取url中指定参数值的示例代码
2013/12/14 Javascript
javascript实现的固定位置悬浮窗口实例
2015/04/30 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
js中数组结合字符串实现查找(屏蔽广告判断url等)
2016/03/30 Javascript
js判断复选框是否选中及选中个数的实现代码
2016/05/30 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
一篇文章,教你学会Vue CLI 插件开发
2019/04/17 Javascript
微信小程序页面间传值与页面取值操作实例分析
2019/04/30 Javascript
Vue数据绑定简析小结
2019/05/07 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
atom-design(Vue.js移动端组件库)手势组件使用教程
2019/05/16 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
VUE中鼠标滚轮使div左右滚动的方法详解
2020/12/14 Vue.js
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
Python实现多级目录压缩与解压文件的方法
2018/09/01 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
pytorch::Dataloader中的迭代器和生成器应用详解
2020/01/03 Python
Python接口测试结果集实现封装比较
2020/05/01 Python
Python-jenkins 获取job构建信息方式
2020/05/12 Python
Keras自定义IOU方式
2020/06/10 Python
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
幼儿师范毕业生自荐信
2013/11/09 职场文书
大学生找工作求职信
2014/07/09 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
怎样写观后感
2015/06/19 职场文书
go goth封装第三方认证库示例详解
2022/08/14 Golang