[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 相关文章推荐
Jquery Ajax.ashx 高效分页实现代码
Oct 20 Javascript
jQuery源码分析之Event事件分析
Jun 07 Javascript
理解Javascript_06_理解对象的创建过程
Oct 15 Javascript
SyntaxHighlighter语法高亮插件使用说明
Aug 14 Javascript
学习javascript的闭包,原型,和匿名函数之旅
Oct 18 Javascript
jquery获取复选框checkbox的值的简单实现方法
May 26 Javascript
JS制作图形验证码实现代码
Oct 19 Javascript
AngularJs $parse、$eval和$observe、$watch详解
Sep 21 Javascript
jQuery实现淡入淡出的模态框
Feb 09 Javascript
JavaScript实现256色转灰度图
Feb 22 Javascript
JS实现字符串去重及数组去重的方法示例
Apr 21 Javascript
vue 翻页组件vue-flip-page效果
Feb 05 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
星际玩家的三大定律
2020/03/04 星际争霸
Yii调试查看执行SQL语句的方法
2016/07/15 PHP
PHP单元测试框架PHPUnit用法详解
2019/01/23 PHP
JavaScript实现禁止后退的方法
2006/12/27 Javascript
实现web打印的各种方法介绍及实现代码
2013/01/09 Javascript
jquery获得页面元素的坐标值实现思路及代码
2013/04/15 Javascript
jquery实现图片左右切换的方法
2015/05/07 Javascript
JavaScript中this详解
2015/09/01 Javascript
javascript函数式编程程序员的工具集
2015/10/11 Javascript
js实现微信分享代码
2020/10/11 Javascript
详解如何将 Vue-cli 改造成支持多页面的 history 模式
2017/11/20 Javascript
JS控制鼠标拒绝点击某一按钮的实例
2017/12/29 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
javascript、php关键字搜索函数的使用方法
2018/05/29 Javascript
Vue模板语法中数据绑定的实例代码
2019/05/17 Javascript
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
js实现AI五子棋人机大战
2020/05/28 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 SAG vs DLG BO3 第二场 2月28日
2021/03/11 DOTA
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
详解Python 数据库的Connection、Cursor两大对象
2018/06/25 Python
利用python修改json文件的value方法
2018/12/31 Python
Python小进度条显示代码
2019/03/05 Python
python图形开发GUI库pyqt5的基本使用方法详解
2020/02/14 Python
python sitk.show()与imageJ结合使用常见的问题
2020/04/20 Python
Python celery原理及运行流程解析
2020/06/13 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
在Python中实现字典反转案例
2020/12/05 Python
解决html5中video标签无法播放mp4问题的办法
2017/05/07 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
资产评估专业大学生求职信
2013/09/29 职场文书
车工岗位职责
2013/11/26 职场文书
初中语文教学反思
2014/02/02 职场文书
企业军训感言
2014/02/08 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript