Переопределение членов на встроенном объекте JavaScript
Я хотел бы переопределить поведение по умолчанию для элемента offsetParent всех элементов HTML. Я хотел бы сделать что-то вроде этого, если это возможно:
// For <div id="foo"></div>
var oFooElem = document.getElementById("foo");
oFooElem._offsetParent = oFooElem.offsetParent;
oFooElem.prototype.offsetParent = function() {
window.status = 'offsetParent called.';
return this._offsetParent;
};
Это вообще возможно? Если это так, пожалуйста, опубликуйте исправленный пример кода. Спасибо!
Обновить:
@ Some Спасибо за вашу помощь. Похоже, это невозможно. Я расширил проблему, которая вызвала этот вопрос в новом вопросе, если вам интересно.
1 ответ
Насколько я знаю, это невозможно. В Firefox я получаю исключение "установка свойства, которое имеет только геттер", IE выдает ошибку, Chrome выдает ошибку, но в Opera это работает (если я назначаю его элементу, а не прототипу)!
Но у вас есть другая проблема. offsetParent не является функцией, поэтому она никогда не будет вызываться как функция, и ваше предупреждение никогда не произойдет. В опере (единственный браузер, который я нашел, где вы могли бы заменить его) вы получаете только функцию обратно.
Однако вы можете добавить новую функцию (будет работать в Firefox, Chrome и Opera, но не в IE, поскольку в IE нет свойства конструктора):
var e = document.getElementById("mydiv"); //Get a div element
//Adds a _offsetParent function to all DIV elements.
e.constructor.prototype._offsetParent=function(){
alert("offset parent called"); return this.offsetParent;
};
e._offsetParent();
Обновление Читая ваше описание здесь, я вижу вашу ошибку:
- вы получаете ссылку на объект myInnerContent
- Вы удаляете этот объект из DOM, когда заменяете содержимое внешнего тега.
- вы пытаетесь получить родительский объект от старого объекта, который является сиротой и которого больше нет в DOM. IE выдает ошибку, а Firefox - ноль.
У вас уже есть решение на вашей странице: сохраните название объекта. При желании вы можете обновить глобальную переменную при обновлении содержимого или только обновить innerHTML внутреннего элемента div.