Подтвердить что ты не робот

Разделение содержимого node в JavaScript DOM

У меня есть сценарий, где мне нужно разделить node до определенного предка, например.

<strong>hi there, how <em>are <span>you</span> doing</em> today?</strong>

необходимо разбить на:

<strong>hi there, how <em>are <span>y</span></em></strong>

и

<strong><em><span>ou</span> doing</em> today?</strong>

Как мне это сделать?

4b9b3361

Ответ 1

Вот решение, которое будет работать для современных браузеров с помощью Range. Нечто подобное можно было бы сделать для IE < 9, используя TextRange, но я использую Linux, поэтому у меня нет простого доступа к этим браузерам. Я не был уверен, что вы хотите, чтобы функция выполняла, верните узлы или просто замените inline. Я просто сделал предположение и сделал замену inline.

function splitNode(node, offset, limit) {
  var parent = limit.parentNode;
  var parentOffset = getNodeIndex(parent, limit);

  var doc = node.ownerDocument;  
  var leftRange = doc.createRange();
  leftRange.setStart(parent, parentOffset);
  leftRange.setEnd(node, offset);
  var left = leftRange.extractContents();
  parent.insertBefore(left, limit);
}

function getNodeIndex(parent, node) {
  var index = parent.childNodes.length;
  while (index--) {
    if (node === parent.childNodes[index]) {
      break;
    }
  }
  return index;
}

Демо: jsbin

Он ожидает TextNode для node, хотя он будет работать с Element; смещение будет просто работать по-разному в зависимости от поведения Range.setStart

Ответ 3

Не уверен, что это поможет вам, но это то, что я придумал...

Передайте функции элемент и строку имени тега node, которую вы хотите переместить вверх.

<strong>hi there, how <em>are <span id="span">you</span> doing</em> today?</strong>

<script type="text/javascript">


  function findParentNode(element,tagName){
    tagName = tagName.toUpperCase();
    var parentNode = element.parentNode;
    if (parentNode.tagName == tagName){
    //Erase data up to and including the node name we passed
    console.log('Removing node: '+parentNode.tagName+'  DATA: '+parentNode.firstChild.data);
    parentNode.firstChild.data = '';
    return parentNode;
}
    else{
    console.log('Removing node: '+parentNode.tagName+'  DATA: '+parentNode.firstChild.data);
    //Erase the first child data (the first text node and leave the other nodes intact)
    parentNode.firstChild.data = '';
    //Move up chain of parents to find the tag we want. Return the results so we can do things with it after
    return findParentNode(parentNode, tagName)
}
  }
var ourNode = document.getElementById("span");

alert(findParentNode(ourNode,'strong').innerHTML);


</script>