BOM和DOM(上)

js的组成部分

前面学习的部分是ECMAScript部分,都是基础语法部分。基础语法只是规定的代码如何写,并不能实现很多主流的操作,比如跳转页面,获取浏览器的尺寸等操作。再比如让HTML元素动起来。

所以需要学习BOM来操作浏览器。学习DOM来操作HTML标签。

BOM

BOM是三个单词的首拼--Browser Object Model,即浏览器对象模型。

既然是对象模型,那么所有内容,都是用对象来描述的。

BOM中最大的对象叫window,是浏览器窗口对象。他包含了很多浏览器的操作。

window对象中包含的对象

浏览器的信息

浏览器的名称、版本等信息。关于浏览器的信息,window交给了他的子对象navigator去记录。

console.log(navigator.appCodeName);// 返回浏览器的代码名

console.log(navigator.appName);// 返回浏览器的名称

console.log(navigator.appVersion);// 返回浏览器的平台和版本信息

console.log(navigator.cookieEnabled);// 返回指明浏览器是否启用cookie的布尔值

console.log(navigator.platform);// 返回运行浏览器的操作系统平台

console.log(navigator.userAgent);// 返回由客户机发送服务器的user-agent头部的值

结果:

浏览器信息

使用说明:其实navigator对象是属于window对象的,但是window是所有对象的顶级对象,所以通常在写的时候,可以省略掉window。

浏览器的历史记录

历史记录的操作是window的子对象history。可以操作网页的前进和后退。

history.back();# 返回到上一个页面,相当于浏览器的后退按钮

history.forward();# 前进到下一个页面(下一个页面必须是点击以后的页面),相当于浏览器的前进按钮

history.go()

浏览器的地址栏信息

浏览器的地址栏操作,window对象交给了自己的子对象location对象去处理。

console.log(location.hash);// 设置或返回从#开始的url --- 锚点

console.log(location.href);// 设置或返回完整的的url

console.log(location.search);// 设置或返回url中的参数部分

方法:

语法:

    location.assign("要跳转的地址");# 这个方法是设置要跳转的地址

    location.reload();# 重新加载本页面

    location.replace()# 使用新地址替换掉旧地址(跳转)

浏览器的弹出层

window.alert("恭喜你!");

window.prompt("请输入数字:",1);

window.confirm("你确定要删除吗?")

浏览器窗口尺寸

1.window.innerHeight - 浏览器窗口的高度

2.window.innerWidth - 浏览器窗口的宽度

var w=window.innerWidth;

console.log(w);

var h=window.innerHeight;

console.log(h);

说明:

1.这两个属性返回的单位是像素

2.这两个属性计算的范围包含滚动条的区域

浏览器的事件

onload事件:当网页中的所有资源都加在完成之后执行这个事件

window.onload=function(){

    console.log("当网页中所有资源加载完成才打印");

}

使用说明:通常是将script标签放到head标签中的时候使用。因为放在head中默认是获取不到body中的内容的,但是有了这个事件后,就可以了。

onscroll 滚动事件:当网页滚动条的位置发生改变的时候触发这个事件

window.onscroll=function() {

console.log('浏览器滚动了')

}

使用说明:浏览器要有滚动条才行。

浏览器窗口改变事件:resize

window.onresize=function(){

// 当浏览器的窗口大小发生改变的时候触发这个事件

}

浏览器滚动的距离

获取文档向下滚动的距离,以下两个都可以:

document.documentElement.scrollTop

document.body.scrollTop

window.onscroll=function() {

vart=document.documentElement.scrollTop;

console.log(t);

vart1=document.body.scrollTop;

console.log(t1);

}

使用说明:这两个的区别在于当前文档有没有doctype,有就用document.documentElement.scrollTop,没有就用document.body.scrollTop

获取页面向右滚动的距离:

1.document.body.scrollLeft

2.document.documentElement.scrollLeft

使用方式同上。

这两个方法在ie和edge下有兼容性问题。

使用兼容写法:

var t=document.documentElement.scrollTop||document.body.scrollTop;

var t=document.documentElement.scrollLeft||document.body.scrollLeft;

滚动距离可以赋值,如果给向上的滚动距离赋值为0,就实现了回到顶部的效果。但效果时瞬间返回,体验感不好。

思考:如果才能让回到顶部有动画的效果?

使用定时器。每隔一段时间让滚动距离减小。

<style>

#backTop{

display:none;

width:80px;

text-align:center;

height:30px;

line-height:30px;

border:3pxsolid#000;

position:fixed;

top:500px;

right:50px;

}

</style>

<body>

<divstyle="width: 20px;">

           一类是以机场为主导,通过与其他机场航空公司或者第三方合作的方式,为在本机场中转的旅客提供服务;第二类是以航司为主导,以代码共享、

           通程联运和合作联营的方式,在既定的中转机场,为旅客提供跨航司的行李直挂服务。

</div>

<spanid="backTop">

       回到顶部

</span>

</body>

<scripttype="text/javascript">

window.onscroll=function(){

vart=document.documentElement.scrollTop;

console.log(t);

if(t>=600){

backTop.style.display='block';

}else{

backTop.style.display='none';

       }

   }

varspeed=1;

backTop.onclick=function(){

vartt=document.documentElement.scrollTop;

setInterval(function(){

tt-=speed;

document.documentElement.scrollTop=tt;

},1);

   }

</script>

定时器

延迟执行:

vartimerId=setTimeout(function() {

console.log('我执行了')

},1000)

console.log(timerId)// 1

使用说明:第一个参数是要执行的函数,第二个参数延迟的时间(单位毫秒)。返回一个数字,表示当前页面中第几个定时器。

每间隔一段时间执行:

vartimerId=setInterval(function() {

console.log('我执行了')

},1000)

使用说明:第一个参数是要执行的函数,第二个参数是间隔的时间(单位毫秒)。返回一个数字,表示当前页面中第几个定时器。

关闭定时器:

定时器返回的数字,就是用来关闭定时器的

clearTimeout(timerId);// 关闭延迟执行的定时器

clearInterval(timerId);// 关闭间隔执行的定时器

使用说明:其实这两个方法可以混用。

vartimerId=setTimeout(function() {

console.log('倒计时定时器')

},1000)

// 关闭延迟执行定时器

clearInterval(timerId)

vartimerId2=setInterval(function() {

console.log('间隔定时器')

},1000)

// 关闭间隔定时器

clearTimeout(timerId2)

案例:让回到顶部有动画效果。(模拟京东顶部随着滚动条出现过程)

异步操作

异步和同步的概念

张三叫李四一起去吃饭,张三说他还有作业没做完,让李四先去,李四去吃饭,张三在写作业,这两个人做的事情不一样,但是在同一时间段内,两个人的事情在同时做,这就是异步。

张三叫李四一起去吃饭,张三说他还有作业没做完,让李四等一下,李四就等张三做完作业后两个人才一起去吃饭。这就是同步。

同步的操作需要等待,执行起来是有顺序可循的;异步的操作不需要等待,两件事情是同行进行的。

我们平常写的代码都是同步代码,定时器我们接触到的第一个异步代码。

<font color="red">js的异步操作,是在所有同步代码执行完成以后才执行异步代码</font>

一般情况代码是按顺序执行的,上一行代码执行结束之前,下一行代码一直在等待,这是同步机制

同步执行示意图

异步代码是等待同步代码都执行完成以后,才运行异步代码,如下图:

异步执行示意图

DOM

DOM的全拼是:Document Object Model,叫做文档对象模型,主要用于操作html文档。例如,改变标签的北京颜色,让标签移动产生动画。。。。

DOM中的顶级对象是document,言外之意,DOM其实是属于BOM的。

例如:

window.document.write();

window.document.bgColor="red";

获取元素

通过document获取节点

document.getElementById("标签id名");// 通过标签的id名获取标签

document.getElementsByTagName("标签名");// 通过标签名获取标签

document.getElementsByClassName("标签类名");// 通类名获取标签

document.getElementsByName("标签的name属性的值");// 通过标签的name属性获取标签

// 上述4种获取标签的方法,除了通过id可以准确获取到元素,别的方法都是只能获取到元素的集合(类数组)

使用css选择器获取元素:

documen.querySelector(css选择器);// 获取到匹配css的第一个元素

documen.querySelectorAll(css选择器);// 获取到匹配css的所有元素

通过id名直接获取到元素:

<div id="myid"class="box"name="mydiv">盒子1</div>

<script>

    console.log(myid);

</script>

效果图:

通过id名直接获取到元素

getElements和querySelectorAll获取到的都是伪数组,但是当遍历元素的时候,querySelectorAll可以使用forEach方法遍历,但是getElements不行,只能使用for来遍历。

获取元素的操作中,通过类名和通过css选择器获取元素的方式在ie中不兼容。

属性操作

自定义属性

元素.setAttribute(属性名,属性值)# 设置元素的属性

元素.getAttribute(属性名);# 获取元素属性

元素.removeAttribute(属性名);# 删除元素属性

元素自带属性

元素.属性名=值;

console.log(元素.属性名);

例:

btn.onclick=function(){

img.src='2.jpg';

}

内容操作

语法:

    元素.innerHTML# 代表元素中的所有内容(包含标签)

    元素.innerText# 代表元素中的文本内容

    表单元素.value

    # 单标签操作内容其实就是在操作元素的属性

例:

<body>

<divid="box"introduce="区域"><p>我是盒子</p></div>

</body>

<scripttype="text/javascript">

    document.getElementById("box").innerText="今天你要嫁给我";

    vartext=document.getElementById("box").innerText;

    document.write(text);

    document.getElementById("box").innerHTML="<a href='http://www.baidu.com'>百度</a>";

    varcontent=document.getElementById("box").innerHTML;

    console.log(content);

样式操作

元素.style.css属性名=css属性值;# 给标签设置样式

例:

<body>

<styletype="text/css">

    #box{

        width:100px;

        height:100px;

        background:#f00;

    }

</style>

    <inputtype="button"id="btn"value="走你">

    <divid="box"></div>

</body>

<scripttype="text/javascript">

    varn=0;

    document.getElementById("btn").onclick=function(){

        n+=100;

        document.getElementById("box").style.marginLeft=n+"px";

    }

</script>

html基本结构的操作:

1.document.body :body比较常用, 并且在页面中是唯一的, 因此可以使用document.body直接获取 

2.document.documentElement :  可以获取html元素及其所有内容

3.document.head : 可以直接获取head元素

4.document.title : 可以直接获取title的文本

元素类名操作

使用元素的className属性可以操作元素的类名

<body>

<divclass="box"></div>

<script>

vardiv=document.querySelector('div')

div.className='test'

console.log(div)// <div class="test"></div>

</script>

</body>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容

  • BOM / DOM(上) 今天开始我们开始使用 js 去操作浏览器和页面中的 html 元素了 BOM BOM(B...
    蜗牛的愿望正在缓冲中阅读 252评论 0 0
  • BOM&&DOM BOM的概念 提供了独立于页面内容而与浏览器进行交互的对象,其核心对象是window 在浏览器中...
    一二三四五_6ce3阅读 136评论 0 0
  • 什么是 BOM ? 1.浏览器对象模型 Browser Object Model 2.BOM的核心对象是windo...
    WeekOne阅读 411评论 0 2
  • BOM是浏览器对象模型,DOM是文档对象模型;前者是对浏览器本身进行操作,而后者是对浏览器(可看成容器)内的内容进...
    learninginto阅读 285评论 0 9
  • BOM(browser object model):浏览器对象模型 浏览器:windows对象 Window 对象...
    Zhao_XP阅读 305评论 0 0