BOM

BOM

浏览器对象模型。
与浏览器窗口进行交互的对象,核心对象是 window。

一、页面事件

事件事件名称
☆ 表单提交onsubmit
☆ 页面加载onload
卸载页面onunload
☆ 内容发生改变onchange
☆ 窗口大小改变onresize
滚动条移动onscroll

1、窗口加载事件

window.onload 是窗口(页面)加载事件,当文档内容完全加载完成会触发该事件(包括图像、脚本文件、CSS等),才调用处理程序。
window.onload = function(){}
或者 window.addEventListener(‘load’,function(){});

注:
1、window.onload 传统注册事件方式只能写一次,有多个会以最后一个为准。
2、addEventListener 则没有限制

document.addEventListener(‘DOMContentLoaded’,function(){})
DOMContentLoaded 事件触发时,仅当 DOM 加载完成,不包括样式表、图片、flash等。
如果页面图片很多,从用户访问到 load 触发需要较长时间,而 DOMContentLoaded 则不会。

window.addEventListener('load', function() {
	var btn = document.querySelector('button');
    btn.addEventListener('click', function() {
    	alert('点击我');
	});
});
window.addEventListener('load', function() {
	alert(22);
});
document.addEventListener('DOMContentLoaded', function() {
	alert(33);
});

2、定时器

setTimeout() 或者 setInterval()

setTimeout(调用函数,延迟毫秒数); 只调用一次。
1、调用函数可以直接写函数,或者写函数名或者采取字符串**函数名()**三种形式。
2、一般会给定时器赋值一个标识符(也就是命名)。
var timer = setTimeout(fn,1000);
3、清除定时器
clearTimeout(timerId);
timerId 就是定时器的标识符。

setInterval(调用函数,间隔毫秒数); 重复调用,每隔一段时间调用一次
清除定时器:clearInterval(timesId);

注:
给定时器赋值标识符时,不要在调用定时器的函数里面声明,要在函数外面声明(全局变量);不然在清除函数时,undefined标识符。

var begin = document.querySelector('.begin');
var stop = document.querySelector('.stop');
var timer = null; // 全局变量  null是一个空对象
begin.addEventListener('click', function() {
	timer = setInterval(function() {
    	console.log('ni hao ma');
	}, 1000);
});
stop.addEventListener('click', function() {
	clearInterval(timer);
});

错误:

var begin = document.querySelector('.begin');
var stop = document.querySelector('.stop');

begin.addEventListener('click', function() { 
	var timer = setInterval(function() { //在函数内部声明,局部变量
    	console.log('ni hao ma');
	}, 1000);
});
stop.addEventListener('click', function() {
	clearInterval(timer);  //timer undefined
});

3、onSubmit、onReset

如果这两个事件中调用的是自定义函数名,则必须在函数名前面加 return 语句,否则,无论返回的值是 true 还是 false ,当前事件返回的值一律都是 true 。

二、JS执行机制

JS 将代码分为同步任务和异步任务。
同步任务:在主线程上执行,形成一个执行栈。
异步任务:将相关函数(回调函数)添加到任务队列中。
①普通事件,如click、resize等
②资源加载,如load、error等
③定时器,包括setInterval、setTimeout 等

执行顺序:
①先执行执行栈中的同步任务
②将异步任务放入异步进程处理,等待操作指令
③完成操作(触发)后,将异步任务放入任务队列中(不执行)
④一旦执行栈中所有的同步任务执行完毕,系统就会依次读取任务队列中的异步任务,于是被读取的异步任务结束等待状态,进入执行栈,开始执行。

在这里插入图片描述

三、location对象

location 属性用于获取或者窗体的URL,并且可以用于解析URL;返回的是一个对象,所以也可称为location对象。

URL的一般语法格式为:
protocol://host[:port]/path/[?query]#fragment
http://www.itcast.cn/index.html?name=andy&age=18#link

组成说明
protocol通信协议 常用的http,ftp,maito等
host主机(域名)
port端口号
path路径
query参数。键值对的形式,通过&符号分隔开
fragment片段,链接,锚点
location对象属性返回值
☆location.href获取或者设置整个URL
location.host返回主机(域名)
location.port返回端口号
location.pathname返回路径
☆location.search返回参数
location.hash返回片段,链接,锚点
location对象方法返回值
location.assign()跟 href 一样,可以跳转页面(记录浏览历史,可以后退)
location.replace()替换当前页面 (不记录历史,不能后退)
location.reload()重新加载页面 (相当于刷新),参数为true 强制刷新

1、获取URL参数

点提交键后弹到另一页面,将输入的名字显示在另一页面。
login.htm

<form action="index.html">
	用户名: <input type="text" name="uname">
    <input type="submit" value="登录">
</form>

点击跳转后,跳到index.html

<div></div>
<script>
	console.log(location.search); // ?uname=andy
    // 1.先去掉?  substr('起始的位置',截取几个字符);
    var params = location.search.substr(1); // uname=andy
    console.log(params);
    // 2. 利用=把字符串分割为数组 split('=');
    var arr = params.split('=');
    console.log(arr); // ["uname", "ANDY"]
    var div = document.querySelector('div');
    // 3.把数据写入div中
    div.innerHTML = arr[1] + '欢迎您';
</script>

总结: 跳转到另一页面时,会产生对应的参数。所以我们要用到该参数,就利用 location.search来获取参数,再利用 substr() 截掉符号,再用 split(‘分隔符’) 将字符串转换成数组。

四、navigator

navigator 对象包含有关浏览器的信息,他有很多属性,最常用的是userAgent,该属性可以返回由客户机发送服务器的 user-agent 头部的值。
判断用户在哪个终端打开页面,代码实现:

if((navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i))) {
	window.location.href = "../H5/index.html"; //手机
}else{
	window.location.href = "index.html"; //电脑
}

五、history

与浏览器历史记录进行交互,该对象包含用户(在浏览器窗口中)访问过的URL。

history对象方法作用
back()后退
forward()前进
go(参数)前进后退。 1:前进一个页面;-1:后退一个页面

六、PC端网页特效

1、offset

偏移量,可以动态得到元素的位置(偏移),大小等。
①获得元素距离带有定位父元素的位置
②获得元素自身的大小(宽度高度)
③返回的数值不带单位

offset对象属性作用
element.offsetParent返回作为该元素带有定位的父级元素,没有则返回body
element.offsetTop返回相对于该元素带有定位的父级元素上方的偏移;没有则以body为准
element.offsetLeft返回相对于该元素带有定位的父级元素左边的偏移;没有则以body为准
element.offsetWidth返回自身包括 padding、边框、内容区的宽度
element.offsetHeight返回自身包括 padding、边框、内容区的高度

2、offset 与 style 的区别:

offsetstyle
可以得到任意样式表中的样式值只能得到行内样式表中的样式值
获得的数值没有单位获得带单位的字符串
offsetWidth 包含padding、borderstyle.width 不包含padding和border
offsetWidth 等属性是只读属性,不可赋值style.width 是可读属性,可获取也可赋值
获取元素大小位置改变元素大小位置

3、鼠标在盒子内位置

①鼠标在页面的位置(e.pageX,e.pageY)
②盒子距离页面的位置(box.offsetLeft,box.offsetTop)
③相减便可得到鼠标在盒子内的位置

4、元素可视区client

client 翻译过来就是客户端

offset属性作用
element.clientTop返回元素上边框的大小
element.clientLeft返回元素左边框的大小
element.clientWidth返回自身包括 padding、内容区的宽度,不含边框大小,返回的数值不带单位
element.clientHeight返回自身包括 padding、内容区的高度,不含边框大小,返回的数值不带单位

5、立即执行函数

普通函数:声明、调用
function fn(){}、fn(); 或者匿名函数 function(){}

立即执行函数:不需要调用,立马能够自己执行的函数
(function(){})()
或者(function(){}())

主要作用:创建了一个独立的作用域,避免了命名冲突。

// 1.(function(){})() 将最后一个小括号当做调用函数,里面也可放实参
(function(a){
	console.log(a);
})(1);

// 2.(function(a){
	console.log(a);
}(1));

6、scroll

scrollt属性作用
element.scrollTop返回被卷到上边的内容最顶部距离上边框下沿的距离,不带单位
element.scrollLeft返回被卷到左边的内容最左侧距离左边框右沿的距离,不带单位
element.scrollWidth返回自身内容实际的宽度,不含边框,不带单位
element.scrollHeight返回自身内容实际的高度,不含边框,不带单位
页面被卷去的部分

页面被卷去头部:window.pageYOffset
页面被卷去左侧:window.pageXOffset

7、offset、client、scroll 区别

三大系列作用
element.offsetWidth返回自身包括padding、边框、内容区的宽度
element.clientWidth返回自身包括padding、内容区的宽度,不包含边框
element.scrollWidth返回自身内容实际的宽度,不包含边框

主要用法:
1、offset 系列经常用于获得元素位置 offsetLeft、offsetTop
2、client 系列经常用于获取元素大小 clientWidth、clientHeight
3、scroll 系列经常用于获取滚动距离 scrollTop、scrollLeft

七、本地存储

1、数据存储在用户浏览器中
2、设置、读取方便,甚至页面刷新不丢失数据
3、容量较大,sessionStorage约5M、localStorage约20M
4、只能存储字符串,可以将对象JSON.stringify()编码后存储
5、本地存储里面只能存储字符串的数据格式,可以把数组对象转换为字符串格式 JSON.stringify()
6、获取本地存储的数据,需要把里面的字符串数据转换为对象格式 JSON.parse()

var todolist = [{
	title: '我今天吃八个馒头',
    done: false
}, {
    title: '我今天学习jq',
    done: false
}];
 // 1. 本地存储里面只能存储字符串的数据格式 把我们的数组对象转换为字符串格式 JSON.stringify()
localStorage.setItem("todo", JSON.stringify(todolist));
var data = localStorage.getItem("todo");
// 2. 获取本地存储的数据 我们需要把里面的字符串数据转换为 对象格式 JSON.parse()
data = JSON.parse(data);
console.log(data[0].title);  // 我今天吃八个馒头

1、sessionStorage

1、生命周期为关闭浏览器窗口
2、在同一个窗口(页面)下,数据可以共享
3、以键值对的形式存储使用
存储数据:sessionStorage.setItem(key,val)
获取数据:sessionStorage.getItem(key)
删除数据:sessionStorage.removeItem(key)
清空数据:sessionStorage.clear()

2、loaclStorage

1、生命周期永久生效,除非手动删除,否则页面关闭依旧存在
2、可以多窗口(页面)共享(同一浏览器可以共享)
3、以键值对的形式存储使用
存储数据:loaclStorage.setItem(key,val)
获取数据:loaclStorage.getItem(key)
删除数据:loaclStorage.removeItem(key)
清空数据:loaclStorage.clear()

03-15
### 关于 Byte Order Mark (BOM) 的技术概念 Byte Order Mark (BOM),即字节顺序标记,是一种用于表示Unicode编码文件中字节顺序的特殊字符。它通常出现在文件开头,帮助解析器识别文件使用的具体Unicode编码形式(如 UTF-8、UTF-16 或 UTF-32)。尽管 BOM 对某些程序透明无影响,但在处理文本时可能会引发兼容性问题。 #### BOM 的作用与常见编码关联 在 Unicode 编码标准下,BOM 被定义为 U+FEFF 字符,在不同编码中的表现如下: - **UTF-8**: 表现为三个字节序列 `EF BB BF`。 - **UTF-16 (BE)**: 表现为两个字节序列 `FE FF`。 - **UTF-16 (LE)**: 表现为两个字节序列 `FF FE`[^4]。 对于 Python 来说,默认支持多种编码方式,并允许开发者通过字符串指定具体的编码名称来读取或写入带 BOM 文件的内容[^1]。 #### 如何处理带有 BOM 的文本文件? 当遇到含有 BOM 的文件时,可以采用以下几种方法进行处理: ##### 方法一:使用 Python 自动移除 BOM Python 提供了内置的支持机制,能够自动检测并跳过 BOM 序列。例如,可以通过设置参数 `'utf-8-sig'` 实现这一功能: ```python with open('file_with_bom.txt', mode='r', encoding='utf-8-sig') as file: content = file.read() ``` 上述代码片段会先尝试寻找并去除可能存在的 BOM 标记后再继续正常操作数据流。 ##### 方法二:手动删除 BOM 如果需要更精细控制或者不希望依赖特定库函数,则可以选择手工实现逻辑清除掉这些额外标志位。下面展示了一个简单的例子说明如何做到这一点: ```python def remove_bom(file_path): import codecs bom_bytes = b'\xef\xbb\xbf' with open(file_path, 'rb') as f: raw_data = f.read(len(bom_bytes)) if raw_data != bom_bytes: raise ValueError("File does not start with expected BOM.") # Continue reading rest of the file after skipping over BOM bytes. with open(file_path, 'r', newline='', encoding='utf-8') as cleaned_file: return cleaned_file.readlines() lines_without_bom = remove_bom('./example.txt') print(lines_without_bom[:5]) # Print first five lines post-BOM removal process. ``` 此脚本首先验证目标文档确实存在预期类型的 BOM;随后才执行进一步的动作以忽略该部分而专注于实际有效载荷的数据上[^2]。 #### 总结 虽然 BOM 可以为跨平台间交换提供便利条件,但也增加了复杂度以及潜在错误风险。因此了解其工作原理及其应对策略是非常重要的技能之一。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值