Ok, mam następujący ciąg

Mam ciąg, który zawiera następujące elementy:

<span>A</span>BC<span id="blabla">D<span>EF</span></span>GH

Chcę być w stanie użyć czystego JavaScript, aby usunąć dowolny tag, który nie ma identyfikatora, aby wyjście wyglądało:

ABC<span id="blabla">DEF</span>GH

Mam następujący kod, który działa dobrze, ale nie obsługuje zagnieżdżonego span w środku (ten, który posiada EF). Wystarczy wiedzieć, jak mogę używać rekurencji, aby osiągnąć mój cel.

function removeSpans2(s) {
  var a = document.createElement('div');
  a.innerHTML = s;
  var node, next = a.firstChild;

  while (node = next) {
    next = next.nextSibling

    if (node.tagName && node.tagName.toLowerCase() == 'span' && !node.id) {
      a.replaceChild(document.createTextNode(node.textContent || node.innerText), node);
    }
  }
  return a.innerHTML;
}
0
Эџad Дьdulяңмaи 15 listopad 2011, 08:12

3 odpowiedzi

Najlepsza odpowiedź

Nie potrzeba rekurencji, wymyślił prostszy algorytm. Ten zajął wszystkie rodzaje zagnieżdżonych elementów, można mieć elementy wewnątrz rozpiętości lub rozpala się z boku, albo rozpina się w rozpiętościach w rozpiętościach ... cokolwiek.

function removeSpans3(s) {
  var a = document.createElement('div');
  a.innerHTML = s;
  var span, spans = a.getElementsByTagName('span');
  var frag, arr = [];

  // Stabilise spans collection in array
  for (var i=0, iLen=spans.length; i<iLen; i++) {
    arr[i] = spans[i];
  }

  // Process spans
  for (i=0; i<iLen; i++) {
    span = arr[i];

    // If no id, put content into a fragment
    if (!span.id) {

      // Some older IEs may not like createDocumentFragment
      frag = document.createDocumentFragment();

      while (span.firstChild) {
        frag.appendChild(span.firstChild);
      }

      // Replace span with its content in the fragment
      span.parentNode.replaceChild(frag, span);
    }
  }
  return a.innerHTML;
}
1
RobG 15 listopad 2011, 04:55

Myślę, że to będzie działać, po prostu dodaj rekurencję

function removeSpans2(s , el) {
    var a = el || document.createElement('div');
    a.innerHTML = s;

    var node, next = a.firstChild;

    while (node = next) {
        next = next.nextSibling;
        if( node.children && node.children.length ) {
            arguments.callee(node.innerHTML , node);
        }else if (node.tagName && node.tagName.toLowerCase() == 'span' && !node.id) {
            a.replaceChild(document.createTextNode(node.textContent || node.innerText), node);
        }
    }
    return a.innerHTML;
}
1
demix 15 listopad 2011, 04:37

Idealny czas, aby wyciągnąć trochę rekurencji:

function removeSpans2(s) {
  var a = document.createElement('div');
  a.innerHTML = s;
  var node, next = a.firstChild;

  while (node = next) {
    next = next.nextSibling

    if (node.tagName && node.tagName.toLowerCase() == 'span' && !node.id) {
      a.replaceChild(document.createTextNode(removeSpans2(node.textContent || node.innerText)), node);
    } else if (node.innerText != undefined){
        var node2 = node.cloneNode(true);
        node2.innerText = removeSpans2(node2.innerText);
        a.replaceChild(node2, node);
    }
  }
  return a.innerHTML;
}
1
Godwin 15 listopad 2011, 04:56