将HTML字符串解析为DOM节点的实现逻辑与代码

作者:窗边听雨

时间:2026-10-23

浏览:401

本文详细讲解了如何在封装JS框架时,将HTML字符串解析为DOM节点。通过正则表达式提取标签名、属性和内容,构建中间JSON结构,再利用createElement和setAttribute方法动态生成DOM元素。该方法支持封装jQuery的after等API,实现HTML标签与DOM对象的无缝转换,适用于MVVM框架及工具函数扩展。

文章目录

HTML转DOM解析背景与需求

近期在开发一个开源框架,目前已完成500行代码,实现了jQuery的大部分常用功能,后续还将扩展大量工具函数及MVVM双向绑定等功能。该框架的使用方式与jQuery完全一致,几乎兼容jQuery的所有选择器。提及这些背景是因为本文旨在解决框架开发中遇到的一个具体问题:封装jQuery的after方法,使其同时支持传入DOM对象和HTML字符串。当传入HTML字符串时,需要将其解析为DOM结构,再通过DOM方法插入页面。

HTML结构分析与正则匹配策略

首先,我们定义一个通用的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);

HTML转DOM解析背景与需求

以下是匹配后的结果示意图,从图中可以看出:

res[1]存储的是标签名称,只需去除首尾空格即可。

res[2]存储的是属性和值,我们可以先使用split函数按空格分割,再使用split函数按'='分割,从而分解出各个属性。

res[4]存储的是字符串的内容部分。

上述三个部分,只需通过循环和简单的字符串处理,即可得出目标结果。

核心解析代码实现

完整的处理代码如下:


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 );

你可以自行封装一个函数,相信这并不难实现。

以上关于将HTML标签解释为DOM节点的实现方法的全部内容分享给大家,希望能提供参考,也希望大家多多支持本站。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章