2011-03-28 46 views
3

我一直在成功使用.htc版本的PIE在一个新的项目(这将专门针对IE8 +),但是,我试图克隆应用PIE风格的元素时遇到问题。如何正确地克隆(jQuery)通过PIE应用了样式的元素?

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

任何帮助表示赞赏。有什么可能导致这种情况,是否有潜在的解决方法?

干杯, peol

+0

我有同样的问题,您是否设法找到解决方案?我已将PIE应用于未继承.htc修复的克隆元素的子元素 - 这可能是因为使用JavaScript版本的馅饼可能是答案。 – 2011-05-09 19:53:55

回答

6

但是也有一些与PIE'd后代克隆元素时遇到的两个问题:

  1. 馅饼已插入也将包含在克隆的内容的VML元素,但由于某种原因它们被错误地克隆,没有命名空间前缀,并且
  2. PIE放置在其每个目标元素上的独特_pieId属性也被复制到克隆中,这导致不再是唯一的ID之间的冲突。

所以为了做一个适当的克隆,我们需要摆脱两者。第一个可以通过暂时将每个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方法就像你会正常调用clone方法:

$('.someEl').cloneWithPIE().appendTo(newParent) 

希望这对你有用。

+0

对不起,缓慢的回应,我没有收到你的回复电子邮件,我在第二天冒险参加一个新项目。 :)谢谢你的回应,我什至不记得我是如何解决它的,但我认为这是一种类似的方法。干杯! – peol 2011-07-26 22:13:55

+0

这太神奇了!非常感谢! – triplethreat77 2013-03-05 20:54:57