قم بإزالة جميع العقد باستخدام (nodeName = "Script") من جزء مستند *قبل وضعه في DOM *

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

  •  01-10-2019
  •  | 
  •  

سؤال

هدفي هو إزالة جميع العقد <[script]> من جزء مستند (تاركًا بقية الشظية سليمة) قبل إدخال الجزء في DOM.

تم إنشاء شظري ويبدو مثل هذا:

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

حصلت على اقتراحات جيدة للنطاق في منشور منفصل ، لكنني أدركت أنني طرحت السؤال الخطأ. حصلت على إجابة حول النطاقات ، لكن ما قصدت أن أسأله هو جزء مستند (أو ربما هناك طريقة لتعيين مجموعة من الشظية؟ HRMMM). كان المشي الذي قدمه:

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

يتم رفع رمز ووكر من: قم بإزالة جميع سمات المعرف من العقد في مجموعة من الأجزاء

من فضلك لا توجد مكتبات (أي jQuery). أريد أن أفعل هذا بالطريقة الخام. شكرا مقدما لمساعدتكم

هل كانت مفيدة؟

المحلول

أسهل طريقة لجمع كل شيء <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);

نصائح أخرى

صححني إذا كنت مخطئًا ، ولكن إذا كان DocumentFragment جزءًا حقيقيًا دوم ، فيجب أن تكون قادرًا على القيام بشيء مثل:

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

الصحيح؟

تصحيح: لا يمكنك تطبيق getElementsByTagname على documentfragment ، JP على حق. ومع ذلك ، يمكنك مع ذلك طفلاً من الشظية إذا كانت عقدة (استنساخ) تدعم getElementsByTagname. إليك بعض التعليمات البرمجية (العمل) التي أستخدمها ضمن برنامج نصي أكبر قبل بضعة أيام:

var fragment = d.createDocumentFragment(), f;
fragment.appendChild(document.createElement('div'));
fragment.firstChild.appendChild(zoeklijst.cloneNode(true));
f = fragment.firstChild;
return f.getElementsByTagName(getList); //<==
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top