PIEの子孫で要素を複製するときに発生する問題は2つあります。
- PIEが挿入したVML要素も複製されたコンテンツに含まれますが、何らかの理由で名前空間プレフィックスなしで誤って複製され、
- PIEが各ターゲット要素に設定する一意の_pieId属性もクローンにコピーされるため、一意ではなくなったID間の衝突が発生します。
したがって、適切なクローンを作成するには、両方を削除する必要があります。最初の方法は、PIEの各要素の動作スタイルプロパティを一時的に「none」に設定し、後でクローンを作成して復元することで実行できます。'none'に設定すると、すべてのVML要素を削除するPIEのクリーンアップメソッドがトリガーされます。PIEは_pieId属性を自動的に削除しないため、2番目の項目は手動で実行する必要があります。これらは両方とも、スクリプトを作成するのに十分簡単です。
これが私の限られたテストでこれを処理するカスタム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;
}
次に、通常のcloneメソッドを呼び出すのと同じように、cloneWithPIEメソッドを呼び出します。
$('.someEl').cloneWithPIE().appendTo(newParent)
それがあなたのために働くことを願っています。