XHTML呈现时间线与WebKit中的HTML不同?

XHTML呈现时间线与WebKit中的HTML不同?,html,xhtml,webkit,mobile-safari,Html,Xhtml,Webkit,Mobile Safari,我正在做一个项目,从XHTML到HTML再到XHTML,在加载CSS之前的页面呈现和读取样式的脚本在加载CSS之前读取样式方面有一些明确的行为变化。有谁能解释一下为什么会发生下面的事情,以及对此可以做些什么 基本上,我有一个具有以下结构的页面: <body> <!-- Content from Source A --> <link href="http://a.example.com/style.css" /> <header&g

我正在做一个项目,从XHTML到HTML再到XHTML,在加载CSS之前的页面呈现和读取样式的脚本在加载CSS之前读取样式方面有一些明确的行为变化。有谁能解释一下为什么会发生下面的事情,以及对此可以做些什么

基本上,我有一个具有以下结构的页面:

<body>
    <!-- Content from Source A -->
    <link href="http://a.example.com/style.css" />
    <header>...</header>

    <!-- Content from Source B -->
    <link href="http://b.example.com/style.css" />
    <div>...</div>

    <!-- Content from Source A -->
    <footer>...</footer>
    <script src="http://a.example.com/script.js">
        /* e.g. */
        alert($('header').offset().height);
    </script>
</body>

...
...
...
/*例如*/
警报($('header').offset().height);
当我们处于HTML呈现模式时,页面会在预期点阻止呈现。当我们点击源CSS时,渲染暂停(空白屏幕);当我们点击源CSS时,渲染暂停(标题可见)。当我们点击源JavaScript时,呈现暂停(显示整个页面),脚本从呈现状态读取元素样式。(当然,在现实中,WebKit不会在CSS加载时停止解析DOM或执行JavaScript,但它会在脚本需要读取样式的第一个点停止执行。)

当我们处于XHTML模式时,页面根本不会停止呈现,而是会呈现完全未设置样式的整个页面。之后,它似乎会按照加载的顺序处理脚本和样式表,或者更确切地说,它会按顺序执行脚本,但不会在执行加载的脚本之前等待样式表加载。这意味着页面将呈现三次(未格式化、一个样式表和两个样式表),脚本可能会推断出完全不准确的元素大小值

有人能解释一下吗?我测试过的所有WebKit浏览器都会出现这种情况,包括Chrome17、Mobile Safari5和Android浏览器2.1。是否有任何方法可以确保HTML呈现顺序而不诉诸于
text/HTML
mime类型?

WebKit用于处理XML,它将解析后的XHTML发送回执行CSS呈现和JavaScript执行

样式表和脚本标记链接到XML术语中所谓的外部实体。这意味着它们是最后处理的。报告说:

除非standalone=“yes”,否则它们不得处理引用未读取的参数实体后遇到的实体声明或属性列表声明,因为该实体可能包含覆盖声明;当standalone=“yes”时,处理器必须处理这些声明

由于
standalone=“yes”
指定XML文档应通过DTD进行验证,因此会触发不同的处理模型

链接标记的处理方式不同于xml样式表处理指令。报告说:

任何指向文档外部指定的样式表的链接(例如,某些版本的HTTP[RFC2068]中的链接头)都会被视为在xml样式表处理指令指定的关联之前创建关联。应用程序负责获取所有关联,并确定它们的顺序如何影响其处理

尝试注释脚本标记并转换链接标记xml样式表说明。另外,尝试向XML声明中添加standalone=“yes”:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="foo.css"?>

此外,特殊字符、实体和XSLT的使用会使情况进一步复杂化,因为HTML和XML方言(如XHTML)之间的处理模型不同:

XML中允许的字符范围由XML规范定义,并且 该范围由libxml2完全检查。不必担心,除非你 这是一个HTML解析器的示例,并将准备好的树提供给 将libxml2序列化回。我希望您没有像XSLT那样做 XML语言,必须由XML解析器解析

参考资料

WebKit用于处理XML,XML将解析后的XHTML发送回执行CSS呈现和JavaScript执行

样式表和脚本标记链接到XML术语中所谓的外部实体。这意味着它们是最后处理的。报告说:

除非standalone=“yes”,否则它们不得处理引用未读取的参数实体后遇到的实体声明或属性列表声明,因为该实体可能包含覆盖声明;当standalone=“yes”时,处理器必须处理这些声明

由于
standalone=“yes”
指定XML文档应通过DTD进行验证,因此会触发不同的处理模型

链接标记的处理方式不同于xml样式表处理指令。报告说:

任何指向文档外部指定的样式表的链接(例如,某些版本的HTTP[RFC2068]中的链接头)都会被视为在xml样式表处理指令指定的关联之前创建关联。应用程序负责获取所有关联,并确定它们的顺序如何影响其处理

尝试注释脚本标记并转换链接标记xml样式表说明。另外,尝试向XML声明中添加standalone=“yes”:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?xml-stylesheet href="foo.css"?>

此外,特殊字符、实体和XSLT的使用会使情况进一步复杂化,因为HTML和XML方言(如XHTML)之间的处理模型不同:

XML中允许的字符范围由XML规范定义,并且 该范围由libxml2完全检查。不必担心,除非你 这是一个HTML解析器的示例,并将准备好的树提供给 将libxml2序列化回。我希望您没有像XSLT那样做 XML语言,必须由XML解析器解析

参考资料