文档类型定义(DTD)
浏览器会有几种工作模式,而DTD里面包含了文档的规则,浏览器会根据文档定义的DTD来解释页面的标识,并展现出来。 换句话说, DTD告诉浏览器工作在不同的模式下。
DOCTYPE是document type(文档类型)的简写,在web设计中用来说明你用的XHTML或者HTML是什么版本。
DOCTYPE声明 对于 建立符合标准的网页 是必不可少的关键组成部分;如果DOCTYPE不正确,标识和CSS都不会生效。
DTD分类:
- 过渡的(Transitional):是要求非常宽松的DTD。一般的情况下网页中会使用此DTD,它允许你继续使用HTML4.01的标识(但是要符合xhtml 的写法)。
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-
-
严格的(Strict):要求严格的DTD。对页面的标签使用非常严格,页面里几乎不准使用 inline-style 的 CSS 样式。
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-
-
框架的(Frameset):专门针对框架页面设计使用的DTD。以前Table 满街走的年代很流行这种DTD,如果你的页面中包含有框架,需要采用这种DTD。
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
-
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
-
-
适用于手机浏览器的DTD:用于移动端开发。
-
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
-
"http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
-
怎么选择DOCTYPE?
理想情况当然是严格的DTD,但对于大多数刚接触web标准的设计师来说,过渡的DTD(XHTML 1.0 Transitional)是目前理想选择。因为这种DTD还允许我们使用 表现层的标识、元素和属性,也比较容易通过W3C的代码校验。
注:上面说的"表现层的标识、属性"是指那些纯粹用来控制表现的tag。例如用于排版的表格、背景颜色标识等。在XHTML中标识是用来表示结构的,而不是用来实现表现形式,我们过渡的目的是最终实现数据和表现相分离。
判断页面有没有DTD (compated属性问题)
-
document.compatMode === "BackCompat"
-
BackCompat 未声明的返回值
-
CSS1Compat 已经声明的返回值
1. 事件对象
- 获取事件对象 event。
-
W3C火狐谷歌 : event 或者 在事件绑定的函数中加参,这个参数就是event.
-
IE6、7、8 支持: window.event(不支持带参)
-
function (event){
-
var event = event || window.event;
-
// 对事件进行操作
-
}
-
-
获取事件的目标 target。
-
W3C 浏览器: event.target
-
IE6、7、8 : event.srcElement
-
兼容写法:
-
var target = event.target || event.srcElement;
-
var target = event.target? event.target: event.srcElement;
-
2. 获取屏幕可视区的宽高
-
W3C 规 定 : window.innerWidth 和 window.innerHeight
-
谷歌支持声明DTD : window.documentElement.clientWidth 和 window.documentElement.clientHeight
-
IE支持未声明DTD : window.body.clientWidth 和 window.body.clientHeight
-
兼容写法:
-
function client(){
-
if(window.innerHeight !== undefined){ // 如果浏览器支持innerHeight属性
-
return {
-
"width" : window.innerWidth,
-
"height": window.innerHeight
-
}
-
}else if( document.compatMode === "CSS1Compat"){ // 如果浏览器声明了DTD
-
return {
-
"width" : window.documentElement.clientWidth,
-
"height": window.documentElement.clientHeight
-
}
-
}else{
-
return {
-
"width" : window.body.clientWidth,
-
"height": window.body.clientHeight
-
}
-
}
-
}
3. 获取被卷曲的部分
-
function scroll(){
-
if( window.pageYOffset !== undefined){
-
return {
-
"top" : window.pageYOffset ,
-
"left": window.pageXOffset
-
}
-
}else if( document.compatMode ==="CSS1Compat"){
-
return {
-
"top" : window.documentElement.scrollTop ,
-
"left": window.documentElement.scrollLeft
-
}
-
}else{
-
return {
-
"top" : window.body.scrollTop,
-
"left": window.body.scrollLeft
-
}
-
}
-
}
-
或者简写:
-
function scroll(){
-
/*
-
* 如果这个属性存在,那么返回值 应该在 0 ~ 无穷大;
-
* 如果没有, 返回值则是 undefined.
-
* 只要判断 不是undefined 就可以调用此方法.
-
*/
-
if(window.pageYOffset !== undefined){
-
return{
-
"top" : window.pageYOffset || documnet.body.scrollTop || documnet.documentElement.scrollTop;
-
"left" : window.pageXOffset || documnet.body.scrollLeft || documnet.documentElement.scrollLeft;
-
}
-
}
-
}
4. 光标在页面中的位置
-
pageX 和 pageY 兼容性不好。
-
兼容写法:
-
鼠标在页面中的位置 = 被卷曲的部分 + 可视区部分。
-
pagex = event.pageX || scroll().left + event.clientX;
-
pagey = event.pageY || scroll().top + event.clientY;
5.取消/阻止事件冒泡
不冒泡的事件有: blur 、focus、load、unload、onmouseenter、onmouseleave
判断事件是否冒泡 : event. bubbles
属性
-
document.onclick = function(event){
-
event = event || window.event;
-
console.log( event.bubbles);
-
// 返回true则说明事件冒泡;否则不冒泡。
-
}
取消/阻止事件冒泡:
-
W3C浏览器: 通过stopPropagation()方法阻止冒泡
-
IE6、7、8: 通过cancelBubble属性控制是否阻止冒泡
-
document.onmouseenter = function(event){
-
var event = event || window.event;
-
if( event && event.cancelBubble){
-
event.cancelBubble = true;
-
}else{
-
event.stopPropagation();
-
}
-
}
6.跨浏览器的事件处理程序
使用EventUtil对象来处理浏览器间的差异性。
-
var EventUtil = {
-
addHandler : function(element, type, handler){
-
if ( element.addEventListener){
-
element.addEventListener(type, handler, false);
-
}else if( element.attachEvent){
-
element.attachEvent("on" + type , handler);
-
} else{
-
element["on"+type] = handler;
-
}
-
},
-
removeHandler : function(element, type, handler){
-
if( element.removeEventListener){
-
element.removeEventListener(type, handler, false);
-
}else if(element.detachEvent){
-
element.detachEvent("on"+type, handler);
-
}else{
-
element["on"+type] = null;
-
}
-
}
-
}
7.跨浏览器的事件对象
-
var EventUtil = {
-
addHandler: function( element, type, handler){},
-
getEvent: function(event){
-
return event?event: window.event;
-
},
-
getTarget: function(event){
-
return event.target || event.srcElement;
-
},
-
preventDefault : function(event){
-
if( event.preventDefault){
-
event.preventDefault();
-
}else{
-
event.returnValue = false;
-
}
-
},
-
removeHandler: function( element, type, handler){},
-
stopPropagation: function(event){
-
if(event.stopPropagation){
-
event.stopPropagation();
-
}else{
-
event.cancelBubble = true;
-
}
-
}
-
}
8.鼠标滚轮事件
-
W3C浏览器: mousewheel 属性event.wheelDelta >0向上滚动
-
Foirefox: DOMMouseScroll 属性event.detail <0 向上滚动
-
JQuery中: event.originalEvent.wheelDelta就是指向原始的事件对象。
-
JQuery中兼容写法:
-
$(document).on("mousewheel DOMMouseScroll", function (e) {
-
var delta = (e.originalEvent.wheelDelta && (e.originalEvent.wheelDelta > 0 ? 1 : -1)) || (e.originalEvent.detail && (e.originalEvent.detail > 0 ? -1 : 1));
-
//var delta = (event.originalEvent.wheelDelta) ? event.originalEvent.wheelDelta : -(event.originalEvent.detail || 0); //合并写法
-
if (delta > 0) {
-
// 向上滚
-
console.log("wheelup");
-
} else if (delta < 0) {
-
// 向下滚
-
console.log("wheeldown");
-
}
-
});
-
判断Firefox:(除了使用userAgent属性)
-
if( document.mozHidde != undefined){
-
//此为firefox
-
}