DHTML技术各项功能的实现都依赖于使用客户端脚本与浏览器宿主及在宿主中输出的Web页面之间的交互,这种交互是通过对象这个技术手段实现的。
BOM与DOM的区别
# DHTML技术各项功能的实现都依赖于使用客户端脚本与浏览器宿主及在宿主中输出的Web页面之间的交互,这种交互是通过对象这个技术手段实现的。
# BOM即Browser Object Model浏览器对象模型,是在客户端脚本核心的基础上实现的扩展API,通过该API可以使用脚本访问浏览器窗口及其文档对象的各个方面。BOM从IE3.0/NS3.0开始引入。
# 在BOM API中,把Web浏览器的各个主要外显特性、Web页面及其标记、内容等都封装成一个个对象,通过这些对象提供的成员访问窗口、文档、元素对象等,并在此基础上实现了对象的事件支持机制。所有BOM对象之间存在一定的关联关系。
# 学习BOM技术主要就是学习如何利用客户端脚本使用BOM对象,通过这些封装的BOM对象可实现很多DHTML功效。
# BOM技术不是标准化的Web技术,因浏览器而异。正因为如此大大限制了DHTML技术的应用领域和发展前景。
# 不同浏览器实现的BOM技术并不统一,这是造成DHTML技术实现差异的主要原因,由此W3C在BOM技术的基础上进行扩充与改善、优化,制定了新的统一技术规范标准,即DOM(Document Object Model)文档对象模型技术。
# DOM技术最初是针对XML文档的解析与控制而制定的技术规范,但可把HTML文档XML化成XHTML文档,使用DOM技术来访问Web页面文档中的各类对象。
# 目前W3C为DOM技术规范制定了三个不同的级别,即DOM Level 1/2/3。IE5/NS6开始全面支持DOM Level 1。有时有人也把BOM技术称为DOM Level 0[W3C官方没有此说法!]。
# DOM技术的核心是把XML(包括XHTML)文档结构解析为树状结构,每个标记看作是一个节点Node,各节点之间存在某种关系,并通过这些关系来相互访问。
# DOM技术与XML技术密切相关,涉及的技术内容庞杂,学习难度较高,但掌握了BOM技术后再学习DOM技术就有一定的帮助。
# 不仅可以在JavaScript之类的脚本语言中使用DOM技术,在Java之类的重量级程序设计语言中也广泛使用DOM技术。
您可能感兴趣的文章:
PHP实例:检测并清除文件开头的BOM信息
Php批量去除bom头信息的实现代码
php去掉bom头的代码分享
PHP 过滤页面中的BOM数据的简单实例
检测php文件是否有bom头的代码
批量清除php文件中bom的方法
检查并清除php文件中bom的函数
有关 UTF-8 BOM 导致样式错乱的解决方法
有关UTF-8 编码中BOM的检测与删除
所谓BOM,全称是Byte Order Mark,它是一个Unicode字符,通常出现在文本的开头,用来标识字节序(Big/Little Endian),除此以外还可以标识编码(UTF-8/16/32),如果出现在文本中间,则解释为zero width no-break space。
注:Unicode相关知识的详细介绍请参考UTF-8, utf-8, UTF-32 & BOM。
对于UTF-8/16/32而言,它们名字中的8/16/32指的是编码单位是多少位的,也就是说,它们的编码单位分别是8/16/32位,换算成字节就是1/2/4字节,如果是多字节,就要牵扯到字节序,UTF-8以单字节为编码单位,所以不存在字节序。
UTF-8主要的优点是可以兼容ASCII,但如果使用BOM的话,这个好处就荡然无存了,除此以外,BOM的存在还可能引发一些问题,比如下面错误便都有可能是BOM导致的:
PHP: Warning: Cannot modify header information – headers already sent
在详细讨论UTF-8编码中BOM的检测与删除问题前,不妨先通过一个例子热热身:
\357\273\277<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional\
//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\r$
如上所示,前三个字节分别是357、273、277,这就是八进制的BOM。
00000000 ef bb bf 3c 21 44 4f 43 54 59 50 45 20 68 74 6d |...<!DOCTYPE htm|
00000010 6c 20 50 55 42 4c 49 43 20 22 2d 2f 2f 57 33 43 |l PUBLIC "-//W3C|
00000020 2f 2f 44 54 44 20 58 48 54 4d 4c 20 31 2e 30 20 |//DTD XHTML 1.0 |
00000030 54 72 61 6e 73 69 74 69 6f 6e 61 6c 2f 2f 45 4e |Transitional//EN|
00000040 22 20 22 68 74 74 70 3a 2f 2f 77 77 77 2e 77 33 |" "http://www.w3|
00000050 2e 6f 72 67 2f 54 52 2f 78 68 74 6d 6c 31 2f 44 |.org/TR/xhtml1/D|
00000060 54 44 2f 78 68 74 6d 6c 31 2d 74 72 61 6e 73 69 |TD/xhtml1-transi|
00000070 74 69 6f 6e 61 6c 2e 64 74 64 22 3e 0d 0a |tional.dtd">..|
如上所示,前三个字节分别是EF、BB、BF,这就是十六进制的BOM。
注:用到了第三方网站的页面,不能保证例子始终可用。
实际做项目开发时,可能会面对成百上千个文本文件,如果有几个文件混入了BOM,那么很难察觉,如果没有带BOM的UTF-8文本文件例子,可以用vi杜撰几个,相关命令如下:
#设置UTF-8编码
:set fileencoding=utf-8
#添加BOM
:set bomb
#删除BOM
:set nobomb
#查询BOM
:set bomb?
检测UTF-8编码中的BOM
删除UTF-8编码中的BOM
推荐:如果使用SVN,可以在pre-commit钩子里加上相关代码用以杜绝BOM。
#!/bin/sh
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
FILES=`$SVNLOOK changed -t "$TXN" "$REPOS" | awk '/^[UA]/ {print $2}'`
for FILE in $FILES; do
if $SVNLOOK cat -t "$TXN" "$REPOS" "$FILE" | grep -q $'^\xEF\xBB\xBF'; then
echo "Byte Order Mark be found in $FILE" 1>&2
exit 1
fi
done
PHP实例:检测并清除文件开头的BOM信息
Php批量去除bom头信息的实现代码
php去掉bom头的代码分享
PHP 过滤页面中的BOM数据的简单实例
检测php文件是否有bom头的代码
批量清除php文件中bom的方法
检查并清除php文件中bom的函数
有关 UTF-8 BOM 导致样式错乱的解决方法
BOM与DOM的区别分析
用php的mvc模式来写一个简单的文章显示系统。
注意,只是为了教学,所以我们假定这个文章系统是只读的,即本例中不涉及文章的发布。
由于只涉及数据库的读取,所以定义两个interface。
Interface DataOperation
{
public function select($info);
public function selectNum($info);
}
以上的interface定义了读取数据的接口,select方法将返回所需要的文章。
selectNum方法返回文章的总数,这是分页显示时用到的。
$info是一个数组,用来存放查询条件。
Interface DataSource
{
public static function getInstance();
}
这里假定操作的是数据库,DataSource定义一个接口,所有实现该接口的实例类将得到一个静态对象。
Interface Controller
{
public function pop();
public function push();
public function execute();
}
Interface View
{
public function display();
}
定义一个类来实现DataSource接口,运用了单例模式。
class DataBaseSource implements DataSource
{
public static $instance = null;
public static function getInstance()
{
if(self::$instance == null)
{
self::$instance == new PDO("mysql:host=localhost;dbname=article","root","123456");
}
return self::$instance;
}
}
定义一个抽象类来实现DataOperation,我们要共享一个数据库连接,所以在抽象类中将这个数据库对象初始化,这样,所有的子类都能共享这个对象。
abstract class DataBaseOperation implements DataOperation
{
protected $db = null;
public function __construct()
{
$this->db = DataBaseSource::getInstance();
}
public function select($info);
}
下面来写一个业务子类来实现抽象类DataBaseOperation
class Tech extends DataBaseOperation
{
public function select($info)
{
//在这里实现你的代码
}
public function selectNum($info)
{
//在这里实现你的代码
}
}
实现了业务逻辑层后,开如控制层吧。
<?php
class ViewController implements Controller
{
private $mod = array();
public function push($key,$value);
{
//实现你的代码,将类注册进$this->mod;
}
public function pop($key)
{
//实现你的代码,将$this->mod[$key]值为null;
}
public function execute($key)
{
//在这里实现你的代码,生成实例.注意利用php5新的特性,异常的处理
}
}
//表现层,这里将实现Interface View
abstract ArticleView implements View
{
protected $smarty = null;
public function __construct()
{
$this->smarty = new Smarty();
///下面你可以定义smarty的一些属性值
}
}
具体的页面,例如科技文章的显示页面
class TechArticleView extends ArticleView
{
public function display()
{
//实现你的代码,调用Tech类和更多的DataBaseOperation子类
}
}
//总入口 index.php
try
{
$viewController = new ViewController();
$viewController->push("tech",TechArticleView);
//持续的增加
$mod = $_GET["mod"]:$_GET["mod"]:$_POST["mod"];
//最后
$viewController->execute($key);
}
catch(Exception $e)
{
//处理异常
}
?>