5

我正在开发一个使用 ubiquity-xforms 的应用程序。以前,我一直使用 XHTML 1.0 doctype 将页面作为 text/html 提供。

如果我将 mime 类型切换为 application/xhtml+xml,我会看到相当大的性能改进,因为 javascript 可以使用 get____NS() 函数,而不是现在正在做的事情(每次都缓慢地遍历整个 DOM 树它需要选择一个元素)。

但是当我尝试这个时,我的一堆 CSS 停止工作了。我注意到,当我在 Firebug 或 WebKit Nightly Web Inspector 中检查元素时,失败点是 XFORMS 命名空间中元素上的 '.classname' 和 '#id' css 选择器。我还注意到,在这些元素的列出的 DOM 属性中,它们缺少“id”和“className”属性。

我的问题是,有没有办法让 UA 将这些识别为类和 id?

我尝试过的事情无济于事:

  1. 将“id”属性指定为内联文档类型的 ATTLIST 中的 ID
  2. 尽我所能尝试每一个文档类型,或者根本没有文档类型
  3. 限定 xhtml 命名空间中的 id 和类名属性(即 xhtml:id)

这是一些示例 xhtml。不适用于 Firefox 3.5 或 Safari 4 / WebKit Nightly

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:xhtml="http://www.w3.org/1999/xhtml"
  xmlns:xf="http://www.w3.org/2002/xforms">
<head>
    <style type="text/css">
    /* <![CDATA[ */
    #test {
        background-color: red;
    }
    .testing {
        color: blue;
    }
    /* ]]> */
    </style>
</head>
<body>
    <xf:group id="test" class="testing">Test</xf:group>
</body>

4

3 回答 3

4

弗兰基,

porneL 的回答是正确的——在 XHTML 模式下你必须使用不同的 CSS 规则,@id因为@class.

即使掌握了这些知识,你的问题还没有结束。:)

诱惑可能是将 HTML 和 XHTML CSS 选择器放在一起,并将它们应用于相同的规则:

@namespace xf url(http://www.w3.org/2002/xforms);

xf\:input.surname, xf|input[class~="surname"] {
  color: green;
}

然而,另一个问题是 IE 将忽略整个规则,因为它不喜欢 XHTML 语法。通过 Ubiquity XForms,你会看到这样的事情:

@namespace xf url(http://www.w3.org/2002/xforms);

xforms\:hint.active, xf\:hint.active {
  display: inline;
}

xf|hint[class~="active"] {
  display: inline;
}

如您所见,我们不得不使用不同的选择器重复样式。(这是我们希望用一个抽象出样式设置任务的函数来解决的问题。然后你只需要编写一个规则。)

注意一些额外的事情:

  • HTML 规则使用 ':' 作为文字字符(因此使用 '\' 转义),并且对命名空间一无所知;
  • the XHTML CSS rules use the '~=' operator, which means that the attribute must contain the value specified, rather than be exactly equal to it.
于 2010-02-12T00:01:37.017 回答
1

您不必使用#id/.class选择器。相反,您可以使用:

[id=test] {}
[class|=testing] {}

这是等价的。

AFAIK 类是特定于 HTML 的东西,并且因为 XML 命名空间是完全疯狂的,所以 XHTML 属性不在 XHTML 命名空间中!你可能对这个不走运。

对于 ID,您可以尝试xml:id,但我还没有检查是否有任何东西真正支持它。

如果您想匹配命名空间元素,可以使用CSS Namespaces

@namespace xf "http://www.w3.org/2002/xforms";
xf|group {}
于 2010-02-08T22:38:56.950 回答
0

你没有文档类型、字符编码等。你去:

改成这样:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <!--Always include character encoding and content-type-->
    <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
</head>
于 2010-01-28T18:33:04.740 回答