Там нет простого способа сделать это с произвольной 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, который может принимать произвольную строку HTML и превращать ее в узлы DOM с такими вещами, как document.createElement('p')
и т. Д., Которые вы могли бы добавить к вашему текущему элементу с помощью appendChild
, Однако это было бы ужасным, переработанным решением.
Все это в стороне, вы не должны этого делать. Этот код разрушит чей-то день. Это нарушает несколько принципов, которые мы ценим в развитии переднего конца:
- Не изменяйте прототипы объектов по умолчанию. Любой, кто будет запускать этот код или даже запускает код на той же странице (например, сторонние библиотеки отслеживания), получит коврик из-под них. Отслеживание того, что происходит не так, было бы почти невозможно - никто не подумал бы искать захват
innerHTML
.
- Сеттеры обычно предназначены для вычисленных свойств или свойств с побочными эффектами. Вы увлекаете ценность и меняете ее. Вы сталкиваетесь с проблемой санитарии - что произойдет, если кто-то установит значение во второй раз, который уже был захвачен?
- Не записывайте хитрый код. Этот код, безусловно, является «сложным» решение.
Чистое решение, вероятно, просто использует my_function
везде, где вам нужно. Это читается, короткое, простое, ваниль программирование:
someElement.innerHTML = my_function(value);
в качестве альтернативы Вы можете определить метод (я бы метод над собственностью, поскольку она задавливает значение от пользователя), как:
Element.prototype.setUpdatedHTML = function(html) {
this.innerHTML = my_function(html);
}
Этом когда разработчик столкнется с setUpdatedHTML
, он будет явно нестандартным, и они смогут искать кого-то, угоняющего прототип элемента легче.
Нет необходимости определять новый геттер, вы можете просто позволить ему использовать старый. – Oriol
@Oriol True, отредактировал ответ. Спасибо за совет. – noppa
Отличный ответ! Но эта стратегия не будет работать на Safari, поскольку реализует 'innerHTML' как неконфигурируемую. –