[javascript] Javascript를 사용하여 DOM 요소를 대체하는 방법은 무엇입니까?

DOM의 요소를 바꾸려고합니다.
예를 들어 대신 대신 <a>바꾸려 는 요소가 <span>있습니다.

내가 어떻게합니까?



답변

replaceChild () 사용하여 :

<html>
<head>
</head>
<body>
  <div>
    <a id="myAnchor" href="http://www.stackoverflow.com">StackOverflow</a>
  </div>
<script type="text/JavaScript">
  var myAnchor = document.getElementById("myAnchor");
  var mySpan = document.createElement("span");
  mySpan.innerHTML = "replaced anchor!";
  myAnchor.parentNode.replaceChild(mySpan, myAnchor);
</script>
</body>
</html>


답변

var a = A.parentNode.replaceChild(document.createElement("span"), A);

a는 대체 된 A 요소입니다.


답변

A.replaceWith(span) -부모가 필요하지 않습니다

일반적인 형태 :

target.replaceWith(element);

이전 방법보다 더 나은 / 깨끗한 방법.

사용 사례 :

A.replaceWith(span);

모질라 문서

지원되는 브라우저 -2020 년 4 월 94 %


답변

이 질문은 매우 오래되었지만 Microsoft 인증을 위해 공부하고 있다는 것을 알았으며 연구 서적에서 다음을 사용하는 것이 좋습니다.

oldElement.replaceNode(newElement)

나는 그것을 찾았고 IE에서만 지원되는 것 같습니다. 도 ..

나는 여기에 재미있는 사이드 노트로 추가 할 것이라고 생각했다.)


답변

비슷한 문제가 있었고이 스레드를 발견했습니다. 대체는 저에게 효과가 없었으며 부모님이가는 것은 상황에 어려웠습니다. Int Html은 아이들을 대신했습니다. outerHTML을 사용하여 작업을 완료했습니다. 이것이 다른 누군가를 돕기를 바랍니다!

currEl = <div>hello</div>
newElem = <span>Goodbye</span>
currEl.outerHTML = newElem
# currEl = <span>Goodbye</span>


답변

를 사용하여 노드를 교체 할 수 있습니다 Node.replaceWith(newNode).

이 예제는 모든 속성과 자식을 오리진 노드에서 유지해야합니다.

const links = document.querySelectorAll('a')

links.forEach(link => {
  const replacement = document.createElement('span')

  // copy attributes
  for (let i = 0; i < link.attributes.length; i++) {
     const attr = link.attributes[i]
     replacement.setAttribute(attr.name, attr.value)
  }

  // copy content
  replacement.innerHTML = link.innerHTML

  // or you can use appendChild instead
  // link.childNodes.forEach(node => replacement.appendChild(node))

  link.replaceWith(replacement)
})


답변

LI 요소 교체의 예

function (element) {
    let li = element.parentElement;
    let ul = li.parentNode;
    if (li.nextSibling.nodeName === 'LI') {
        let li_replaced = ul.replaceChild(li, li.nextSibling);
        ul.insertBefore(li_replaced, li);
    }
}