[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 相关文章推荐
许愿墙中用到的函数
Oct 07 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
Dec 03 Javascript
JavaScript检查子字符串是否在字符串中的方法
Feb 03 Javascript
JS检测移动端横竖屏的代码
May 30 Javascript
jQuery实现移动端手机商城购物车功能
Sep 24 Javascript
Vue制作Todo List网页
Apr 26 Javascript
Angularjs中的验证input输入框只能输入数字和小数点的写法(推荐)
Aug 16 Javascript
es6中的解构赋值、扩展运算符和rest参数使用详解
Sep 28 Javascript
Angular4绑定html内容出现警告的处理方法
Nov 03 Javascript
详解vue-cli 本地开发mock数据使用方法
May 29 Javascript
Vuex的API文档说明详解
Feb 05 Javascript
JavaScript 语句之常用 for 循环详解
Mar 29 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
2019年中国咖啡业现状与发展趋势
2021/03/04 咖啡文化
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
PHP学习笔记(二):变量详解
2015/04/17 PHP
yum命令安装php7和相关扩展
2016/07/04 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
2016/10/28 PHP
php正则修正符用法实例详解
2016/12/29 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
Javascript数组Array基础介绍
2016/03/13 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
Angular模板表单校验方法详解
2017/08/11 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
用图片替换checkbox原始样式并实现同样的功能
2018/11/15 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
python 显示数组全部元素的方法
2018/04/19 Python
Python序列对象与String类型内置方法详解
2019/10/22 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
html5实现多文件的上传示例代码
2014/02/13 HTML / CSS
英国知名化妆品网站:Revolution Beauty(原TAM Beauty)
2018/02/28 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
计算机开发个人求职信范文
2013/09/26 职场文书
财务工作者先进事迹材料
2014/01/17 职场文书
临床专业自荐信
2014/06/22 职场文书
幼师辞职信范文大全
2015/05/12 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
详解Python为什么不用设计模式
2021/06/24 Python
springboot临时文件存储目录配置方式
2021/07/01 Java/Android