2010-04-22 9 views
0

Existe-t-il un moyen de supprimer l'attribut id de chaque nœud d'une plage ou d'un fragment? Mise à jour: J'ai finalement découvert que le bogue avec lequel je me bats est basé sur un < [script]> inclus dans une plage, et donc cloné de manière inattendue, quand un utilisateur chrome fait un ctrl + a. Mon objectif serait de supprimer toute instance de < [script]> de la plage (ou du fragment de document), de sorte qu'elle ne soit pas répliquée lors du clonage.Supprimer tous les attributs id des nœuds d'une plage de fragments

+0

Ce qui se qualifie comme « dans »? –

Répondre

1

Vous pourriez être en mesure d'utiliser un TreeWalker, qui travaille dans à peu près tous les navigateurs que Range travaille dans

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

Merci Tim - vous êtes très utile. Mais je ne suis pas sûr que ça a marché. J'ai mis en place une page de test ici: http://latentmotion.com/link-building/test-clone.html – Matrym

+0

Semble travailler pour moi. Que voyez-vous qui ne va pas? En passant, je viens de mettre à jour ma réponse pour supprimer une déclaration de journalisation que j'avais laissée accidentellement. –

-1
+1

Le PO pose des questions sur les gammes DOM, pas sur les éléments. –

+0

Une solution sans bibliothèque serait préférable dans ce cas - même autant que j'aime jquery. – Matrym

+0

Ce que Tim a dit, et je n'ai vu aucune mention de jQuery dans les tags ou la question. Certaines personnes aiment encore coder dans 'Plain ol' JavaScript & DOM ™ ', vous savez! –