从文档片段中删除带有 (nodeName = "script") 的所有节点 *在将其放入 dom* 之前
我的目标是删除所有 <[script]>在将片段插入 dom 之前,从文档片段中提取节点(保持片段的其余部分不变)。
我的片段是由以下内容创建的,看起来像这样:
range = document.createRange();
range.selectNode(document.getElementsByTagName("body").item(0));
documentFragment = range.cloneContents();
sasDom.insertBefore(documentFragment, credit);
document.body.appendChild(documentFragment);
我在另一篇文章中得到了很好的范围步行者建议,但意识到我问了错误的问题。我得到了关于范围的答案,但我想问的是文档片段(或者也许有一种方法可以设置片段的范围? hrmmm)。提供的步行器是:
function actOnElementsInRange(range, func) {
function isContainedInRange(el, range) {
var elRange = range.cloneRange();
elRange.selectNode(el);
return range.compareBoundaryPoints(Range.START_TO_START, elRange) <= 0
&& range.compareBoundaryPoints(Range.END_TO_END, elRange) >= 0;
}
var rangeStartElement = range.startContainer;
if (rangeStartElement.nodeType == 3) {
rangeStartElement = rangeStartElement.parentNode;
}
var rangeEndElement = range.endContainer;
if (rangeEndElement.nodeType == 3) {
rangeEndElement = rangeEndElement.parentNode;
}
var isInRange = function(el) {
return (el === rangeStartElement || el === rangeEndElement ||
isContainedInRange(el, range))
? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;
};
var container = range.commonAncestorContainer;
if (container.nodeType != 1) {
container = container.parentNode;
}
var walker = document.createTreeWalker(document,
NodeFilter.SHOW_ELEMENT, isInRange, false);
while (walker.nextNode()) {
func(walker.currentNode);
}
}
actOnElementsInRange(range, function(el) {
el.removeAttribute("id");
});
该步行器代码取自: 从片段范围内的节点中删除所有 id 属性
请 没有库(即 jQuery)。我想以原始方式做到这一点。预先感谢您的帮助
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
收集所有
节点的最简单方法是使用
getElementsByTagName
,但不幸的是,这在DocumentFragment
上没有实现。但是,您可以创建一个临时容器并附加片段中的所有元素,然后遍历并删除所有
元素,如下所示:
The easiest way to gather all
<script>
nodes would be to usegetElementsByTagName
, but unfortunately that is not implemented onDocumentFragment
.However, you could create a temporary container and append all elements within the fragment, and then go through and remove all
<script>
elements, like so:如果我错了,请纠正我,但如果 documentFragment 是真正的 DOM 片段,您应该能够执行以下操作:
对吗?
更正:您不能将 getElementsByTagName 应用于 documentFragment,JP 是对的。但是,如果片段是支持 getElementsByTagName 的(克隆)节点,则您可以使用片段的子节点。这是几天前我在一个较大的脚本中使用的一些(工作)代码:
Correct me if I'm wrong, but if the documentFragment is a real DOM Fragment, you should be able to do something like:
right?
Correction: you can't apply getElementsByTagName to a documentFragment, J-P is right. You can however us a child of the fragment if it is a (cloned) node supporting getElementsByTagName. Here's some (working) code I use within a larger script a few days ago:
2022 年,Chrome,querySelector 系列适用于文档片段:
2022, Chrome, querySelector family works on document fragments: