如何正确克隆(jQuery)通过PIE应用了样式的元素?

时间:2011-03-28 07:11:11

标签: jquery internet-explorer-8 css3pie

我一直在.htc版本的PIE成功使用一个新项目(专门针对IE8 +),但是,我在尝试克隆一个有PIE的元素时遇到了麻烦风格适用于它。

我有一个jsfiddle来说明问题here,并且欢迎输入(甚至其他类似的方法/替代PIE) - 但是,.htc文件不能跨域引用,所以这个小提琴只包含我使用的实际标记和CSS。

感谢任何帮助。可能导致这种情况的原因是,是否存在潜在的解决方法?

干杯, peol

1 个答案:

答案 0 :(得分:6)

使用PIE'd后代克隆元素时遇到两个问题:

  1. PIE插入的VML元素也将包含在克隆内容中,但由于某种原因,它们被错误地克隆而没有名称空间前缀,并且
  2. PIE在其每个目标元素上放置的唯一_pieId属性也会复制到克隆中,从而导致不再唯一的ID之间的冲突。
  3. 因此,为了进行适当的克隆,我们需要摆脱两者。第一个可以通过临时将每个PIE'd元素的行为样式属性设置为'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)
    

    希望对你有用。