[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 相关文章推荐
在iframe里的页面编写js,实现在父窗口上创建动画效果展开和收缩的div(不变动iframe父窗口代码)
Dec 20 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
May 24 Javascript
JQuery页面的表格数据的增加与分页的实现
Dec 10 Javascript
通过隐藏iframe实现文件下载的js方法介绍
Feb 26 Javascript
深入理解javascript构造函数和原型对象
Sep 23 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
Jun 16 Javascript
RGB和YUV 多媒体编程基础详细介绍
Nov 04 Javascript
js仿搜狐视频记录片列表展示效果
May 30 Javascript
JavaScript调试的多个必备小Tips
Jan 15 Javascript
JS验证input输入框(字母,数字,符号,中文)
Mar 23 Javascript
Vue.js组件实现选项卡以及切换特效
Jul 24 Javascript
JavaScript设计模式--简单工厂模式实例分析【XHR工厂案例】
May 23 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 应用程序安全防范技术研究
2009/09/25 PHP
给初学者的30条PHP最佳实践(荒野无灯)
2011/08/02 PHP
PHP根据IP地址获取所在城市具体实现
2013/11/27 PHP
PHP convert_cyr_string()函数讲解
2019/02/13 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
javascript之大字符串的连接的StringBuffer 类
2007/05/08 Javascript
JavaScript Date对象使用总结
2009/05/14 Javascript
js里的prototype使用示例
2010/11/19 Javascript
基于jquery实现漂亮的动态信息提示效果
2011/08/02 Javascript
JQuery each()函数如何优化循环DOM结构的性能
2012/12/10 Javascript
javascript文件中引用依赖的js文件的方法
2014/03/17 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
JS+CSS实现六级网站导航主菜单效果
2015/09/28 Javascript
jQuery语法小结(超实用)
2015/12/31 Javascript
Nodejs学习item【入门手上】
2016/05/05 NodeJs
jquery实现全选、全不选以及单选功能
2017/03/23 jQuery
vue组件如何被其他项目引用
2017/04/13 Javascript
关于jQuery.ajax()的jsonp碰上post详解
2017/07/02 jQuery
vue做网页开场视频的实例代码
2017/10/20 Javascript
vue项目中的webpack-dev-sever配置方法
2017/12/14 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
JS实现点星星消除小游戏
2020/03/24 Javascript
详解vue实现坐标拾取器功能示例
2020/11/18 Vue.js
python实现dnspod自动更新dns解析的方法
2014/02/14 Python
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
django+xadmin+djcelery实现后台管理定时任务
2018/08/14 Python
Python for循环与range函数的使用详解
2019/03/23 Python
关于Tensorflow使用CPU报错的解决方式
2020/02/05 Python
HTML5之WebGL 3D概述(下)—借助类库开发及框架介绍
2013/01/31 HTML / CSS
员工拾金不昧表扬信
2014/01/09 职场文书
物业管理工作方案
2014/05/10 职场文书
机关作风整顿个人剖析材料
2014/10/06 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
Mysql数据库表中为什么有索引却没有提高查询速度
2022/02/24 MySQL