[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 相关文章推荐
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
Jun 14 Javascript
深入理解Javascript中的循环优化
Nov 09 Javascript
jquery仿搜索自动联想功能代码
May 23 Javascript
node.js中的fs.readFileSync方法使用说明
Dec 15 Javascript
学习JavaScript设计模式之状态模式
Jan 08 Javascript
javascript中的作用域和闭包详解
Jan 13 Javascript
javascript中的try catch异常捕获机制用法分析
Dec 14 Javascript
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
May 02 Javascript
js编写简单的计时器功能
Jul 15 Javascript
微信小程序之数据缓存的实例详解
Sep 29 Javascript
JS实现左边列表移到到右边列表功能
Mar 28 Javascript
详解JavaScript中new操作符的解析和实现
Sep 04 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读取数据库信息的几种方法
2008/05/24 PHP
PHP下对字符串的递增运算代码
2010/08/21 PHP
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
PHP的PSR规范中文版
2013/09/28 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
JQuery获取元素文档大小、偏移和位置和滚动条位置的方法集合
2010/01/12 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
png在IE6 下无法透明的解决方法汇总
2015/05/21 Javascript
jquery.cookie.js实现用户登录保存密码功能的方法
2016/04/15 Javascript
JavaScript trim 实现去除字符串首尾指定字符的简单方法
2016/12/27 Javascript
jquery submit()不能提交表单的解决方法
2017/04/24 jQuery
Vue源码解读之Component组件注册的实现
2018/08/24 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
[04:52]第二届DOTA2亚洲邀请赛主赛事第一天比赛集锦:OG娜迦海妖放大配合谜团大中3人
2017/04/02 DOTA
Python学习资料
2007/02/08 Python
python使用htmllib分析网页内容的方法
2015/05/08 Python
在Django的视图中使用数据库查询的方法
2015/07/16 Python
Python的Flask框架中的Jinja2模板引擎学习教程
2016/06/30 Python
Python性能提升之延迟初始化
2016/12/04 Python
django 创建过滤器的实例详解
2017/08/14 Python
深入理解Django的自定义过滤器
2017/10/17 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
详解Python中的type和object
2018/08/15 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
python实现跨excel sheet复制代码实例
2020/03/03 Python
pytorch掉坑记录:model.eval的作用说明
2020/06/23 Python
苏格兰领先的多渠道鞋店:Begg Shoes
2019/10/22 全球购物
若干个Java基础面试题
2015/05/19 面试题
大三预备党员入党思想汇报
2014/01/08 职场文书
个人四风问题整改措施
2014/10/24 职场文书
订货会主持词
2015/07/01 职场文书
技能培训通讯稿
2015/07/18 职场文书