Entfernen All Knoten mit (nodeName = „script“) aus einem Dokument Fragmente *, bevor es in dom Platzierung *

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

  •  01-10-2019
  •  | 
  •  

Frage

Mein Ziel ist es, alle <[script]> zu entfernen Knoten aus einem Dokument-Fragmente (den Rest des Fragments intakt bleiben), bevor das Fragment in den dom eingefügt wird.

Mein Fragment wird erstellt durch und sieht etwa so aus:

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

Ich habe gute Auswahl walker Vorschläge in einem separaten Beitrag, aber erkannte ich die falsche Frage gestellt. Ich bekam eine Antwort über Bereiche, aber was ich meinte ein Dokumentfragment fragen wollte (oder vielleicht gibt es eine Möglichkeit, einen Bereich des Fragments? Hrmmm eingestellt). Der Wanderer vorgesehen war:

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

Die Walker-Code aus angehoben wird: entfernen Sie alle ID-Attribute von Knoten in einem Bereich von Fragmente

BITTE Keine Bibliotheken (zB jQuery). Ich möchte dies die rohe Art und Weise zu tun. Vielen Dank im Voraus für Ihre Hilfe

War es hilfreich?

Lösung

Der einfachste Weg, um alle <script> Knoten zu sammeln wäre getElementsByTagName zu verwenden, aber leider, die nicht auf DocumentFragment umgesetzt wird.

Allerdings könnten Sie einen temporären Container erstellen und alle Elemente innerhalb des Fragments anzuhängen, und dann gehen Sie durch und entfernen Sie alle <script> Elemente, etwa so:

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

Andere Tipps

Korrigieren Sie mich, wenn ich falsch liegt, aber wenn das Document ein echter DOM Fragment ist, sollten Sie in der Lage sein zu tun, so etwas wie:

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

oder?

Korrektur: Sie getElementsByTagName auf eine Document nicht anwenden können, J-P ist richtig. Sie können aber uns ist ein Kind des Fragments, wenn es sich um eine (geklont) Knoten ist getElementsByTagName unterstützen. Hier einige (in Betrieb) Code I Verwendung in einem größeren Skript vor ein paar Tagen:

var fragment = d.createDocumentFragment(), f;
fragment.appendChild(document.createElement('div'));
fragment.firstChild.appendChild(zoeklijst.cloneNode(true));
f = fragment.firstChild;
return f.getElementsByTagName(getList); //<==
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top