实现mediator.js时出现命名空间问题


Namespace issues when implementing mediator.js

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

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

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

挫折:我相信我理解mediator.js api实现的名称空间和中介模式。我已经能够通过特定"通道"(命名空间)上的中介成功发布DOM属性事件,并订阅这些通道并对其做出反应,甚至可以使用中介.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'); ?>时,我会得到解析错误提到了吗

谢谢你的帮助。

  1. 为什么在实现了上面显示的名称空间后,我的CSS就坏了?

    只有在添加与XML名称空间相对应的@namespace声明时,才能在CSS中解析名称空间。规范对此进行了说明

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

    @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就不会按照应有的方式进行解析™,因此您的CSS名称空间也无法工作。