Supprimer tous les noeuds avec (nodeName = « script ») à partir d'un fragment de document * avant de le placer dans dom *

StackOverflow https://stackoverflow.com/questions/2694279

  •  01-10-2019
  •  | 
  •  

Question

Mon but est de supprimer tous les <[scripts]> noeuds à partir d'un fragment de document (en laissant le reste du fragment intact) avant d'insérer le fragment dans le dom.

Mon fragment est créé et ressemble à quelque chose comme ceci:

    range = document.createRange();
    range.selectNode(document.getElementsByTagName("body").item(0));
    documentFragment = range.cloneContents();
    sasDom.insertBefore(documentFragment, credit);
    document.body.appendChild(documentFragment);

Je suis bonne gamme des suggestions Walker dans un poste distinct, mais réalisé que j'ai posé la mauvaise question. Je suis une réponse sur les plages, mais ce que je voulais poser au sujet était un fragment de document (ou peut-être il y a un moyen de définir une plage du fragment? Hrmmm). Le marcheur a été fourni:

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

Ce code de marcheur est soulevé: Supprimer tous les attributs id de noeuds dans une plage de Fragment

S'IL VOUS PLAÎT Pas de bibliothèques (c.-à-jQuery). Je veux ce faire la façon brute. Merci d'avance pour votre aide

Était-ce utile?

La solution

La meilleure façon de rassembler tous les nœuds <script> serait d'utiliser getElementsByTagName, mais malheureusement qui ne sont pas mis en œuvre sur DocumentFragment.

Cependant, vous pouvez créer un conteneur temporaire et ajouter tous les éléments dans le fragment, puis passez à travers et supprimer tous les éléments de <script>, comme ceci:

var temp = document.createElement('div');

while (documentFragment.firstChild)
    temp.appendChild(documentFragment.firstChild);

var scripts = temp.getElementsByTagName('script');
var length = scripts.length;

while (length--)
    scripts[length].parentNode.removeChild(scripts[length]);

// Add elements back to fragment:
while (temp.firstChild)
    documentFragment.appendChild(temp.firstChild);

Autres conseils

moi si je me trompe, mais si le DocumentFragment est un vrai Fragment DOM, vous devriez être capable de faire quelque chose comme:

var scripts = documentFragment.getElementsByTagName('script');
if (scripts.length){
  for (var i=0, l = scripts.length;i<l;i++){
    documentFragment.removeChild(scripts[i]);
  }
}

droite?

Correction: vous ne pouvez pas appliquer getElementsByTagName à un DocumentFragment, J-P est juste. Vous pouvez nous cependant un enfant du fragment si elle est un noeud (cloné) supportant getElementsByTagName. Voici quelques (travail) Code-je utiliser un script plus il y a quelques jours:

var fragment = d.createDocumentFragment(), f;
fragment.appendChild(document.createElement('div'));
fragment.firstChild.appendChild(zoeklijst.cloneNode(true));
f = fragment.firstChild;
return f.getElementsByTagName(getList); //<==
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top