我有一个网页(php),它处理一系列ajax表单和简单的js隐藏/显示基于来自外部上传的内容的div,供组织的注册成员使用。为了构建一个更易维护和可扩展的站点,我一直在研究使用架构模式来防止无休止的jQuery链接;即,介体模式。
有没有人使用过Jack Lawson的Mediator.js?基本上,您可以使用Mediator进行订阅以监听“通道”(名称空间),并在某个通道上发布某个功能时运行该功能(如果需要,甚至可以在响应之前检查谓词的真/假功能)。
目标: 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'
中的等号作为问题,但我读到的每个文档都将此视为正确的语法。
问题:
<? header('Content-Type:
application/xhtml+xml'); ?>
时,是否会收到解析错误
提到?感谢您的帮助。
答案 0 :(得分:2)
为什么在实现上面显示的命名空间后我的CSS被破坏了?
只有在添加与XML命名空间对应的@namespace
声明时,才能在CSS中解析命名空间。这在spec。
确保您的样式表具有以下声明,放置在适当的位置(直接在所有@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将无法解析The Way It Be Be™,因此您的CSS命名空间也无法正常工作。