html2ja:将html目标元素解析为JavaScript数组字面量,每项的值为tagName, className, id等CSS选择器组合; 
showJa:将html2ja生成的数组缩进格式化显示; 
walkDOM:遍历DOM目标元素(这个来自老道的the Good Parts)。 
ja2html:与html相反的过程 
PS:以上代码只是简单的构思测试,实际使用请自行完善。
​1. [代码][JavaScript]代码

/*
<html>
<head>
  <title>HTML RESTructure</title>
<style>
</style>
<script>
*/
// workDOM函数遍历目标元素或节点
// 有两种模式:
//   1. `element`模式(默认)(包含所定义的元素项)
//   2. `node`模式(包含文本节点在内的所有节点)
function walkDOM(mode) {
  var m = mode || "element";
  var f = "firstElementChild",
      n = "nextElementSibling";
  if (m === "node") {
    f = "firstChild";
    n = "nextSibling";
  }
 
  return function _(val, func) {
    func(val);
    val = val[f];
    while (val) {
      _(val, func);
      val = val[n];
    }
  };
}
// html2ja函数将HTML目标元素转换为JavaScript数组,
// 这个函数中调用了eval函数, 并且为每一个目标范围
// 内的元素加了一个index属性(这是特意设置的)。
function html2ja(elt) {
  var walk = walkDOM(),
      lis;
  walk(elt, function (el) {
    var pe = el.parentElement,
        pes = el.previousElementSibling;
 
    var sel = el.tagName;
    if (el.className)
      sel += ' .' + el.className;
    if (el.id)
      sel += ' #' + el.id;
 
    if (el === elt) {
      el.index = '0';
      lis = [sel];
    } else {
      if (pes) {
        el.rank = pes.rank + 1;
      } else {
        el.rank = 1;
        }
      var t = pe.index.split(',').slice(0,-1).concat(el.rank);
      el.index = t.concat(0).join(',');
      eval('lis[' + t.join('][') + '] = [sel];');
    }
  });
  return lis;
}
 
window.onload = function () {
  var ind = '';
  var showJa = function _(o) {
    var i,
        s = '';   
    for (i = 0; i < o.length; i++) {
      var s1;
      if (typeof o[i] === 'object') {
        ind += '\t';
        s = s.slice(0, -1) + ',\n' + ind + _(o[i]) + ']';
      } else {
        s = s.slice(0, -1) + '["' + o[i] + '"]';
        }
     }
    ind = ind.slice(0, -1);
    return s;
  };
 
  document.getElementById("code-pre").innerText = showJa(html2ja(document.documentElement));
};
/*
</script>
</head>
<body>
<div id="header">
<h1 align="center">HTML RESTructure</h1>
<p align="right">[HTML] + [REST] + [JSON] = [HTML RESTructure]</p>
</div>http://www.enterdesk.com/special/shouhui/​
<div id="main">手绘图片
<div class="article" id="art_1">
<h2>HTML <==> REST</h2>
<p>
<pre>
  HTML DOM是一个树形的文档模型,
所以很方便的将其转化为其它数据结构。
这里,我将DOM映射到JSON,具体来说,
是用JavaScript Array字面量表示出来。
  而REST也可以JSON的方式保存其状态
及逻辑结构,若是通过JSON架起这座从
HTML到REST(或反过来)的桥梁,数据
结构将会变得异常清晰,内容管理更便
捷。
</pre>
</p>
</div>
<div class="article" id="art_2">
<h2>XHTML Core Elements</h2>
<p>
<pre>
通常情况下,有这些就足够了:
  1. DIV: 块
  2. P: 段落
  3. SPAN: 节
  4. A: 锚
  5. H1-H6: 标题
  6. UL & LI: 无序列表
  7. PRE: 预格式文本
</pre>
</p>
</div>
<div class="article" id="art_3">
<h2>JavaScript Array</h2>
<p>
<pre id="code-pre">
</pre>
</p>
</div>
</div>
<div id="footer">
<p align="center">&copy; <a class="user-name" href="mailto: rugby@gmail.com">rugby</a>, 2011</p>
</div>
</body>
</html>
*/
2. [代码][JavaScript]代码  
/*
<script>
*/
// 将JavaScript嵌套数组转换为HTML DOM结构
// 与上面的html2ja刚好相反
var ja2html = function _(ja, dst) {
  var els = ja[0].split(' '),
      elt = document.createElement(els[0]);
  if (dst.tagName !== els[0]) {
    if (els.length > 1) {
      if (els.length < 3) {
        var sig = els[1].slice(0,1);
        if (sig === '.')
          elt.className = els[1].slice(1);
        else
          elt.id = els[1].slice(1);  
      } else {
        elt.className = els[1].slice(1);
        elt.id = els[2].slice(1);
      }
    }
    dst.appendChild(elt);
    dst = elt;
  }
  var j = 1;
  while (j < ja.length) {
    _(ja[j], dst);
    j += 1;
  }
};
 
// 测试
var ja = (
["HTML",
    ["HEAD",
        ["TITLE"],
        ["STYLE"],
        ["SCRIPT"]],
    ["BODY",
        ["DIV #header",
            ["H1"],
            ["P"]],
        ["DIV #main",
            ["DIV .article #art_1",
                ["H2"],
                ["P"],
                ["PRE"],
                ["P"]],
            ["DIV .article #art_2",
                ["H2"],
                ["P"],
                ["PRE"],
                ["P"]],
            ["DIV .article #art_3",
                ["H2"],
                ["P"],
                ["PRE #code-pre"],
                ["P"]]],
        ["DIV #footer",
            ["P",
                ["A .user-name"]]]]]
);
// alert(ja);
window.onload = function () { ja2html(ja[2], document.body); };
/*
</script>
*/

HTML(DOM)与JavaScript嵌套数组之间相互转换的更多相关文章

  1. php中 xml json 数组 之间相互转换

    php中 xml json  数组 之间相互转换 1 数组转json $result = array( 'status' =>$status, 'message'=>$message, ' ...

  2. DOM与JavaScript、jQuery之间的关系

    DOM(document object model) 其实是浏览器内元素对象的一个总称 我们用JavaScript对网页进行的所有操作都是通过DOM进行的.DOM属于浏览器,而不是JavaScript ...

  3. Java ArrayList 数组之间相互转换

    做研发的朋友都知道,在项目开发中经常会碰到list与数组类型之间的相互转换,本文通过一个简单的例子给大家讲解具有转换过程. package test.test1; import java.util.A ...

  4. 关于js中的json对象,json串,数组之间相互转换

    将json对象转换成string var loginUser = {username: username, password: password}//方式一 localStorage.setItem( ...

  5. DOM,浏览器,javascript,html之间的关系

    来源于:https://github.com/hucheng91/myBlog/blob/master/web/dom/dom.md DOM定义 DOM可以以一种独立于平台和语言的方式访问和修改一个文 ...

  6. java代码中fastjson生成字符串和解析字符串的方法和javascript文件中字符串和json数组之间的转换方法

    1.java代码中fastjson生成字符串和解析字符串的方法 List<TemplateFull> templateFulls = new ArrayList<TemplateFu ...

  7. HTML与DOM BOM javascript

    1.什么是DOM? 简单说就是DOM规定了HTML,XML等的一些文档映射规范,使JavaScript可以根据这些规范来进行获取元素,在元素上进行各种操作,使得用户页面可以动态的变化,从而大大使页面的 ...

  8. JS对象与Dom对象与jQuery对象之间的区别

    前言 通过问题看本质: 举例: js的写法:document.getElementById('save').disabled=true; 在jquery中我是这样写的 $("#save&qu ...

  9. 前端面试之JavaScript中数组的方法!【残缺版!!】

    前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...

随机推荐

  1. 匿名块的四个类型(type rowtype record table)

    Oracle PL/SQL块 匿名块的四个类型 type rowtype record table ---- type (列类型)  %type类型是指声明变量的时候,参考某个表的某个列的类型---- ...

  2. TF-IDF学习笔记

    计算文本的权重向量,有个很有效的权重方案:TF-IDF权重策略.TF-IDF含义是词频逆文档频率,指的是,如果某个词或短语在一篇文章中出现的频率高,并且在其他文章中很少出现,则认为此词或短语具有很好的 ...

  3. Ubuntu 16.04下使用Wine安装文件内容搜索工具Search and Replace

    说明: 1.使用的Wine版本是深度出品(Deepin),已经精简了很多没用的配置,使启动能非常快,占用资源小. 2.关于没有.wine文件夹的解决方法:在命令行上运行winecfg: 下载: (链接 ...

  4. 一道简单DP题

    问题: 给定一个整数的数组,相邻的数不能同时选,求从该数组选取若干整数,使得他们的和最大,要求只能使用o(1)的空间复杂度.要求给出伪码. 解答: int maxSum(vector<int&g ...

  5. 【redis】4.spring boot集成redis,实现数据缓存

    参考地址:https://spring.io/guides/gs/messaging-redis/ ================================================== ...

  6. Testing Is the Engineering Rigor of Software Development

    Testing Is the Engineering Rigor of Software Development Neal Ford DEVELOPERS LOVE TO USE TORTURED M ...

  7. 从零開始开发Android版2048 (二)获取手势信息

    今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了Gestu ...

  8. favico是针对网页图标内容更改

    favico.js源码 (function () { var Favico = function (opt) { "use strict"; opt = opt ? opt : { ...

  9. 在pypy环境中运行odoo8

    PyPy是一个独立的解析器, 通过即时编译(JIT,Just-in-time)代码避免逐行解释执行来提升运行速度的(将编译过的行代码缓存起来,从而加快速度).我们一般使用的Python一般是使用C实现 ...

  10. pascals-triangleI、II——生成规律的三角形

    1.Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Ret ...