好的,我有下面的字符串
我有一个包含以下内容的字符串:

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

我希望能够使用纯javascript去掉任何没有id的span标记,以便输出如下所示:
ABC<span id="blabla">DEF</span>GH

我有以下代码,工作正常,但不处理中间的嵌套跨度(保存EF的那个)我只需要知道如何使用递归来实现我的目标。
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;
}

最佳答案

不需要递归,找到一个更简单的算法。这一个处理所有类型的嵌套元素,您可以在跨距内有一个元素,或在边上有一个跨距,或在跨距内有一个跨距无论什么。

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

09-30 00:10