将页面元素索引到JSON对象? 或者每次jQuery选择它?

我有一个DOM

  

home1

link1

things1

home2

link2

para2

我想将此索引为JSON如:

 { "body": { "div": [ { "h1": "header1", "a": "link1", "p": "para1" } ], "span": [ { "h1": "header2", "a": "link2", "p": "para2" } ] } } 

我试过这个:

  function indexELEMS() { listy = $("*[id]").map(function(){ outy = this.tagName+":"+this.id; return outy; }).get(); DOMobj = $.extend({}, listy); console.log(DOMobj); } 

但我得到这样的东西:

 0:"h1:home" 1:"a:link1" 2:"p:things1" 

可以理解,我刚刚告诉该function。

但是,如果我只是像h1这样尝试它:

  function indexELEMS() { outy = {}; listy = $("h1[id]").map(function(){ outy.h1s = this.tagName+":"+this.id; return outy; }).get(); DOMobj = $.extend({}, listy); console.log(DOMobj); } 

它会用最后一个覆盖outy.h1s ,如何将它添加到(JSON)对象?

或者更好的是,如何以漂亮的JSONforms获得整个文档元素结构输出?

我可以这样做: $('document > body > div > h1').attr('id')每次,但这是非常低效和资源密集的,我想缓存所有元素,然后读出来,当他们改变,(也许我会用.watch观察对象),或者在对象中添加,在适当的位置创建一个元素。

或者有更好的方法来概述哪些元素具有ID (并检查该ID是否重复),一些原生函数?

我也担心JSON对象不允许多个div:条目?

或者我应该完全选择jQuery选择器并停止抱怨效率?

(编辑:好的,多个div部分可能不可能,或者我不能用.div [1]访问第二个?)

所以,我的主要问题是,如果你采用indexELEMS函数,我怎样才能获得一个可访问的对象:

 DOMobj.body.div.h1 

所以我可以对它执行If == ,或者在$.each循环中使用div.[index]循环它

我想,循环使用DOMobj.body [index]而不是$(’ ‘),等等,我能否实际访问从$(’ ‘) 创建的对象 ? 喜欢.body? 它不是那么容易..

您的结构内部不一致: 有一个对象子对象,但它的所有子对象都是array-with-a-single-object。 这应该映射到任何页面DOM或只是您自己的一个自定义的?

如果您希望任何DOM能够表示为JSON,那么您所寻求的是这样的吗?

 [ { "tag": "body" , "children": [ { "tag": "div" , "children": [ { "tag": "h1" , "id": "header1" } , { "tag": "a" , "id": "link1" } , { "tag": "p" , "id": "para1" } ] } , { "tag": "span" , "children": [ { "tag": "h1" , "id": "header2" } , { "tag": "a" , "id": "link2" } , { "tag": "p" , "id": "para2" } ] } ] } ] 

如果你只使用这个JSON对象的大小写来回答关于DOM的查询,并做一些迭代,你可能最好使用$(’your.selector.here’)。每个和类似的代码执行你想要的测试。

如果你想在DOM中一直手动索引(找到的第二个

子的第五个元素,并告诉我它的id属性是"link5" ),你需要XPath:

 document.evaluate('//body/div[2]/a[5]/@id = "link5"', document).booleanValue