Стиль JavaScript и копирование

Я копирую ячейку таблицы с javascript.

Он отлично работает, просто не копирует стиль. Я хотел скопировать, как показано ниже, но это не сработало. newCell.style = oldCell.style;

Итак, я решил, что для моего выравнивания текста я должен скопировать его вот так: newCell.style.textAlign = oldCell.style.textAlign;

Это сработало, но всякий раз, когда я добавляю новый элемент стиля, я должен запомнить его здесь.

Итак, теперь моя проблема заключается в том, как я могу перебирать стиль и копировать каждый элемент там?

С хром мне удалось сделать это вот так:

 var strAttribute = GetDomNameFromAttributeName(oRow.cells[1].style[0]);
    var styletocopy = eval('oRow.cells[1].style.'+strAttribute);
    eval("newCell.style."+strAttribute+"='"+styletocopy+"'"); // //newCell.style.textAlign='center';

Но это не работает с IE. Не тестировали его с помощью FF, но предполагайте совместимость с хромом.

Есть ли способ перебрать элементы стиля в IE? Или есть лучший способ скопировать все элементы стиля?

Ответ 1

eval('oRow.cells[1].style.'+strAttribute)

Никогда не используйте eval как это (*). В JavaScript вы можете получить доступ к свойству, имя которого хранится в строке с использованием квадратных скобок. object.plop совпадает с object['plop']:

to.style[name]= from.style[name];

(*: никогда не используйте eval вообще, если вы можете помочь ему. Есть только несколько очень конкретных и редких случаев, в которых вы нуждаетесь.)

Есть ли способ перебрать элементы стиля

Предполагается, что объект style поддерживает интерфейс DOM уровня 2 CSS CSSStyleDeclaration. Вы можете перебрать правила и применить их к другому элементу, подобному этому:

for (var i= from.style.length; i-->0;) {
    var name= from.style[i];
    to.style.setProperty(name,
        from.style.getPropertyValue(name),
        priority= from.style.getPropertyPriority(name)
    );
}

в IE?

Нет, IE не поддерживает весь интерфейс CSSStyleDeclaration, и выше не будет работать. Однако есть более простой способ не включать цикл, который будет работать и с IE, и с другими браузерами:

to.style.cssText= from.style.cssText;

Просто так! IE не совсем сохраняет текст CSS так, как должен, но разница не имеет значения для простого встроенного копирования стиля.

Однако, как сказал Пикрасс (+1), если вы копируете целый элемент, а не только стили, cloneNode на сегодняшний день является самым элегантным способом сделать это.

Ответ 2

Вы можете скопировать элемент DOM со всем содержимым (включая атрибуты) с .cloneNode(true):

var clonedTr = document.getElementById('id').cloneNode(true);

Затем clonedTr является точной копией tr #id. "Истина" означает, что вы хотите скопировать содержимое элемента.