jQuery,html5,append()/ appendTo()和IE
如何复制:
-
创建一个html5页面。
-
确保添加了remysharp.com/2009/01/07/html5-enabling-script/中的脚本,以便IE注意到这些标记。
-
创建一个硬编码的
标记。
-
使用jQuery 1.3.2,附加另一个section标签:
$('#anything').append('
'); 到目前为止,一切都适用于所有浏览器。
-
重复上一步。
$('#whatever').append('
'); 这是IE6 / 7失败的地方。 Firefox / Safari将继续工作。
错误
思考
-
可能是IE6 / 7无法处理HTML5部分标记。 我这样说是因为当我将步骤4从
更改为 ,IE6 / 7将开始工作。如果我使用
document.createElement()
并创建我的新元素,它可以工作,但似乎jQuery的append()
与html5元素有问题。这个bug出现在IE的innerHTML实现中 – 由于某种原因,它不喜欢通过innerHTML插入“未知”元素 – 而DOM脚本编写很好。
jQuery使用创建一个持有div,然后通过innerHTML删除你想要追加的标记。 IE现在将未知元素视为两个新的破坏元素,即
content 被视为
ARTICLE
,##text
,/ARTICLE
,由innerHTML borking引起。这是一个例子,在IE中查看它,你会看到innerHTML插入方法错误地报告插入div中的3个节点: http : //jsbin.com/olizu
没有IE的人的屏幕截图: http : //leftlogic.litmusapp.com/pub/2c3ea3e
我也遇到了这个问题。 解决方案似乎是在已经附加到文档的元素上使用innerHTML,然后提取创建的节点。 我创建了这个li’l函数来做到这一点:
每个人都把你的马放在那里的讽刺上。 窥视http://html5shiv.googlecode.com/svn/trunk/html5.js,html5 shiv成功地欺骗IE6 / 7进行createElement()。
在上面的karbassi案例中,人们希望IE6 / 7首先关注html5 shiv,然后在每次之后按预期执行jQuery append()。 当附加到追加时,它显然不会按顺序执行操作。 这很方便。
HTML5 shiv是否处理
innerHTML
? IE很可能不同于DOM方法(如createElement
)和读取jQuery源(我推荐)处理innerHTML
,似乎你的代码触发innerHTML
而不是DOM方法。 您可以尝试将重写为
(乍一看应该在清理过程中触发DOM方法)并查看它是否表现不同。 如果是这样,你已经发现了jQuery中的一个错误以及HTML5 shiv的限制。 如果没有,至少它是一种交叉的可能性。
当IE6和7开发时,HTML5不存在。