BOM
BOM:Browser Object Model
,定义了一些JS操作浏览器的方法。
`windows.open('url','_self||_bank');`//打开一个新的页面。
(url为空默认是新的空白页面,打开方式为空默认打开一个新的页面)。~全为空就是用在新窗口页面打开一个空白页面~
返回值:返回新打开的窗口的`window`对象
opener=window.open('http://www.baidu.com');//不单单是赋值,也会去执行
alert(opener ===window);//false
opener.document.body.style.backgroundColor = 'red';//如果打开的是另外一个域名的网站就会涉及到跨域的问题,会禁止去修改。
浏览器大部分属性是在window
下的。window
代表的是窗口
在JS定义中,如果前面是window
可以省略不写
//window.close();
//在本窗口打开新打开的窗口
opener = window.open();
window.close();
//获得浏览器信息
console.log(window.navigator.userAgent);
document.write(window.navigator.userAgent);
if(window.navigator.userAgent.indexOf('MSIE')!=-1){
alert('我是IE');
}else{
alert('我是正规浏览器');
}
//window.location是一个对象
console.log(window.location+'
');
console.log(window.location.href+'
');//与loation相同
console.log(window.location.search+'
');//显示?号后面的
console.log(window.location.hash+'
');//显示#号后面的
2-文档宽高及窗口事件
//clientWidth可视区的宽
//clientWidth可视区的高
//document是一个文档对象,没有尺寸。documentElement是文档元素,有尺寸
document.write('Document的宽是'+document.documentElement.clientWidth);
//滚动条滚动距离
//在chrome里认为滚动条是属于body的
alert(document.documentElement.scrollTop||scrollLeft);
alert(document.body.scrollTop||scrollLeft);//在chrome里面
//兼容处理
var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;
varurr =0||1;//0是会隐士转换为false
//元素的内容高于内容宽。内容高:实际上内容显示的高度,溢出的内容块也计算在内。
alert('div1的内容高是'+getDiv1.scrollHeight);
alert('div1的内容宽是'+getDiv1.scrollWidth);
//文档高与文档宽:offsetWidth||offsetHeight。
//在IE中[IE10-],认为文档高与可视区的高是一样的
alert('文档高是'+getDiv1.offsetHeight);
alert('内容高是'+getDiv1.offsetWidth);
body个margin值是8px
//BOM[window]对象下的两个事件
//触发事件的单位是时间
window.onscroll//当页面滚动的时候触发
window.onresize//当页面大小发生滚动的时候触发
焦点事件
//焦点:浏览器能够区分用户的操作。
//只有能够响应用户操作的才有焦点
/*一般焦点设置的几种方式
1.click
2.table
3.js
*/
//onfocus 当元素获取到焦点的时候触发
getInput.onfocus = function(){
if(this.value=='请输入文字'){
this.value = '';
}
}
//失去焦点事件
getInput.onblur = function(){
if(this.value==''){
this.value = '请输入文字';
}
}
obj.focus();//给指定的元素设置焦点
obj.blur();//取消指定元素的焦点
obj.select();//选中指定元素的文本内容。chrome FF 是不允许直接操作用户的鼠标.能选中的只能是用户输入的内容
event事件对象和clientX,clientY
//evnet:事件对象:当一个事件发生之时,事件详细信息被临时保存到的集合
//IE,chrome有一个内置全局对象,
//FF 等标准浏览器event被保存在事件函数的第一个参数。[事件函数:事件发生调用的函数]
function fn1(ev){//兼容解决办法
var ev = ev||event;//非标准对象第一个返回false
}
clientX||clientY:当一个事件发生的时候,鼠标相对于页面可视区的距离
document.onmousemove = function(ev){
var ev = ev||event;
var T = document.documentElement.scrollTop||document.body.scrollTop;
var L = document.documentElement.scrollLeft||document.body.scrollLeft;
document.title = i++;
getDiv.style.left = L+ev.clientX+'px';
getDiv.style.top = T+ev.clientY+'px';
}
事件流,事件冒泡机制
//冒泡:当一个元素接收到事件的时候,会把他接收到的事件传播给他的父级[的父级...]
//正确的解释是给元素添加事件处理函数
//类比:我在马路边捡到一分钱,交给警察叔叔。钱没有交给警察叔叔,钱也是捡到了。
//事件冒泡的机制是默认是存在的
//这样就会出现问题
input.onclick = function(){
div.style.display = 'block';
};
document.onclick = function(){
div.style.display = 'none';
}
//阻止冒泡:在阻止冒泡的事件函数中调用 ev.cancelBubble = true;
//阻止冒泡[add调用事件]:在阻止冒泡的事件函数中调用 ev.stopPropagation();
//只能单独去阻止事件。//阻止click,不回去阻止onmouseover
事件绑定的第二种形式
//事件捕获必须在事件绑定的第二种方式
obj.onclick //是赋值的形式,会覆盖掉
obj.addEventListener();//可以避免掉赋值的问题
//在IE下,这两个的执行顺序在IE下是不一样的。
div1.attachEvent('onclick',function(){//没有捕获参数
alert('hello world');
});//使用this,弹出的是window
//标准下
div.addEventListener('click',fn,是否捕获[默认是false冒泡,true是捕获]);
div1.attachEvent
1.没有捕获
2.时间名称有on
3.函数执行的顺序:标准->正序;非标准->倒序
4.this指向window
div.addEventListener('click',function(){});
1.有捕获
2.事件名称没有on
3.事件函数执行顺序正常
4.this正常
function fn1(a,b){
alert(this);
alert(a+b);
}
//调用call的同时,可以去传参.并且this指向参数。
//fn(); === fn1.call();
//一般使用call是用来改变函数里的this的指向问题
//call();//第二个参数开始就是原函数的参数列表
//如果call();第一个参数是空,是不改变this指向,this会指向原本应该改变的this
fn1.call(1,2,3);
function fn1(){
alert(this);
}
function fn2(){
alert(1);
}
//两个添加事件函数的兼容模式
function bind(obj,evName,fn){
if(obj.addEventListener){
obj.addEventListener(evName,fn,false);
}else{
obj.attachEvent('on'+evName,function(){
fn.call(obj);
});
}
}
bind(document,'click',fn1);
bind(document,'click',fn2);
//兼容方式
事件捕获
//先从外面到里面[捕获],再从里面倒外面[冒泡]。
事件的取消
//有两种方法
//onclick 通过赋值为其他值。[不要改变变量类型,null赋给点击事件]
obj.onclick = function;
//IE:时间名称和函数与注册要一一致。
//obj.attachEvent('onclick',fn1);
obj.detachEvent('onclick',fn1);
//标准:(事件,事件函数,类型)
div1.removeEventListener('click',function(){},false);
键盘事件
//onkeydown 与onkeyup
要知道事件发生的细节需要用到event对象
event.keyCode返回的是ascii码
ctrlKey shifrtKey altKey //boolean
enter keyCode = 13;
//不是所有元素都能够接收键盘事件,是能够相应用湖输入的元素
//document可以接收焦点。焦点是在默认文档上
//onkeydown 按下不抬起会连续触发,但是会有一个延迟时间
/*
* 38
* 37 40 39
* */
//按下不抬起会连续触发,解决办法是设置定时器。
var getDiv = document.getElementById('div1');
document.onkeydown = function(ev){
var ev = ev||event;
switch (ev.keyCode){
case 37:
getDiv.style.left = getDiv.offsetLeft -10 +'px';
break;
case 38:
getDiv.style.top = getDiv.offsetTop -10 +'px';
break;
case 39:
getDiv.style.left = getDiv.offsetLeft +10 +'px';
break;
case 40:
getDiv.style.top = getDiv.offsetTop +10 +'px';
break;
}
}
//解决延时。抬起是清除事件
var oDiv = document.getElementsByTagName('div')[0];
var timer = null;
document.onkeydown = function(ev){
clearInterval(timer);
var ev = ev||event;
timer = setInterval(function(){
switch (ev.keyCode){
case 37:
oDiv.style.left = oDiv.offsetLeft - 10 + 'px';
break;
case 38:
oDiv.style.top = oDiv.offsetTop - 10 + 'px';
break;
case 39:
oDiv.style.left = oDiv.offsetLeft + 10 + 'px';
break;
case 40:
oDiv.style.top = oDiv.offsetTop + 10 + 'px';
break;
}
},10);
}
document.onkeyup = function(){
clearInterval(timer);
}
事件默认行为-默认事件
//事件发生的时候,浏览器默认运行的行为。
阻止事件行为:在事件处理函数中添加return false;
document.oncontextmenu //右键环境菜单
//模拟右键菜单
var getDiv = document.getElementsByTagName('div')[0];
document.oncontextmenu = function(ev){
var ev = ev||event;
getDiv.style.display = 'block';
getDiv.style.left =ev.clientX +'px';
getDiv.style.top =ev.clientY +'px';
return false;
}
document.onclick = function(){
getDiv.style.display = 'none';
}
拖拽的原理
/*
* 由三大事件组成
* onmousedown选中元素
* onmousemove拖拽元素.有间隔时间
* onmouseup释放元素
* */
var getDiv = document.getElementsByTagName('div')[0];
getDiv.onmousedown = function(ev){
var ev = ev||event;
var disX = ev.clientX - this.offsetLeft;
var disY = ev.clientY - this.offsetTop;
document.onmousemove = function(ev){
var ev = ev||event;
getDiv.style.left = ev.clientX - disX +'px';
getDiv.style.top = ev.clientY - disY +'px';
}
document.onmouseup = function(){
document.onmousemove =document.onmouseup=null;
}
}
拖拽的问题以及解决办法
/*
* 拖拽的时候,有文字被选中,会产生问题
*
* 原因:鼠标按下的时候,如果页面有文字被选中,会触发浏览器的默认拖拽文字的效果
* |
* V
* 是 onmousedown 的默认效果->标准浏览器:return false;
*
* */
/*
*
* IE:全局捕获.:打劫事件,没有被分享,而是被抢过去了。
*
* FF:有但不执行
*
* Ch:没有
*
* 当给一个元素设置全局捕获以后,那就元素监听以后发生的所有事件。当事件发生的时候,就会被当前设置全局捕获的元素所触发。
*
* */
var getDiv = document.getElementsByTagName('div')[0];
getDiv.onmousedown = function (ev) {
var ev = ev || event;
var disX = ev.clientX - this.offsetLeft;
var disY = ev.clientY - this.offsetTop;
if(getDiv.setCapture){
getDiv.setCapture();
}
document.onmousemove = function (ev) {
var ev = ev || event;
getDiv.style.left = ev.clientX - disX + 'px';
getDiv.style.top = ev.clientY - disY + 'px';
}
document.onmouseup = function () {
//释放全局捕获
if(getDiv.releaseCapture){
getDiv.releaseCapture();
}
document.onmousemove = document.onmouseup = null;
}
return false;
}
拖拽的封装
function drag(obj){
obj.onmousedown = function (ev) {
var ev = ev || event;
var disX = ev.clientX - this.offsetLeft;
var disY = ev.clientY - this.offsetTop;
if ( obj.setCapture ) {
obj.setCapture();
}
document.onmousemove = function (ev) {
var ev = ev || event;
var L = ev.clientX - disX;
var T = ev.clientY -disY;
if(L<0){
L=0;
}else if(L>document.documentElement.clientWidth-obj.offsetWidth){
//文档元素的宽度减去元素自身的宽度
L = document.documentElement.clientWidth-obj.offsetWidth;
}
if(T<0){
T=0;
}else if(T>document.documentElement.clientHeight-obj.offsetTop){
//文档元素的宽度减去元素自身的宽度
T = document.documentElement.clientHeight-obj.offsetHeight;
}
obj.style.left =L + 'px';
obj.style.top = T + 'px';
}
document.onmouseup = function () {
document.onmousemove = document.onmouseup = null;
if ( obj.releaseCapture ) {
obj.releaseCapture();
}
}
return false;
}
}
碰撞检测
使用排除法
拖拽改变层大小
滚动条的模拟和扩展运用
鼠标滚轮
//在chrome与ie中,事件是 onmousewheel
//FF不执行,会当作添加的一个自定义属性。
oDiv.onmousewheel = function(){
alert('hello');
};
oDiv.addEventListener('DOMMouseScroll',function(){//FF必须使用时间的第二种绑定形式。第二种绑定形式有兼容性问题。绑定一个不存在的事件不会有问题
alert('firefox');
},false);
//direction
// chrome&&IE
alert(ev.wheelDelta); //上+,下-
// FF
alert(ev.detail);//上-,下+;在其他浏览器上存在这个属性,显示值是为0
//和运算符优先级有关系
dec = ev.wheelDelta>0?true:false;
//阻止事件默认行为,阻止的是第一种绑定事件行为
return false;
//addEventListener
ev.preventDefault();
//attachEvent 使用的还是return false;
cookie
/*
*
* cookie 存储数据 //可以长时间存放数据
*
* 变量只能在开启浏览器中存在
*
* 1.不同浏览器 存放cookie位置不一样,不能够通用
* 2.cookie的存储是以域名进行区分
* 3. cookie的数据可以设置名字
* 4.一个域名下存放的cookie的个数是有限制的,不同的浏览器存放的个数不一样
* 5.每个cookie存放的内容大小存在限制,不同浏览器存放大小限制不同
* */
//一些浏览器不允许本地操作cookie
//我们通过document.cookie来获取当前网站下的cookie的时候,得到的是字符串形式的值,它包含了当前网站下所有的cookie
// 如果想长时间存放一个cookie,需要在设置cookie的时候,设置过期时间,时间过期,会自动销毁。cookie默认是临时存储。关闭浏览器进程,自动销毁。
//过期后面跟上的是时间,时间必须得是日期对象字符串形式[字符串格式的时间]
var oDate = new Date();
oDate.setDate(oDate.getDate()+5);//设置一个月的某一天
console.log(oDate);
console.log( typeof oDate.toGMTString());//提供的一个方法,可以修改为字符串
document.cookie = 'username=leo;expires ='+oDate.toGMTString();//往访问者电脑里存储一个cookie 'name=value;'
document.cookie = 'age=32';
//chrome不允许本地形式操作cookie
//读取
alert(document.cookie);//username=leo; age=32
//存储特殊字符的时候,会出现一些问题。内容最好编码存放 encodeURI
//如果存储中文,会出现日期不正确的行为, 所以最好先编码。。
console.log(encodeURI('你好'));//出现%什么什么
console.log(decodeURI('%E4%BD%A0%E5%A5%BD'));//解码
//如何获取想要的?
function setCookie(key,value,t){
var oDate = new Date();
oDate.setDate(oDate.getDate()+t);
document.cookie = key+'='+encodeURI(value)+';expires='+oDate.toGMTString();
}
function getCookie(key){
var arr1 = document.cookie.split(';');
for(var i =0;i