2010-04-22 44 views
0

有没有办法删除范围或片段中每个节点的ID属性?从片段范围内的节点中删除所有ID属性

更新:我终于发现,我正在努力的错误是基于一个< [脚本]>被包含在一个范围内,因此意外克隆,当一个铬用户做一个ctrl + a。我的目标是从范围(或doc片段)中删除< [script]>的任何实例,以便在克隆时不复制。

+0

为“”有什么资格? – 2010-04-22 11:29:48

回答

1

您可以使用TreeWalker,这在几乎所有的工作范围中的browers工作

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"); 
}); 
+0

谢谢蒂姆 - 你非常有帮助。但我不确定它的工作。我在这里设置了一个测试页面:http://latentmotion.com/link-building/test-clone.html – Matrym 2010-04-22 12:20:57

+0

似乎正在为我工​​作。你看到什么是错的?顺便说一下,我刚刚更新了我的答案,以删除我不小心遗留的日志记录。 – 2010-04-22 13:25:13

-1
+1

OP询问DOM范围,而不是元素。 – 2010-04-22 11:01:53

+0

在这种情况下,没有库的解决方案将更可取 - 尽管我喜欢jQuery。 – Matrym 2010-04-22 11:06:21

+0

Tim说什么,我在标签或问题中看不到jQuery。有些人仍然喜欢用'Plain ol'JavaScript&DOM™'编码,你知道! – 2010-04-22 11:06:48