【发布时间】:2014-12-05 21:08:35
【问题描述】:
我希望实现以下 Javascript 函数:
function AllToDom(partsArray)
{
// Magic!
}
// Called like:
var rowObject = AllToDom(['<tr>', tdElem1, tdElem2, '<td>XXX</td>', '<td>',
divContents,'</td></tr>']);
// Where tdElem1, tdElem2, divContents are DOM node objects.
问题是我希望它适用于 DOM 节点和 HTML 片段的任何类型的组合。当然,只要它产生有效的 HTML。允许未封闭的 HTML 标记和不允许的元素组合(如 <table><div></div>)具有未定义的行为。
我的第一个想法是将它们全部连接到一个 HTML 字符串中,除了在 DOM 元素的位置添加一个占位符注释 <!--SNOOPY-->。所以上面会产生以下字符串:
<tr><!--SNOOPY--><!--SNOOPY--><td>XXX</td><td><!--SNOOPY--></td></tr>
这已经是一段有效的 HTML,所以接下来我创建一个 <div>,将其分配给 innerHTML,收集生成的 DOM 节点,并遍历它们并将所有 <!--SNOOPY--> 替换为相应的 DOM 元素。
但是,这种方法有两个缺陷:
- 将
<tr>作为子元素添加到<div>无效。我不知道它是否在某些情况下不会中断。 - Internet Explorer 8(我需要支持的最低版本)在分配给
innerHTML时会删除所有 cmets。
有什么解决方法吗?这可能吗?
【问题讨论】:
-
那么,parms 中传递的所有标签和元素都是兄弟,对吧?
-
@JonathanM - 不,不一定。请参阅示例。
-
对于缺陷 #2,您可以使用
document.createComment -
@AlvaroMontoro - 不,我不能。我需要在 HTML 字符串中插入 SOMETHING ,以便在将其转换为 DOM 元素后,我可以再次找到它并替换为提供的正确元素。评论是我能想到的唯一在任何上下文中有效的东西。
-
这个想法是:遍历数组,如果元素是字符串,则执行
innerHTML += string,否则将document.createComment("string to identify the element later")附加到div。还是做innerHTML+=之后cmets被淘汰了?
标签: javascript html templates dom internet-explorer-8