Самым простым решением этого является проверка метода .cloneNode
и использование его, если он существует.
Это означает, что ваш метод клонирования будет проверять наличие любых узлов DOM и использовать предопределенный метод DOM для него.Это должно полностью избежать вашей проблемы.
Что касается вашей реальной проблемы.Похоже, что Chrome и Firefox не согласны с тем, что принадлежит прототипу и что относится к объекту для HTMLTableRowElement (и любого другого элемента, а также).
Сравните console.dir(HTMLTableRowElement)
как в Firefox, так и в Chrome.В Firefox все эти свойства живут по прототипу HTMLTableRowElement
.Где в качестве прототипа Chrome есть только несколько методов.(delecteCell
и insertCell
).
Нет, где в спецификации DOM сказано, должны ли свойства HTMLElements определяться в прототипе или конкретно на объекте, так что на это просто не стоит полагаться.
В любом случае используйте .cloneNode
, потому что это собственный метод и, следовательно, лучше / быстрее, чем все, что вы можете написать в JavaScript.
Реализация Chrome psuedo:
function HTMLTableRowElement() {
...
this.nextSibling = ...;
this.nodeName = ...;
this.nodeType = ...;
...
}
HTMLTableRowElement.prototype.deleteCell = function() { ... };
HTMLTableRowElement.prototype.insertCell = function() { ... };
Псевдо-реализация Firefox
function HTMLTableRowElement() {
...
}
HTMLTableRowElement.prototype.nextSibling = ...;
HTMLTableRowElement.prototype.nodeName = ...;
HTMLTableRowElement.prototype.nodeType = ...;
...
HTMLTableRowElement.prototype.deleteCell = function() { ... };
HTMLTableRowElement.prototype.insertCell = function() { ... };