【问题标题】:Wrapping and unwrapping HTML content in tDOM在 tDOM 中包装和展开 HTML 内容
【发布时间】:2022-08-21 06:11:16
【问题描述】:

您能告诉我这些是否是将选择包装在新标签中并将标签内容解包到同一节点位置的父节点的正确方法吗?它们似乎适用于我的 HTML 内容,但想知道这是否是正确的方法。

此外,当子节点被替换时,被替换的子节点是从内存中释放还是应该被编码?

谢谢你。

proc wrap {path tag} {
  foreach item [$::doc selectNodes $path] {
    set wrapper [$::doc createElement $tag]
    # This fails if $item has more than one child node.
    # $wrapper appendFromList [[$item childNodes] asList]
    foreach child [$item childNodes] {
      $wrapper appendChild $child
    }
    [$item parentNode] replaceChild $wrapper $item
  }
}

proc unwrap {path} {
  foreach item [$::doc selectNodes $path] {
    foreach child [$item childNodes] {
      [$item parentNode] insertBefore $child $item
    }
    $item delete
  }
}
  • 思考tDOM 会进行垃圾收集,前提是您不持有引用。
  • tDOM 要求您明确地 delete 一个节点(就像您在 unwrap proc 中所做的那样); replaceChildremoveChild 将在内部维护至少一个引用,该引用被 tDOM 称为文档片段列表。

标签: dom tcl tdom


【解决方案1】:

你的unwrap 实现对我来说看起来不错,但replaceChild 真的给你一个包装器元素吗?

我希望wrap 能够像这样工作:

proc wrap {path tag} {
  set els [$::doc selectNodes $path]
  if {[llength $els]} {
    set el [lindex $els 0]
    set wrapper [$::doc createElement $tag]
    [$el parentNode] insertBefore $wrapper $el
    foreach el $els {
      $wrapper appendChild $el
    }
  }
}

还有一些说明:

  • 也许可以明确地传递文档,而不是到处引用全局范围的变量::doc
  • 也许将包装器元素返回为wrap 的返回值,或者返回空字符串来表示不匹配?

【讨论】:

    猜你喜欢
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 1970-01-01
    相关资源
    最近更新 更多