Переопределение членов на встроенном объекте JavaScript - PullRequest
0 голосов
/ 16 декабря 2008

Я хотел бы переопределить поведение по умолчанию для элемента 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 Ответ

3 голосов
/ 16 декабря 2008

Насколько я знаю, это невозможно. В 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();

Обновление Читая ваше описание здесь вижу вашу ошибку:

  1. вы получаете ссылку на объект называется myInnerContent
  2. вы удаляете этот объект из DOM при замене содержимого внешнего тега.
  3. вы пытаетесь получить родителя от старого объекта, который является сиротой и которые больше не находятся в DOM. IE выдает ошибку, а Firefox - ноль.

У вас уже есть решение на вашей странице: сохраните название объекта. При желании вы можете выбрать обновление глобальной переменной при обновлении содержимого или только обновление innerHTML внутреннего элемента div.

...