При клонировании элементов с потомками PIE встречаются две проблемы:
- Элементы VML, вставленные PIE, также будут включены в клонированный контент, но по какой-то причине они клонированы неправильно, без префикса пространства имен, и
- Уникальный атрибут _pieId, который PIE помещает в каждый из своих целевых элементов, также копируется в клон, что приводит к конфликтам между идентификаторами, которые больше не являются уникальными.
Итак, чтобы сделать правильный клон, нам нужно избавиться от обоих. Первое можно сделать, временно установив для свойства стиля поведения каждого элемента PIE значение 'none', одновременно клонируя и восстанавливая его. Установка его в «none» запускает методы очистки PIE, которые удаляют все элементы VML. Второй элемент должен быть выполнен вручную, поскольку PIE не удаляет атрибуты _pieId автоматически. Оба эти сценария достаточно просты для написания сценариев.
Вот собственное расширение jQuery, которое обрабатывает это в моем ограниченном тестировании:
jQuery.fn.cloneWithPIE = function(dataAndEvents, deepDataAndEvents) {
// Find elements with PIE attached and remove their behaviors:
var pied = this.find('[_pieId]').css('behavior', 'none');
// Perform the clone:
var clone = this.clone(dataAndEvents, deepDataAndEvents);
// Remove the _pieId from each of the original and cloned
// elements, and restore the behavior:
pied.add(clone.find('[_pieId]')).removeAttr('_pieId').css('behavior', '');
return clone;
}
Затем вы вызываете метод cloneWithPIE, как если бы вы вызывали обычный метод клона:
$('.someEl').cloneWithPIE().appendTo(newParent)
Надеюсь, что это работает для вас.