一、js的三大组成部分
- ECMAScript + BOM + DOM
- BOM:browser object model 浏览器对象模型
- DOM:document object model 文档对象模型
- BOM 浏览器对象模型
- 每个浏览器窗口都是一个window对象
- var window = new window() 在每一次打开一个页面时就默认创建了一个window对象,网页的根对象
- 每一个页面不共享window
- 每一次创建的全局变量和函数都是属于window对象的属性和方法
- BOM常见属性
navigator 一个对象,系统的构造函数
- navigator.userAgent 会详细显示浏览器的版本信息,用于处理兼容问题
location 地址栏
- href 整个网址, 获取或设置新的地址
- host 域名+端口号
- hostname 域名
- pathname 路径
- port 端口号
- protocol 协议 、http 和 https
- search 问号后面的一串, 表单提交的数据
- hash #号后面的一串,通常指的是锚点
- assign() 也是设置新的地址,是一个方法,打开一个新的页面
- replace() 替换新的地址---替换了所有的历史记录--不会被历史记录
- reload() 刷新页面
history 历史记录
- length 在同一个窗口打开过几个页面
- forward() 前进
- back() 后退
- go(1 / -1)可退可进 document 文档 DOM实际上是BOM的一部分
- BOM的常见方法
- open() 打开一个新的浏览器窗口 --- 网页重定向(默认会被浏览器拦截)
- close() 关闭本窗口 没有参数
- 例子
setTimeout(function(){
//打开一个新的窗口 --- 网页重定向(默认被拦截了)
// open("http://www.baidu.com")
//关闭一个浏览器窗口
close()
},2000)
- BOM的事件
- load 事件: 等待页面资源加载完毕之后执行
<script>
window.onload = function(){
var oDiv = document.getElementById("a");
console.log(oDiv);
}
</script>
- scroll 事件:当页面滚动时触发这个事件 --- 高频率触发事件
window.onscroll = function(){
console.log(123);
}
- resize 窗口大小发生改变时触发此事件
var t;
window.onresize = function(){
// 高频率触发事件的解决方式 ---- 加一个延时器
clearTimeout(t);
t = setTimeout(function(){
console.log("窗口发生变化")
},300)
}
- blur事件
window.onblur = function(){
console.log("失去焦点");
}
- focus事件
window.onfocus = function(){
console.log("获得焦点");
}
- 移动端的适配
- 移动端适配:也就是动态设置根元素的字体大小,然后使用rem做单位
html{
/* 1rem = 100px */
/* rem是相对于根元素变化的单位。 */
/* 移动端适配:也就是动态设置根元素的字体大小,然后使用rem做单位 */
font-size: calc(100vw / 7.5);
}
body{
/* 继承字体大小,不至于一上来字体就很大 */
font-size: .24rem;
}
2.淘宝的适配:
// 移动端适配,淘宝适配,使用注意事项
// 1 不设置meta 禁止缩放那一段 --- js里面有设置
// 2 计算 1rem = 75px
- 函数的防抖和节流
- onscroll / onresize 是高频率触发事件
- 函数会反复的执行,一毫秒之内可能会执行多次,浏览器的性能可能会下降
- 函数的防抖和节流用来解决高频率触发事件
- 函数防抖(debounce):触发高频事件后n秒内函数只会执行一次,如果n秒之内高频事件再次被触发,则重新计算时间 --- 每次点击就重做
- 函数的节流(throttle):高频事件触发,但在n秒内只会执行一次,所以节流会稀释函数的执行频率 --- 点击一次,就把事情干完,没干完之前点击没用
// 函数防抖例子:
var t;
window.onscroll = function(){
clearTimeout(t);
t = setTimeout(function(){
console.log(888);
},300)
}
// 函数节流例子:
//
var oBtn = document.getElementById("btn");
oBtn.onclick = function(){
oBtn.disable = true;
var count = 6;
oBtn.innerHTML = count + "秒之后才能再次点击"
var t = setInterval(function(){
count--;
oBtn.innerHTML = count + "秒之后才能再次点击"
if(count <= 0){
clearInterval(t);
oBtn.disable = false;
oBtn.innerHTML = "获取验证码"
}
},1000)
}
给多个元素绑定事件
<p class="a">1</p>
<p class="a">2</p>
<p class="a">3</p>
<p class="a">4</p>
<script>
var oPs = document.getElementsByClassName("a")
// 循环
for(var i = 0; i< oPs.length;i++){
oPs[i].onclick = function(){
// console.log(666);
// i打印为4,因为循环和绑定事件是同步,函数是异步,同步先执行此时i已经循环结束变为4
// console.log(i);
// this 在事件处理函数中使用,代表点击的那个对象
console.log(this);
}
}
</script>