아니, 임의의 HTML 문자열이 작업을 수행 할 간단한 방법이 없습니다 (이이 "비를 너무 좋아"솔루션을 필요로하는 주요 문제이다).
문제는 임의의 HTML 문자열을 사용하고 있다는 것입니다. 현재 임의의 HTML을 요소에 설정하는 유일한 방법은 innerHTML
입니다. 당신은 임시 노드에 HTML을 추가하고 그 내용을 잡아 예를 들어, 요소에 임의의 HTML을 설정하는 다른 방법을 찾아야 할 것 :
// Attempt: build a temporary element, append the HTML to it,
// then grab the contents
var div = document.createElement('div');
div.innerHTML = new_value;
var elements = div.childNodes;
for(var i = 0; i < elements.length; i++) {
this.appendChild(elements[ i ]);
}
그러나이 같은 문제를 겪고을 div.innerHTML = new_value;
영원히 때문에 재귀 적 당신은 임의의 HTML 설정에 대한 유일한 진입 점을 수정하고 있습니다.
내가 생각할 수있는 유일한 해결책은 임의의 HTML 문자열을 받아 document.createElement('p')
등의 DOM 노드로 바꿀 수있는 사실적이고 완벽한 HTML 파서를 구현하는 것입니다. 그러면 appendChild
으로 현재 요소에 추가 할 수 있습니다. . 그러나 그것은 끔찍하고 과장된 해결책 일 것입니다.
제쳐두고이 작업을해서는 안됩니다.이 코드는 누군가의 일을 망칠 것입니다. 프런트 엔드 개발에서 알게 된 몇 가지 원칙을 위반합니다.
- 기본 객체 프로토 타입을 수정하지 마십시오.이 코드를 실행하거나 동일한 페이지 (예 : 타사 추적 라이브러리)에서 코드를 실행하는 사용자는 그 아래에서 깔개를 꺼냅니다. 무슨 일이 일어나고 있는지 추적하는 것은 거의 불가능할 것입니다. 아무도 도둑 맞으려고
innerHTML
을 찾지 않을 것입니다.
- 일반적으로 세터는 계산 된 속성 또는 부작용이있는 속성 용입니다. 당신은 값을 공중 납치하고 그것을 바꾸고 있습니다. 당신은 위생 문제에 직면 해 있습니다. 누군가가 이미 도용당한 값을 다시 설정하면 어떻게 될까요?
- 까다로운 코드를 작성하지 마십시오.이 코드는 분명히 "까다로운"해결책입니다.
어디서나 가장 깨끗한 해결책은 단지 my_function
일 것입니다. 그것은 짧은 읽을 수있어, 간단한, 바닐라 프로그래밍 :
someElement.innerHTML = my_function(value);
당신은 대안 방법을 정의 할 수처럼 (이 사용자로부터 값을 내리 쳤을 때부터 부동산을 통해 방법을 할 것) :
Element.prototype.setUpdatedHTML = function(html) {
this.innerHTML = my_function(html);
}
이 방법은 개발자가 setUpdatedHTML
을 통과 할 때 분명히 비표준 일 것이고 요소 프로토 타입을 더 쉽게 가로 채는 사람을 찾을 수 있습니다.
새 게터를 정의 할 필요가 없습니다. 이전 게터를 사용하도록 할 수 있습니다. – Oriol
@Oriol 사실, 대답을 편집했습니다. 팁 고마워. – noppa
좋은 답변입니다! 그러나이 전략은 Safari에서는 작동하지 않습니다. 왜냐하면'innerHTML'을 구성 할 수 없게 구현하기 때문입니다. –