从片段范围内的节点上删除所有id属性 [英] Remove All id Attributes from nodes in a Range of Fragment

查看:82
本文介绍了从片段范围内的节点上删除所有id属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以删除范围或片段中每个节点的id属性?

Is there a way to remove the id attribute of every node in a range or fragment?

更新:我终于发现,我正在努力解决的错误是基于chrome用户执行ctrl + a时将< [script]>包含在一个范围内,因此意外地将其克隆了.我的目标是从范围(或doc片段)中删除< [script]>的任何实例,以使其在克隆时不会被复制.

Update: I finally found out that the bug I'm struggling with is based on a <[script]> being included in a range, and therefore unexpectedly cloned, when a chrome user does a ctrl+a. My goal would be to remove any instance of <[script]> from the range (or doc fragment), such that it is not replicated when cloned.

推荐答案

您也许可以使用TreeWalker,它几乎可以在Range所使用的所有浏览器中使用.

You may be able to use a TreeWalker, which works in pretty much all the browers that Range works in.

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属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆