一、什么是BOM
     BOM(Browser Object Model)即浏览器对象模型。
     BOM提供了独立于内容 而与浏览器窗口进行交互的对象;
     由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象是window;
     BOM由一系列相关的对象构成,并且每个对象都提供了很多方法与属性;
     BOM缺乏标准,JavaScript语法的标准化组织是ECMA,DOM的标准化组织是W3C,BOM最初是Netscape浏览器标准的一部分。
 
二、常见浏览器对象
.onresize 事件会在窗口或框架被调整大小时发生
.onscroll 元素滚动时执行
.close() 关闭当前窗口
.open() 打开页面
.navigator.userAgent 浏览器的信息
.location.(href或hash或search)都是关于网页链接信息
 
三、event事件对象
当时间触发的时候产生的对象,存储着和事件相关的信息
chrome、firefox、IE9+等:事件函数的第一个形参就是事件对象
chrome、IE:全局变量 event
兼容写法:
document.onclick = function(e){
e = e || window.event;
alert( e );
};

四、鼠标事件

.clientX 存储鼠标相对于窗口的水平坐标

.clientY 存储鼠标相对于窗口的垂直坐标
.pageX 存储鼠标相对于文档的水平坐标(不兼容IE8及以下)
.pageY 存储鼠标相对于文档的垂直坐标(不兼容IE8及以下)
demo:
document.onclick = function(e){
e = e || window.event;
alert( e.cilentY + (document.body.scrollTop || document.documentElement.scrollTop)); //获取鼠标在文档的高度
      //document.body 和 document.documentElement 区别
      document.body 与 document.documentElement区别介绍
}
五、注册事件 和 解绑事件
1》注册事件的方式其实有2种:一种属性注册,另一种通过方法注册。
①属性注册方式又可分为在HTML元素内的事件属性赋值和通过JS指定元素对象的事件属性。
②方法注册方式可通过addEventListener()或attachEvent()方法进行事件的注册。
说明:在HTML页面中,设置元素属性为一个函数。 语法:<button onclick="func()">点击</button>
通过JS获取元素的对象,设置其事件属性为一个事件处理程序。 语法:EventTarget.onEventName=function(e){} 
 
这边就说说第二种的注册:
//兼容主流浏览器写法    参数:(去掉on的事件名,事件函数,布尔值[可写可不写])
oBox.addEventListener('click' , function(){
alert('1');
}, false);

//兼容IE8及以下写法    参数:(事件名,事件函数):

oBox.attachEvent('onclick' , function(){
alert(1);
});

兼容写法:用一个函数包括它们

function addEvent(obj , eName , eFn){
document.addEventListener ? obj.addEventListener(eName, eFn) : obj.attachEvent('on'+eName , eFn);
}

2》解绑事件:

addEventListener 对应 removeEventListener;

attachEvent 对应 detachEvent;

demo:

function fn2(){
alert(1);
} oBox.addEventListener('click' , fn2);
oBox.removeEventListener('click' , fn2); oBox.attachEvent('onclick' , fn2);
oBox.detachEvent('onclick' , fn2);

通过addEvenetListener注册的事件,最好不要用匿名事件函数,因为不好解绑
如果说有实际的需要,那么采用自己封装的添加事件 和 解绑事件

解绑匿名事件:

var oBox = document.getElementById('box');

            addEvent(oBox , 'click' , function(){
alert('大锤');
});
removeEvent(oBox , 'click' , function(){
alert('大锤');
}); function addEvent( obj , eName , eFn ) {
if (obj[eName+'FLY']){ //用数组把函数存储下来
obj[eName+'FLY'].push(eFn);
}else{
obj[eName+'FLY'] = [eFn];
};
if (document.addEventListener){
obj.addEventListener(eName,eFn);
}else{
obj.attachEvent('on'+eName,eFn);
}
};
function removeEvent( obj , eName , eFn ) {if (obj[eName+'FLY']){ //传递的是匿名函数
for (var i=0;i<obj[eName+'FLY'].length;i++){
if (obj[eName+'FLY'][i]+'' === eFn+''){//把函数转换成字符串 再进行比较
if (document.removeEventListener){
obj.removeEventListener(eName,obj[eName+'FLY'][i]);
}else{
obj.detachEvent('on'+eName,obj[eName+'FLY'][i]);
};
};
};
};
};

综上写一个功能比较齐全的封装:

var oBox = document.getElementById('box');

            addEvent(oBox , 'click' , function(){
alert('大锤');
});
addEvent(oBox , 'click' , fn2);
removeEvent(oBox , 'click' , function(){
alert('大锤');
}); function addEvent( obj , eName , eFn ) {
if (obj[eName+'FLY']){
obj[eName+'FLY'].push(eFn);
}else{
obj[eName+'FLY'] = [eFn];
};
if (document.addEventListener){
obj.addEventListener(eName,eFn);
}else{
obj.attachEvent('on'+eName,eFn);
}
};
function removeEvent( obj , eName , eFn ) {
if (eFn){
if (document.removeEventListener){ //有名函数
obj.removeEventListener(eName,eFn);
}else{
obj.detachEvent('on'+eName,eFn);
};
if (obj[eName+'FLY']){ //传递的是匿名函数
for (var i=0;i<obj[eName+'FLY'].length;i++){
if (obj[eName+'FLY'][i]+'' === eFn+''){
if (document.removeEventListener){
obj.removeEventListener(eName,obj[eName+'FLY'][i]);
}else{
obj.detachEvent('on'+eName,obj[eName+'FLY'][i]);
};
};
};
};
}else{//不传函数参数则全部解除
if (obj[eName+'FLY']){ //全部解绑
for (var i=0;i<obj[eName+'FLY'].length;i++){
if (document.removeEventListener){
obj.removeEventListener(eName,obj[eName+'FLY'][i]);
}else{
obj.detachEvent('on'+eName,obj[eName+'FLY'][i]);
}
};
};
};
}; function fn1() {
alert('大狗蛋');
};
function fn2() {
alert('小狗蛋');
};

六、滚动事件

1》在IE各版本 和 谷歌中 兼容onmousewheel

火狐中只能通过 addEventListener 注册

document.onmousewheel = function(){
console.log(1);
};
document.addEventListener('DOMMouseScroll',function () {//火狐写法
console.log(1);
});

兼容写法:

function mousewheel(obj , eFn) {
document.onmousewheel === null?obj.onmousewheel=eFn:obj.addEventListener('DOMMouseScroll',eFn);
}

2》滚动值 wheelDelta 和 detail

在chrome和IE里,值是120的倍数,负值代表向下滚轮(贴近胸),正值代表向上滚轮(往上推)
console.log(e.detail); //在firefox里,值是3的倍数,负值代表向上滚轮(往上推),正值代表向下滚轮(贴近胸)

demo:

var oImg = document.getElementById('img');
var prop = 1;
var w = oImg.width;
mousewheel(oImg , function(e){
//console.log(1);
e=e||window.event;
var delta = e.wheelDelta/120 || -e.detail/3;//判断delta的正负就可以知道向上滚轮还是向下滚轮 if (delta<0){
prop -= 0.05;
}else{
prop += 0.05;
};
console.log(w);
this.width = w*prop;
}); function mousewheel(obj , eFn) {
document.onmousewheel === null?obj.onmousewheel=eFn:obj.addEventListener('DOMMouseScroll',eFn);
}

javascript基础知识 (八) BOM学习笔记的更多相关文章

  1. Go语言核心36讲(Go语言基础知识一)--学习笔记

    01 | 工作区和GOPATH 从 Go 1.5 版本的自举(即用 Go 语言编写程序来实现 Go 语言自身),到 Go 1.7 版本的极速 GC(也称垃圾回收器),再到 2018 年 2 月发布的 ...

  2. Go语言核心36讲(Go语言基础知识二)--学习笔记

    02 | 命令源码文件 我们已经知道,环境变量 GOPATH 指向的是一个或多个工作区,每个工作区中都会有以代码包为基本组织形式的源码文件. 这里的源码文件又分为三种,即:命令源码文件.库源码文件和测 ...

  3. Go语言核心36讲(Go语言基础知识三)--学习笔记

    03 | 库源码文件 在我的定义中,库源码文件是不能被直接运行的源码文件,它仅用于存放程序实体,这些程序实体可以被其他代码使用(只要遵从 Go 语言规范的话). 这里的"其他代码" ...

  4. Go语言核心36讲(Go语言基础知识四)--学习笔记

    04 | 程序实体的那些事儿(上) 还记得吗?Go 语言中的程序实体包括变量.常量.函数.结构体和接口. Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予 ...

  5. Go语言核心36讲(Go语言基础知识五)--学习笔记

    05 | 程序实体的那些事儿(中) 在前文中,我解释过代码块的含义.Go 语言的代码块是一层套一层的,就像大圆套小圆. 一个代码块可以有若干个子代码块:但对于每个代码块,最多只会有一个直接包含它的代码 ...

  6. Go语言核心36讲(Go语言基础知识六)--学习笔记

    06 | 程序实体的那些事儿 (下) 在上一篇文章,我们一直都在围绕着可重名变量,也就是不同代码块中的重名变量,进行了讨论.还记得吗? 最后我强调,如果可重名变量的类型不同,那么就需要引起我们的特别关 ...

  7. JavaScript 基础知识 - BOM篇

    前言 本篇文章是JavaScript基础知识的BOM篇,如果前面的<JavaScript基础知识-DOM篇>看完了,现在就可以学习BOM了. 注意: 所有的案例都在这里链接: 提取密码密码 ...

  8. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...

  9. 学习javascript基础知识系列第二节 - this用法

    通过一段代码学习javascript基础知识系列 第二节 - this用法 this是面向对象语言中的一个重要概念,在JAVA,C#等大型语言中,this固定指向运行时的当前对象.但是在javascr ...

  10. Javascript基础知识总结一

    Javascript基础知识总结一 <!DOCTYPE html> <html> <head lang="en"> <meta chars ...

随机推荐

  1. hdu2147(yy)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2147 题意:给出一个n*m的矩阵,一开始有个点在最右上方, 两个人轮流移动点,可以向左移一格,或者向下 ...

  2. bzoj 2039: [2009国家集训队]employ人员雇佣【最小割】

    一开始在https://www.cnblogs.com/lokiii/p/10770919.html基础上连(i,j,b[i][j])建了个极丑的图T掉了--把dinic换成isap勉强能卡过 首先因 ...

  3. P4443 [COCI2017-2018#3] Dojave(线段树)

    传送门 设\(lim=2^n-1\),对于一个区间\([l,r]\)来说,如果\(sum\neq lim\)且能换出\(x\)并换进\(y\)来,使得\(sum\bigoplus a_x\bigopl ...

  4. jzoj5983. 【北大2019冬令营模拟2019.1.1】多边形 (组合数学)

    这其实是道打表题--你看我代码就知道了-- 咳咳来点严谨证明好了-- 前方高能请注意 首先,正多边形近似于圆,可以看做在圆里内接多边形.圆内接多边形最多只有三个锐角.因为凸多边形的外角和为\(360\ ...

  5. 覆盖equals方法时请遵守通用约定

    覆盖equals方法时请遵守通用约定   覆盖equals方法看起来很简单,但是有许多覆盖方式会导致错误,并且后果很严重.最容易避免这种类问题的方法就是不覆盖equals方法,在这种情况下,类的每个实 ...

  6. MyBais中xxMap.xml中的知识点

    添加新的mapper的时候下面两个标红的地方要注意,如果统一约定好命名的话都还好,但是就怕一会这样一会那样的业务代码:总之小心! <!-- spring与mybatis整合配置,扫描所有dao, ...

  7. Linux | C代码的编写、运行和调试

    1.  建立.c文件 在终端下输入:vi mytest.c [使用编辑器 vim] 键入键盘i键,使vi编辑器进入编辑模式 接下来在vi编译器中编写代码,如: #include <stdio.h ...

  8. Springboot下事务管理的简单使用

    关于事务管理的概念这里就不多介绍了,在我的博客“JDBC事务之理论篇”中也有介绍. 关于Spring的事务管理,主要是通过事务管理器来进行的.这里看个Spring事务管理的接口图:(来自博客https ...

  9. B. Apple Tree 暴力 + 数学

    http://codeforces.com/problemset/problem/348/B 注意到如果顶点的数值确定了,那么它分下去的个数也就确定了,那么可以暴力枚举顶点的数值. 顶点的数值是和LC ...

  10. 【持续更新】JS 时间与日期

    JS 的日期时间在项目中是必定会用到的,所以必须掌握. UTC 与 GMT 背景 十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测.1675年旧皇家观测所(Old Royal Obse ...