我有一个网页(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'
中的等号是问题所在,但我读到的每一篇文档都表明这是正确的语法。
问题:
- 为什么我的CSS在实现了我展示的名称空间后被破坏了以上
- 为什么,当我在头中添加
<? header('Content-Type: application/xhtml+xml'); ?>
时,我会得到解析错误提到了吗
谢谢你的帮助。
-
为什么在实现了上面显示的名称空间后,我的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';
-
为什么,当我在头中添加
<? 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名称空间也无法工作。