关于bom:字节顺序标记

UTF-32 和 UTF-16 的一个 Code Unit,须要转换成多个字节的序列,因而存在字节序的问题。 能够在 UTF-32 或 UTF-16 编码的字节流结尾,增加字节程序标记 (byte-order mark, BOM),来标识字节序。 BOM 是 U+FEFF 字符的名称。编码时,将 U+FEFF 编码在字节流的结尾。解码时,读取前几个字节,就晓得编码时的字节序了。 例如 UTF-16 的大端序,U+FEFF 会被编码成 0xFEFF,而小端序则会编码成 0xFFFE。这样依据结尾是 0xFEFF 还是 0xFFFE,就晓得编码时应用的大端序还是小端序了。 同理 UTF-32 的大端序,U+FEFF 会被编码成 0x00 00 FE FF,而小端序则会编码成 0xFF FE 00 00。这样依据结尾,不光能辨别出字节序,还能辨别出是 UTF-32 还是 UTF-16。 UTF-8 的一个 Code Unit 只须要转换为 1 个字节,因而不存在字节序的问题,也就不须要 BOM。而且 0xFEFF 或 0xFFFE 字节序列,在 UTF-8 中都是不可能呈现的。所以依据 BOM,也能辨别出编码方式是不是 UTF-8。 如果硬要给 UTF-8 加 BOM,那就是将 0xFEFF (0b1111 1110 1111 1111) 进行 UTF-8 编码,失去 0xEF BB BF (0b1110 1111 1011 1011 1011 1111),放在字节流的最后面。 ...

September 18, 2022 · 1 min · jiezi

关于bom:windowlocation属性

用该属性获取页面 URL 地址: window.location 对象所蕴含的属性

March 22, 2021 · 1 min · jiezi

关于bom:网页性能错误监控

1、Javascript组成包含以下3个局部: ECMAScript(外围)形容了JS的语法和根本对象。文档对象模型 (DOM)解决网页内容的办法和接口浏览器对象模型(BOM)与浏览器交互的办法和接口(1) DOM 是 W3C 的规范; [所有浏览器公共恪守的规范](2) BOM 是 各个浏览器厂商依据 DOM在各自浏览器上的实现;[体现为不同浏览器定义有差异,实现形式不同](3) window 是 BOM 对象,而非 js 对象;javacsript是通过拜访BOM(Browser Object Model)对象来拜访、管制、批改客户端(浏览器) 如图所示(截图W3CSchool目录): 2、DOM事件流包含三个阶段(1). 事件捕捉阶段 : 当事件产生时,首先产生的是事件捕捉,为父元素截获事件提供了机会。它认为当某个事件产生时,父元素应该更早接管到事件,具体元素则最初接管到事件。(2). 处于指标阶段 : 事件到了具体元素时,在具体元素上产生,并且被看成冒泡阶段的一部分。随后,冒泡阶段产生,事件开始冒泡,而后逐级流传到较为不具体的节点。(3). 事件冒泡阶段 : 事件冒泡过程,是能够被阻止的。避免事件冒泡而带来不必要的谬误和困扰。这个办法就是: stopPropagation()。 当然,因为时代更迭,事件冒泡形式更胜一筹。所以释怀的应用事件冒泡,有非凡须要再应用事件捕捉即可。 <div id="test"> <button onclick="alert(22)">DOM事件流</button></div>var el = document.getElementById('test')el.addEventListener('click', function (e) { alert(11)}, true)el.addEventListener('click', function (e) { alert(33)}, false)运行后果:网页先后三次弹出警示框,程序为:11 --> 22 --> 33如图所示(图片源于网络,若侵权请告知): 3、网页性能参数 performance API 如图所示(图片源于网络,若侵权请告知): 4、网页谬误监控 5、网页性能、谬误监控代码monitor.js:需放到head标签先于业务代码执行 // 保留监控信息let monitor = { performance: {}, // 性能监控 resources: {}, // 资源监控 errors: [], // 谬误监控 user: { // Screen 对象蕴含无关客户端显示屏幕的信息。 screen: screen.width, // 屏幕的总宽度 height: screen.height, // Navigator 对象蕴含无关浏览器的信息 platform: navigator.platform, // 运行浏览器的操作系统 userAgent: navigator.userAgent, // 浏览器用于 HTTP 申请的UA头的值 language: navigator.language // 浏览器 UI 的语言 }}// 性能监控const getPerformance = () => { if (!window.performance) return const timing = window.performance.timing const performance = { redirect: timing.redirectEnd - timing.redirectStart, // 最初一个HTTP重定向实现时 - 第一个HTTP重定向开始时 whiteScreen: timing.domLoading - timing.navigationStart, // 以后网页DOM构造开始解析时 - 上一个文档卸载(unload)完结时 dom: timing.domComplete - timing.domLoading, // 以后文档解析实现 - 以后网页DOM构造开始解析时 load: timing.loadEventEnd - timing.navigationStart, // 加载事件实现时 - 上一个文档卸载(unload)完结时 unload: timing.unloadEventEnd - timing.unloadEventStart, // unload事件处理实现时 - unload事件抛出时 request: timing.responseEnd - timing.requestStart, // 浏览器从服务器收到(或从本地缓存读取,或从本地资源读取)最初一个字节时 - 浏览器向服务器收回HTTP申请时(或开始读取本地缓存时) time: new Date().getTime() } return performance}// 资源监控const getResources = () => { if (!window.performance) return const data = window.performance.getEntriesByType('resource') const resource = { xmlhttprequest: [], css: [], other: [], script: [], img: [], link: [], fetch: [], time: new Date().getTime() } data.forEach(item => { const arr = resource[item.initiatorType] arr && arr.push({ name: item.name, // 资源URL duration: item.duration.toFixed(2), // fetch资源耗时 size: item.transferSize, // fetch获取资源的大小,遇到本地缓存资源或跨域资源时返回0 protocol: item.nextHopProtocol // 获取资源的网络协议 }) }) return resource}// 谬误监控addEventListener('error', e => { const target = e.target console.log(target); if (target != window) { monitor.errors.push({ type: target.localName, url: target.src || target.href, msg: (target.src || target.href) + 'is load error', time: new Date().getTime() }) } console.log('所有的错误信息--捕捉JS执行时谬误、资源加载谬误'); console.log(monitor.errors);}, true)window.onerror = function (msg, url, row, col, error) { monitor.errors.push({ type: 'javascript', row: row, col: col, msg: error && error.stack ? error.stack : msg, url: url, time: new Date().getTime() }) console.log('所有的错误信息--捕捉JS执行时谬误'); console.log(monitor.errors);}addEventListener('unhandledrejection', e => { monitor.errors.push({ type: 'promise', msg: (e.reason && e.reason.msg) || e.reason || '', time: new Date().getTime() }) console.log('所有的错误信息--捕捉Promise异样未处理错误'); console.log(monitor.errors);})window.onload = () => { if (window.requestIdleCallback) { // requestIdleCallback办法 将在浏览器的闲暇时段内调用的函数排队 window.requestIdleCallback(() => { monitor.performance = getPerformance() monitor.resources = getResources() console.log('页面性能信息'); console.log(monitor.performance) console.log('页面资源信息'); console.log(monitor.resources) }) } else { setTimeout(() => { monitor.performance = getPerformance() monitor.resources = getResources() console.log('页面性能信息'); console.log(monitor.performance) console.log('页面资源信息'); console.log(monitor.resources) }, 0) }}

December 3, 2020 · 2 min · jiezi

前端培训中级阶段4-BOM-浏览器对象模型20190704期

前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 前面我们已经基本掌握常规的语法语义,以及基本的使用方法。接下来我们讲深入进去了解其中内在的原理。 上一节,我们聊了聊 DOM对象。这节我们来了解一下 BOM对象(浏览器对象)。BOM对象其实就是我们的 window对象 我们要讲什么?BOM对象是什么?BOM对象上的属性BOM对象是什么?BOM(Browser Object Model)中文浏览器对象模型。表示一个包含 DOM文档的窗口。提供了与浏览器窗口进行交互的对象标签之间不会共享。window 对象既是ECMAScript规范中的Global对象,也是BOM中的顶级对象; BOM对象上的属性document指向窗口中载入的 DOM文档(document.defaultView 属性可以获取指定文档所在窗口。) console提供了对浏览器调试控制台的访问。 低版本IE米有打印的对象,会造成内存泄露。线上尽可能不使用。historyhistory对象的引用。用于描述当前浏览器的历史记录。只提供了有限的 api。不提供访问,修改等操作。 length 表示当前历史记录个数back() 后退forward() 前进go() 0 1 -1 等参数。location当前加载页面的url、端口、协议等信息。还可以对当前的窗口进行导航。 href 获取或者设置,网页的urlreload() true为放弃缓存刷新,默认为普通属性replace() 替换,不会再history留下记录assign() 等价于直接设置hrefnavigator返回当前浏览器相关信息。包括浏览器的名称、版本、语言、系统平台、用户特性字符串等信息。 screen返回客户端屏幕参数。 frames页面中其他 iframe 的引用 其他常用devicePixelRatio返回当前显示器的物理像素和设备独立像素的比例。fullScreen表示窗口是否以全屏显示。localStorage&sessionStorage本地存储opener返回对打开当前窗口的那个窗口的引用(open打开页面)performance 检测网页加载速度微信公众号:前端linong 初级阶段文章目录前端培训-初级阶段(17) - 数据存储(cookie、session、stroage)前端培训-初级阶段(13) - 正则表达式前端培训-初级阶段(13) - 类、模块、继承前端培训-初级阶段(13) - ECMAScript (内置对象、函数)前端培训-初级阶段(13) - ECMAScript (语法、变量、值、类型、运算符、语句)前端培训-初级阶段(13、18)前端培训-初级阶段(9 -12)前端培训-初级阶段(5 - 8)前端培训-初级阶段(1 - 4)中级阶段文章目录前端培训-中级阶段(2) - 事件(event) 事件冒泡、捕获 - (2019-06-20期)前端培训-中级阶段(3) - DOM 文档对象模型(2019-06-27期)

June 24, 2019 · 1 min · jiezi

JavaScript高级程序设计第3版读书笔记-第8章-BOM

ECMAScript是JavaScript的核心,但如果要在Web中使用JavaScript,那么BOM(浏览器对象模型)则无疑才是真正的核心。W3C为了把浏览器中JavaScript最基本的部分标准化,已经将BOM的主要方面纳入了HTML5规范中window对象BOM 的核心对是window,它表示浏览器的一个实例。在浏览器中window对象既是通过JavaScript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象,因此有权访问parseInt()等方法全局作用域所有在全局作用域中声明的变量、函数都会变成window对象的属性和方法。定义全局变量与直接在window对象上定义属性还是有一点差别:全局变量不能通过delete操作符删除,而直接定义在window对象上的属性可以var age = 29;window.color = "red";// 在IE < 9 时抛出错误,在其他浏览器里返回 falsedelete window.age;// 在IE < 9 时抛出错误,在其他浏览器里返回 truedelete window.color;console.log(window.age); // 29console.log(window.color); // undefined全局环境下使用var语句添加的window属性有一个名为[[Configruable]]的特性,这个特性的值被设置为false,因此不可通过delete删除。IE8及更早版本在遇到使用delete删除window属性的语句时,不管该属性最初如何创建的,都会抛出错误,以示警告。尝试访问未声明的属性会抛出错误,但是通过查询window对象,可以知道某个可能未声明的变量是否存在// 这里会抛出错误 oldValue 未定义var newValue = oldValue;// 这里不会抛出错误,因为这是一次属性查询// newValue的值是 undefinedvar newValue = window.oldValue;窗口关系及框架如果页面中包含框架,则每个框架都拥有自己的window对象,并且保存在frames集合中。在frames集合中,可以通过数值索引(从0开始,从左至右,从上到下)或者框架名称来访问相应的window对象。每个window对象都有一个name属性,其中包含框架的名称。<html> <head> <title> Frameset Example</title> </head> <frameset rows="160, *"> <frame src="frame.htm" name="topFrame"> <frameset cols="50%, 50%"> <frame src="anotherframe.htm" name="leftFrame"> <frame src="yetanotherframe.htm" name="rightFrame"> </frameset> </frameset></html>可以通过window.frames[0]或者window.frames["topFrame"]来引用上方的框架,不过最好使用top而非window。例如 top.frames[0]top对象始终指向最高(最外层)的框架,也就是浏览器窗口。与top相对的另一个window对象是parent。parent(父)对象始终指向当前框架的直接上层框架。在某些情况下parent有可能等于top,但在没有框架的情况下,parent一定等于top。此时他们都是window窗口位置用来确定和修改window对象位置的属性和方法有很多。 IE, Safari, Opera, Chrome 都提供了screenLeft 和 screenTop属性,分别用于表示相对屏幕左边和上边的位置。Firefox 则在 screenX 和 screenY 属性中提供相同的窗口位置信息, Safari, Chrome也同时支持这两个属性。Opera虽然支持 screenX 和 screenY 属性,但与 screenLeft 和 screenTop 并不对应,因此建议大家不要在 Opera中使用。使用下列代码可以跨浏览器取得窗口左边和上边的位置// 确定 screenLeft 和 screenTop 属性是否存在// 存在,是在 IE, Safari, Opera, Chrome// 否则,是在 Firefox中var leftPos = (typeof window.screenLeft == "number") ? window.screenLeft : window.screenX;var topPos = (typeof window.screenTop == "number") ? window.screenTop : window.screenY;在IE Opera 中,返回的是页面到屏幕边缘的距离(不包括浏览器的工具栏等),而 Chrome Firefox Safari 返回的是浏览器到屏幕边缘的距离(包括浏览器的工具栏等)。更让人抓狂的是, Firefox Safari Chrome 始终返回页面中每个框架的 top.screenX top.screenY 值。即使在页面由于被设置了外边距发生偏移的情况下,相对于window对象使用top.screenX top.screenY每次也都会返回相同的值。而IE Opera则会给出框架相对于屏幕辩解的精确坐标值。最终结果是无法在跨浏览器的条件下取得窗口左边和上边的精确坐标值。使用moveTo() 和 moveBy()方法,倒是有可能将窗口的精确地移动到一个新位置。这两个方法都接受两个参数// 将窗口移动到屏幕左上角window.moveTo(0, 0);// 将窗口向下移动100像素window.moveBy(0, 100);// 将窗口移动到(200, 300)window.moveTo(200, 300);// 将窗口向左移动50像素window.moveBy(-50, 0);需要注意的是,这两个方法可能会被浏览器禁用;而且在Opera和IE7+中默认就是禁用的。这两个方法都不适用于框架,只能对最外层的window对象使用。窗口大小跨浏览器确定一个窗口的大小不是一件简单的事情。 ...

May 16, 2019 · 3 min · jiezi

BOM编程-cookie的赋值过期时间path路径封装以及与Storage的区别

cookie 不是window下面的属性,它是document下面的属性,cookie有一套专门的取值与赋值方法,与localStorage,sessionStorage不同特性cookie在document下面cookie可以设置一个时间自动去清除缓存,cookie如果不设置清除时间,则关闭浏览器自动清除。cookie它可以跨页面,但是不可以跨path路径(子路径可以取到父级路径的) ,前提是同域赋值新建一个文件夹,在文件夹下新建一个html页面 cookie3.html 和一个名为path2的文件夹在path2文件夹下新建 cookie4.html先看一下cookie: 赋值 // 普通赋值document.cookie = 'userName=Aihh' // 带过期时间 10s后清除cookievar d = new Date();d.setTime(Date.now() + 10*1000);document.cookie = 'userName=Aihh;Expires=' + d.toUTCString(); // 带访问路径document.cookie="age=18;path=/path2";注意: 设置过期时间使用的是0时区的时间,而我们北京时间是+8区的时间,所以这个时候要调用 toUTCString() 转换为标准时区的时间;path=/path2 设置只有在路径path2下面的网页才能访问(前提是同域),如果是 path=/ 则说明是根路径,任何同域页面都可以访问。赋值后打开 Application 查看 cookie 普通赋值 带过期时间,设置10s后过期 带路径,设置只有在路径path2下面的网页才能访问(前提是同域) 这个时候发现在 cookie3.html 找不到这个cookie 再打开path2下面的 cookie4.html ,就会看到这个cookie 封装cookie 属性和值是用 = 连接,属性之间用 ; 分隔,根据这个特点进行封装var CookieHelper = { addCookie: function (cookieName, cookieValue, exMinutes, cookiePath) { // 第三/四个参数,按需传参 var str = cookieName + "=" + cookieValue; if (arguments.length == 3) { let d = new Date(); d.setTime(Date.now() + exMinutes*60*1000); // 过期单位这里设置为分钟 str += ";Expires=" + d.toUTCString(); } if (arguments.length == 4) { str += ";path=" + cookiePath; } document.cookie = str; }, getCookie: function (cookieName) { var cookieArr = document.cookie.split(";"); for (let i in cookieArr) { var arr = cookieArr[i].split("="); if (arr[0].trim() == cookieName) { return arr[1]; } } }, removeCookie: function (cookieName) { document.cookie = cookieName + "= ;Expires=" + (new Date()).toUTCString(); }}与 localStorage,sessionStorage 的区别localStorage,sessionStorage在window下面, cookie在document下面localStorage要手动清除,sessionStorage关闭浏览器自动清除,而cookie可以设置一个时间自动去清除,cookie如果不设置清除时间,则关闭浏览器自动清除。localStorage可以跨同域页面,sessionStorage只能跨父子页面(通过 open() 打开的页面),cookie它可以跨页面,但是不可以跨path路径(子路径可以取到父级路径的) 。他们都不能跨域

April 30, 2019 · 1 min · jiezi