我会先说我已经通过从根本上改变我的方法解决了这个问题。但在解决它的过程中,我整理了一个让我着迷和烦恼的测试用例。
我有一个从 AJAX 调用返回的字符串。该字符串包含 HTML,其中大部分是无用的。我希望将字符串中的一个元素(及其所有子元素)插入 DOM。对此的模拟是:
<!DOCTYPE html>
<html>
<head>
<title>wtf?</title>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script>
$(document).ready(function() {
var markup = '<div class="junk"><div class="good"><time datetime="2013-03-29">March 29, 2013</time></div></div>',
output = $(markup).find('.good').clone().wrap('<div />').parent().html();
$('body').append(output);
});
</script>
</head>
<body></body>
</html>
我在这里有这个文件的托管副本:http: //alala.smitelli.com/temp/wtf_ie.html(不会永远存在)。
这应该做的是提取.good
div 和子<time>
元素,然后将它们插入到正文中。.wrap().parent()
除了子元素之外,我还提取了我选择的元素(请参阅此问题)。.clone()
和.html()
是证明问题的设计。
对用户来说,它应该显示今天的日期。它适用于 Chrome、Firefox、IE9 等:
March 29, 2013
但在 IE7 和 8 中,显示的文本是:
<:time datetime="2013-03-29">March 29, 2013
显示了开口<
,并且以某种方式插入了冒号。结束</time>
标签看起来不受影响,并且没有显示为转义。
这里发生了什么?这是某种错误,还是预期的行为?结肠从哪里来?
编辑:就添加document.createElement('time')
或 html5shiv 的建议而言,这些似乎都没有改变行为。