Удалите все узлы с (nodeName = "script") из фрагмента документа * перед размещением его в dom * - PullRequest
0 голосов
/ 23 апреля 2010

Моя цель - удалить все узлы <[script]> из фрагмента документа (оставив остальную часть фрагмента без изменений) перед вставкой фрагмента в dom.

Мой фрагмент создан и выглядит примерно так:

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

В отдельном посте я получил хорошие предложения по ходункам, но понял, что задал неправильный вопрос. Я получил ответ о диапазонах, но я хотел спросить о фрагменте документа (или, возможно, есть способ установить диапазон фрагмента? Хмммм). Уокер предоставил:

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

Этот код прохождения извлечен из: Удалить все атрибуты id из узлов в диапазоне фрагмента

ПОЖАЛУЙСТА Нет библиотек (например, jQuery). Я хочу сделать это грубым способом. Заранее спасибо за помощь

Ответы [ 2 ]

1 голос
/ 23 апреля 2010

Поправьте меня, если я ошибаюсь, но если documentFragment - это настоящий DOM-фрагмент, вы сможете сделать что-то вроде:

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

право

Исправление: вы не можете применить getElementsByTagName к фрагменту документа, J-P прав. Однако вы можете использовать дочерний фрагмент, если это (клонированный) узел, поддерживающий getElementsByTagName. Вот некоторый (рабочий) код, который я использую в большем сценарии несколько дней назад:

var fragment = d.createDocumentFragment(), f;
fragment.appendChild(document.createElement('div'));
fragment.firstChild.appendChild(zoeklijst.cloneNode(true));
f = fragment.firstChild;
return f.getElementsByTagName(getList); //<==
1 голос
/ 23 апреля 2010

Самый простой способ собрать все <script> узлы - это использовать getElementsByTagName, но, к сожалению, это не реализовано на DocumentFragment.

Однако вы можете создать временный контейнер и добавить все элементы внутри фрагмента, а затем пройти и удалить все элементы <script>, например:

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