认识DOCTYPE

认识DOCTYPE

带着问题入手:想获取浏览器可视高度,为什么利用document.body.clientHeight有时候会失效,上网搜索之后使用document.documentElement.clientHeight能解决,但有时候也会出问题。

 

当我们打开一个网页的源代码,一般我们会看到第一行都是<!DOCTYPE……,这样的文字,DOCTYPE后面的文字会有所差别,这个东西到底有什么用处呢?

这篇文章就来说说这个DOCTYPE

 

1、通过搜索引擎,我们可以搜索到DOCTYPE的一些介绍,但总是怕别人讲的不全或者有问题,那就请访问http://www.w3.org/QA/2002/04/valid-dtd-list.html,这是W3C组织的官方网站上的介绍,里面很详细的列出了可供定义的DOCTYPE,我们一般用到的是如下3个:

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"

   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"

   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

 

DOCTYPE描述主要就是告诉浏览器使用什么dtd来解析html代码,否则就会使用浏览器默认的来解析,会造成不同浏览器的显示样式不同。

 

 

以下是从手册上摘抄的规则:

 

语法:

HTML  顶级元素  可用性 "注册//组织//类型 标签//定义  语言""URL"

 

可能值:

- 顶级元素:指定 DTD 中声明的顶级元素类型。这与声明的 SGML 文档类型相对应。 HTML 默认。HTML

- 可用性:指定正式公开标识符(FPI)是可公开访问的对象还是系统资源。 PUBLIC 默认。可公开访问的对象。SYSTEM 系统资源,如本地文件或 URL

- 注册:指定组织是否由国际标准化组织(ISO)注册。 + 默认。组织名称已注册。

- 组织名称未注册。Internet 工程任务组(IETF)和万维网协会(W3C)并非注册的 ISO 组织。

组织:指定表明负责由 !DOCTYPE 声明引用的 DTD 的创建和维护的团体或组织的名称,即 OwnderID IETF IETF W3C W3C

- 类型:指定公开文本类,即所引用的对象类型。 DTD 默认。DTD

- 标签:指定公开文本描述,即对所引用的公开文本的唯一描述性名称。后面可附带版本号。 HTML 默认。HTML

- 定义:指定文档类型定义。

  Frameset 框架集文档。

  Strict 排除所有 W3C 专家希望逐步淘汰的代表性属性和元素,因为样式表已经很完善了。

  Transitional 包含除 frameSet 元素的全部内容。

- 语言:指定公开文本语言,即用于创建所引用对象的自然语言编码系统。该语言定义已编写为 ISO 639  语言代码(大写两个字母) EN 默认。英语。

- URL:指定所引用对象的位置

 

为了获得正确的DOCTYPE声明,关键就是让dtd与文档所遵循的标准对应。例如,假定文档遵循的是xhtml 1.0 strict标准,文档的doctype声明就应该引用相应的dtd。另一方面,如果doctype声明指定的是xhtml dtd,但文档包含的是旧式风格的html标记,就是不恰当的;类似地,如果doctype声明指定的是html dtd,但文档包含的是xhtml 1.0 strict标记,同样是不恰当的。

 

2DOCTYPE的用法,DOCTYPE描述都是放在页面的开始位置。

让我们来看一个例子:

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">
 <head>
  <title>test DOCTYPE</title>
 </head>
<style>
#test{
	border:1px dashed windowtext;
	height:20px;
	width:30px;
	padding:10px;
	margin:auto;
}
</style>
 <body>
  <div id="test">

  </div>
 </body>
</html>

 

 

这段代码在iefirefoxchrome中打开的效果是,div居中。

但我们把DOCTYPE这段描述删除,看看效果如何。在firefoxchrome中效果没有变化,而在ie中就会发现div就在左边了,而并没有居中。当我们把margin:auto放到搜索引擎中进行搜索的时候,会有一堆人回答你用这个可以让div居中,但他们不会告诉你要使这个有效果的前提是有DOCTYPE

 

 但在ie中也会有情况是没有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">
 <head>
  <title>test DOCTYPE</title>
 </head>
<style>
#test{
	cursor:col-resize;
	height:200px;
	width:300px;
	position:absolute;
}
</style>

 <body>
  <div id="test">

  </div>
 </body>
</html>

 

 

本来的目的是想把test这个div上的鼠标手势修改为col-resize,但在ie中却发现不起作用,但我们把DOCTYPE描述删除掉之后就会发现生效了,而在Firefox中始终都有效。

 修改方法如下:

 1)删除DOCTYPE描述;

 2)当然这里我们也可以保留DOCTYPE,在样式中增加background-color:#FFFFFF;就可以看到效果,而默认的background-colortransparent

 3position删除。

 2种解决方法在某些环境下不可行,div下面有一个背景图,那这个div设置了背景色就会影响效果;第3种方法基本上不考虑,设置这个position大部分时候都是程序所需。

 这个大家可以在访问https://tools.alibaba-inc.com这些平台的首页的时候,那个分隔条拖动就是这个情况,我的解决方法是删除DOCTYPE

 

 3transitinal.dtdstrict.dtdframeset.dtd的区别

 只是在写html标签的时候区别不是很大,我也就介绍一下对js代码的影响,由于现在的浏览器对html代码的容错能力很强,即使有语法错误也不会给与提示。

(1)frameset.dtd,如果我们的页面需要使用到frameset的话,需要使用这个dtd,否则都不允许使用;

(2)strict.dtd,严格的控制,使用这种模式之后,所有表现层的标签都不允许使用了,例如:br,b,i这些都属于表现层的标签。但目前的浏览器容错能力很强,不会强制报错,还是会正常的显示;

(3)transitional.dtd,过渡期控制,在strict的基础上兼容老的标签。

 

现在的浏览器解析html的时候,strict.dtdtransitional.dtd基本上没什么差别,如果严格按照W3C的约定去做的话,估计大部分网页在这种浏览器下都会变形,市场机会完全失去。

 

但我们去研究js的时候,会发现有没有定义DOCTYPE在某些js中产生的结果会不一样,请看例子:

<!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">
 <head>
  <title>获取可视高度</title>
  <style>
  .info{
	background-color:#ad6a9e;
	padding:10px;
	color:#444444;
  }
  </style>
  <script>
function getHeight(){
	var ht = document.body.clientHeight;
	alert(ht);
}
  </script>
 </head>

 <body>
  <div class="info">
  中新网12月24日电 据国家气象局网站消息,受强冷空气影响,未来三天,中国大部地区自西向东将迎来一次寒潮天气过程,西北地区东部偏北地区、西北地区北部和中东部、内蒙古大部、华北、东北、黄淮、江淮等地将先后出现5~7级,阵风8级偏北风;冷空气前锋过后,上述大部地区的气温将下降8~12℃,其中内蒙古中部和东南部、陕西北部、山西北部、河北北部、辽宁西部、吉林西部的气温将下降14~16℃,部分地区降温幅度可达16~18℃。内蒙古东北部、东北地区等地的部分地区有大雪或暴雪。受另一股冷空气影响,25日,新疆北部将有5~6级、山口地区8~9级大风,气温在24日回升的基础上,将下降4~8℃。
  <input type="button" value="获取可视高度" οnclick="getHeight();"/>
  </div>
 </body>
</html>

 

 

ie6firefoxchrome浏览器的最终结果如下:

浏览器

IE6

firefox 3.0.16

chrome

结果

96

97

100

显然这个不是我们想要的可视高度,倒像是这个网页中的内容高度。

 

那我们把DOCTYPE删除之后,再看看结果如何:

浏览器

IE6

firefox 3.0.16

chrome

结果

726

709

805

3个值就是我们最终想要的浏览器的可视高度了。

但删除DOCTYPE不就违背了w3c的原则了么,那有没有办法不删除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">
 <head>
  <title>获取可视高度</title>
  <style>
  .info{
	background-color:#ad6a9e;
	padding:10px;
	color:#444444;
  }
  </style>
  <script>
function getHeight(){
	var ht = document.documentElement.clientHeight;
	alert(ht);
}
  </script>
 </head>

 <body>
  <div class="info">
  中新网12月24日电 据国家气象局网站消息,受强冷空气影响,未来三天,中国大部地区自西向东将迎来一次寒潮天气过程,西北地区东部偏北地区、西北地区北部和中东部、内蒙古大部、华北、东北、黄淮、江淮等地将先后出现5~7级,阵风8级偏北风;冷空气前锋过后,上述大部地区的气温将下降8~12℃,其中内蒙古中部和东南部、陕西北部、山西北部、河北北部、辽宁西部、吉林西部的气温将下降14~16℃,部分地区降温幅度可达16~18℃。内蒙古东北部、东北地区等地的部分地区有大雪或暴雪。受另一股冷空气影响,25日,新疆北部将有5~6级、山口地区8~9级大风,气温在24日回升的基础上,将下降4~8℃。
  <input type="button" value="获取可视高度" οnclick="getHeight()"/>
  </div>
 </body>
</html>

 

就是把document.body修改为document.documentElement,测试的结果如下:

 

浏览器

IE6

firefox 3.0.16

chrome

结果

726

709

805

和上面的结果一致,测试通过。

 

那我们应该找到一种方法可以解决没有DOCTYPE以及有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">
 <head>
  <title>compatMode</title>
 </head>

 <body>
  <script>
  document.write(document.compatMode);
  </script>
 </body>
</html>

 

保留DOCTYPE,页面显示的结果是CSS1Compat;而删除了DOCTYPE之后,看到的结果是BackCompat,由此我们可以得到结论,应该就是这个document.compatMode影响了我们的clientHeight结果。

 

既然找到原因,那么我们就把上面的获取clientHeight代码修改一下:

 

 

function getHeight(){
	var flag = document.compatMode == "CSS1Compat";
	if(flag){
		var ht = document.documentElement.clientHeight;
	}
	else{
		var ht = document.body.clientHeight;
	}
	
	alert(ht);
}

 

 

这样测试结果,不论是否删除,我们都可以获得正确的clientHeight,同样的clientWidth也是如此操作。

 

通过以上的介绍,我们知道了JS不仅有不同浏览器的兼容性问题需要考虑,不同的页面定义也会造成返回结果的变化,所以有以下几点值得注意:

(1)       我们在编写页面的时候,都带上DOCTYPE这个声明,不要轻易的将其删除,除了使用frameset的地方,其他网页都使用transitional.dtd这种类型;

(2)       在编写js的时候,在获取页面的clientHeightclientWidthscrollHeightscrollWidthscrollLeftscrollTop这些属性的时候,都需要增加对document.compatMode的判断,这样才可以保证我们的js有更强的兼容性。

 

在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统级的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统级依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值