1

我有一个网页(php),它根据外部上传的内容处理一系列ajax表单和简单的js隐藏/显示div,供组织的注册成员使用。为了构建一个更易于维护和扩展的站点,我一直在研究使用架构模式来防止无休止的 jQuery 链接;也就是中介模式。

有人用过 Jack Lawson 的Mediator.js吗?基本上,您可以使用 Mediator 订阅以侦听“通道”(命名空间),并在同一通道上发布某些内容时运行一个函数(如果需要,甚至在响应之前检查谓词 true/false 函数)。

目标: mediator.js api 似乎具有巨大的潜力,并迫使我实现有效的 xhtml 文档并正确使用命名空间。实现中介模式似乎是解耦 javascript 代码并使复杂的 web 应用程序在未来更易于维护和扩展的好方法。

挫折: 我相信我理解由 mediator.js api 实现的命名空间和中介模式。我已经能够通过特定“通道”(命名空间)上的中介成功发布 DOM 属性事件,并订阅这些通道并对它们做出反应——甚至使用 mediator.js 方法在该通道上测试“谓词”以确定是否需要回应。但是由于新的命名空间,我的 CSS 现在无法识别元素。

我创建了这样的命名空间:

<xmlns:active='http://www.xxx.com/tracks/active'  
xmlns:completed='http://www.xxx.com/tracks/completed'  
xmlns:inactive='http://www.xxx.com/tracks/inactive'>

然后将它们应用于 html 元素,例如:

<active:div ...>stuff</active:div>

我相应地更改了css文件:

active|div {   css formatting }

尽管如此,页面的css格式还是被破坏了。

呈现页面的 doctype 部分如下所示:

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

我不完全确定这不是必需的,但我尝试添加:

<? header('Content-Type: application/xhtml+xml'); ?>

这会产生以下 XML 解析错误:

XML 解析错误:格式不正确

它指向这个命名空间定义中的等号xmlns:active='http://www.xxx.com/tracks/active'作为问题,但我阅读的每个文档都显示这是正确的语法。

问题:

  1. 为什么在实现上面显示的命名空间后我的 CSS 会损坏?
  2. 为什么,当我<? header('Content-Type: application/xhtml+xml'); ?>在标题中添加时,我会收到提到的解析错误?

感谢您的任何帮助。

4

1 回答 1

2
  1. 为什么在实现上面显示的命名空间后我的 CSS 会损坏?

    @namespace只有在添加与 XML 命名空间相对应的声明时,才能在 CSS 中解析命名空间。这在规范中有所描述。

    确保您的样式表具有以下语句,放置在适当的位置(直接在所有@charsets 和@imports 之后):

    @namespace active 'http://www.xxx.com/tracks/active';
    

    如果您有其余命名空间的样式,则还需要包含这些样式:

    @namespace completed 'http://www.xxx.com/tracks/completed';
    @namespace inactive 'http://www.xxx.com/tracks/inactive';
    
  2. 为什么,当我<? header('Content-Type: application/xhtml+xml'); ?>在标题中添加时,我会收到提到的解析错误?

    这是因为当您添加页眉时,您的 XHTML 页面将作为 XML 序列化文档提供。顺便说一句,这就是 XHTML 页面应该提供的方式,因为 XHTML 是从 XML 派生的。如果您不包含标头,服务器通常会将它们作为text/html替代发送,这意味着您的 XHTML 通过 HTML 标记汤解析器而不是 XML 解析器运行。

    XML解析规则非常严格;单个语法错误将阻止您的整个文档呈现。由于您似乎有一个格式错误的xmlns声明,这会阻止您的 XHTML 页面正确呈现。另一方面,鉴于 HTML 语法规则的灵活性和宽松性,即使浏览器在您的标记中遇到严重的语法问题,它也不会吐出任何错误消息——它只会尝试跳华尔兹舞曲穿过错误并进行猜测在预期的 DOM 结构是什么。

    至于错误本身,您的xmlns属性看起来应该是开始html标记的一部分,而不是它们自己的元素,因为它们是属性:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:active="http://www.xxx.com/tracks/active"  
          xmlns:completed="http://www.xxx.com/tracks/completed"  
          xmlns:inactive="http://www.xxx.com/tracks/inactive">
    

    最后,你需要那个标题!没有它,您的 XHTML 将不会被解析为 The Way It Should Be™,因此您的 CSS 名称空间也将无法工作。

于 2012-07-18T17:45:58.677 回答