[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 EasyUI API 中文文档 - ComboGrid 组合表格
Oct 13 Javascript
Prototype源码浅析 String部分(一)之有关indexOf优化
Jan 15 Javascript
JavaScript词法作用域与调用对象深入理解
Nov 29 Javascript
js如何打印object对象
Oct 16 Javascript
js实现点击获取验证码倒计时效果
Jan 28 Javascript
原生js和jQuery实现淡入淡出轮播效果
Dec 25 Javascript
基于BootStrap Metronic开发框架经验小结【三】下拉列表Select2插件的使用
May 12 Javascript
JavaScript操作 url 中 search 部分方法函数
Jun 15 Javascript
Javascript基础回顾之(三) js面向对象
Jan 31 Javascript
js表单序列化判断空值的实例
Sep 22 Javascript
Angular8基础应用之表单及其验证
Aug 11 Javascript
基于JavaScript实现表格隔行换色
May 08 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/17 数码科技
解析PHP 使用curl提交json格式数据
2013/06/29 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
2014/11/14 PHP
thinkphp多层MVC用法分析
2015/12/30 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
PHP中ltrim()函数的用法与实例讲解
2019/03/28 PHP
DOM Scripting中的图片切换[兼容Firefox]
2010/06/12 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
jQuery登陆判断简单实现代码
2013/04/21 Javascript
将HTML格式的String转化为HTMLElement的实现方法
2014/08/07 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
使用JS获取页面上的所有标签
2018/10/18 Javascript
vue开发环境配置跨域的方法步骤
2019/01/16 Javascript
Javascript异步编程async实现过程详解
2020/04/02 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[43:58]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第二局
2016/02/27 DOTA
Python常用的日期时间处理方法示例
2015/02/08 Python
将Django框架和遗留的Web应用集成的方法
2015/07/24 Python
一个简单的python爬虫程序 爬取豆瓣热度Top100以内的电影信息
2018/04/17 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
python装饰器的特性原理详解
2019/12/25 Python
使用pickle存储数据dump 和 load实例讲解
2019/12/30 Python
PyTorch的自适应池化Adaptive Pooling实例
2020/01/03 Python
TensorFlow加载模型时出错的解决方式
2020/02/06 Python
html5 application cache遇到的严重问题
2012/12/26 HTML / CSS
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
2014年平安夜寄语
2014/12/08 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
圣诞晚会主持词
2015/07/01 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
我的收音机情缘
2022/04/05 无线电
SQL Server 忘记密码以及重新添加新账号
2022/04/26 SQL Server