Estoy tratando de definir un setter personalizado para la propiedad innerHTML
. Por desgracia, no estoy en condiciones de acceder a la propiedad subyacente después de que definir la función setter:Accediendo a propiedades ocultas por __defineGetter __/__ defineSetter__ en JavaScript
$('body')[0].__defineSetter__("innerHTML",
function (val) {
alert("Setting to: " + val);
this.innerHTML = val;
});
Este fragmento de código llena la pila de llamadas debido a que la asignación de llamadas de la incubadora de forma recursiva. Aparentemente innerHTML
ya es una propiedad sobrecargada en IE8 y puede simplemente guardar el par get/set anterior y usarlo dentro del nuevo descriptor de propiedad. Tomado de MSDN:
var innerHTMLdescriptor = Object.getOwnPropertyDescriptor(Element.prototype, 'innerHTML');
Object.defineProperty(Element.prototype, 'innerHTML',
{ set: function(htmlVal) {
var safeHTML = toStaticHTML(htmlVal);
innerHTMLdescriptor.set.call(this, safeHTML);
}
});
Sin embargo, esto no parece ser el caso para Chrome, donde getOwnPropertyDescriptor
devuelve undefined para innerHTML
. En este caso, ¿cómo accedo a la propiedad subyacente?
Pregunta extra: cómo me aseguro de que todos los objetos creados en el futuro tengan este comportamiento especial innerHTML
? ¿Es posible usar prototipos DOM para esto? Parece que sobrecargar una función no es lo que necesito aquí. Quizás es posible sobrecargar el constructor DOM y agregar una llamada al __defineGetter__/defineProperty
, pero parece que el soporte para constructores no es común, por lo que me gustaría saber si hay alguna alternativa.
No use \ _ \ _ defineSetter \ _ \ _ en el código de producción real: no es estándar y puede excluir a los usuarios de muchos navegadores. – Ryan
el equivalente estándar es 'defineProperty' ¿verdad? aún así, el problema de hacer referencia a lo oculto de la propiedad existe ... – BruceBerry
No, todavía no es realmente un estándar. No debe usarlo porque excluye navegadores antiguos. Por supuesto, si estás haciendo algo que no es crucial y se degrada graciosamente, está bien. Pero no luce como lo hará en tu caso. – Ryan