Rimuovere tutti i nodi con (nodeName = “script”) da un documento Frammento * prima di inserirlo nella dom *

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

  •  01-10-2019
  •  | 
  •  

Domanda

Il mio obiettivo è quello di rimuovere tutti i <[Script]> nodi da un frammento di documento (lasciando il resto del frammento intatto) prima di inserire il frammento nel DOM.

Il mio frammento è stato creato da e simile a questa:

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

ho ottenuto buoni gamma Walker suggerimenti in un post a parte, ma sono reso conto ho chiesto la domanda sbagliata. Ho ricevuto una risposta su gamme, ma quello che intendevo chiedere ero un frammento di documento (o forse c'è un modo per impostare un intervallo del frammento? Hrmmm). Il camminatore fornita era:

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

Che il codice Walker viene sollevato da: rimuovere tutti gli attributi ID di nodi in una gamma di Frammento

SI PREGA DI Non ci sono librerie (per esempio jQuery). Voglio fare questo il modo grezzo. Grazie in anticipo per il vostro aiuto

È stato utile?

Soluzione

Il modo più semplice per raccogliere tutti i nodi <script> sarebbe quella di utilizzare getElementsByTagName, ma purtroppo questo non è implementata su DocumentFragment.

Tuttavia, si potrebbe creare un contenitore provvisorio e aggiungere tutti gli elementi all'interno del frammento, e poi passare attraverso e rimuovere tutti gli elementi <script>, in questo modo:

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

Altri suggerimenti

mi corregga se sbaglio, ma se il frammento di documento è un vero e proprio frammento DOM, si dovrebbe essere in grado di fare qualcosa di simile:

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

giusto?

Correzione: non è possibile applicare getElementsByTagName ad un frammento di documento, J-P è giusto. È possibile tuttavia un bambino ci del frammento, se si tratta di un (clonato) nodo di supporto getElementsByTagName. Ecco alcuni (di lavoro) utilizzare il codice che all'interno di uno script più grande di qualche giorno fa:

var fragment = d.createDocumentFragment(), f;
fragment.appendChild(document.createElement('div'));
fragment.firstChild.appendChild(zoeklijst.cloneNode(true));
f = fragment.firstChild;
return f.getElementsByTagName(getList); //<==
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top