• BOM / URL编码解码 / 浏览器存储


    BOM 浏览器对象模型

    BOM(Browser Object Model) 是指浏览器对象模型,是用于描述这种对象与对象之间层次关系的模型,浏览器对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构。BOM由多个对象组成,其中代表浏览器窗口的Window对象是BOM的顶层对象,其他对象都是该对象的子对象。

    window

    BOM 的核心是window对象,它表示浏览器的一个实例。在浏览器中,即是javascript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象,这就意味着在网页中定义的任意变量、函数、对象都是以window作为Global对象。

    所有在全局作用域中声明的变量、函数、对象都会作为window的属性和方法

    var age = 24;
    
    function printName(){
        console.log(age);
    }
    
    console.log(window.age);
    window.printName();
    

    window.onload 和 document.onDOMContentLoaded 有什么区别?

    两者的区别主要是触发的时机不同,DOMContentLoaded是在DOM树构建完成触发,而onload是在DOM树构建完成、外部的js、css、图片等资源都加载完成后再触发。即:

    • windo.onload:当页面完全加载后(包括所有图像,JavaScript文件,CSS文件等外部资源),就会触发window上面的load事件。
    • document.onDOMContentLoaded:当初始HTML文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像和子框架完成加载。

    从chrome浏览器的console调试台中的Network也可以看出
    DOMcontentLoaded(紫色线)一般比onload(红色线)的触发时间更早。

     
     

    window对象属性

    window.innerHeight属性,window.innerWidth属性

    这两个属性返回网页的CSS布局占据的浏览器窗口的高度和宽度,单位为像素。很显然,当用户放大网页的时候(比如将网页从100%的大小放大为200%),这两个属性会变小。

    注意,这两个属性值包括滚动条的高度和宽度。

    如何获取图片的真实宽高

    JavaScript 使用offsetWidth、offsetHeight获取图片宽高,但是这个宽高是渲染后的宽高,也就是css设置后的宽高

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>获取图片真实宽高 demo</title>
      <style media="screen">
        img {
           100px;
          height: 50px;
        }
      </style>
    </head>
    <body>
      <img id="imgg" src="https://www.google.com.hk/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png" alt="">
    </body>
    </html>
    <script>
        //通过offsetWidth、offsetHeigth获取图片高宽,这个不是真实的,是css这是之后的最后样式的高宽
        document.querySelector('img').onload = function(){
          console.log('offsetWidht:' + this.offsetWidth + 'px')
          console.log('offsetHeight:' + this.offsetHeight + 'px')
        }
    
        //通过img对象搭配onload获取原图片真实的高宽
        var img_url ='https://www.google.com.hk/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png'
        // 创建对象
        var img = new Image()
        // 改变图片的src
        img.src = img_url
        // 加载完成执行
        img.onload = function(){
        // 打印
        console.log('图片真实 '+img.width+', 图片真实height: '+img.height)
        }
      </script>
    

    获取图片真实宽高 demo
    页面console台的效果:

     

    如何获取元素的真实宽高

    • 利用页面元素宽高的element.offsetHeightelement.offsetWidth方法
    • 使用window.getComputedStyle().width/height,但是这个方法,没有包含border的宽度
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>获取元素的真实宽高Demo</title>
      <style>
        .box {
           500px;
          height: 600px;
          border: 2px solid black;
        }
      </style>
    </head>
    <body>
      <div class="box">Hello World</div>
    </body>
    </html>
    <script>
      // 利用页面元素宽高的`element.offsetHeight`和`element.offsetWidth`方法
      var realHeight = document.querySelector('.box').offsetHeight
      var realWidth = document.querySelector('.box').offsetWidth
      // 使用`window.getComputedStyle().width/height`,但是这个方法经测试,没有包含border的宽度
      var Height = window.getComputedStyle(document.querySelector('.box')).height
      var Width = window.getComputedStyle(document.querySelector('.box')).width
    
      console.log('realHeight: ' + realHeight + 'px')
      console.log('realWidth: ' + realWidth + 'px')
      console.log('Height: ' + Height)
      console.log('Width: ' + Width)
    </script>
    

    获取元素真实宽高 demo
    页面console台的效果:

     
     

    scrollX、scrollY

    1. scrollX:滚动条横向偏移
    2. scrollY:滚动条纵向偏移

    这两个值随着滚动位置变化而变化

    scrollTo、scrollBy、scroll

    我们也可以通过方法scrollTo或者scroll方法改变滚动条位置到指定坐标

    window.scrollTo(0, 300); // 滚动条移动到300px处
    
    

    两个参数分别是水平、垂直方向偏移

    scrollBy可以相对当前位置移动滚动条,而不是移动到绝对位置

    scrollBy(0, 100); // 滚动条下移100px
    
    

    window.frames

    window.frames返回一个类似数组的对象,成员为页面内的所有框架,包括frame元素和iframe元素。需要注意的是,window.frames的每个成员对应的是框架内的窗口(即框架的window对象),获取每个框架的DOM树,需要使用window.frames[0].document。

    var iframe = window.getElementsByTagName("iframe")[0];
    var iframe_title = iframe.contentWindow.title;
    
    

    上面代码用于获取框架页面的标题。

    iframe元素遵守同源政策,只有当父页面与框架页面来自同一个域名,两者之间才可以用脚本通信,否则只有使用window.postMessage方法。

    在iframe框架内部,使用window.parent指向父页面。

    navigator

    Window对象的navigator属性,指向一个包含浏览器相关信息的对象。

    navigator.userAgent属性返回浏览器的User-Agent字符串,用来标示浏览器的种类。下面是Chrome浏览器的User-Agent。

    navigator.userAgent // "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36"
    

    搭配正则的应用示例(判断用户浏览器类型函数):

    //判断是否是iPhone用户
    function isIPhone(){
      return /iPhone/.test(navigator.userAgent)
    }
    
    //判断是否是iPad用户
    function isIPad(){
      return /iPad/.test(navigator.userAgent)
    }
    
    //判断是否是安卓用户
    function isAndroid(){
      return /Android/.test(navigator.userAgent)
    }
    
    //判断是否是IOS用户
    function isIOS(){
      return /(iPad)|(iPhone)/.test(navigator.userAgent)
    }
    

    通过userAgent属性识别浏览器,不是一个好办法。因为必须考虑所有的情况(不同的浏览器,不同的版本),非常麻烦,而且无法保证未来的适用性,更何况各种上网设备层出不穷,难以穷尽。所以,现在一般不再识别浏览器了,而是使用“功能识别”方法,即逐一测试当前浏览器是否支持要用到的JavaScript功能。

    screen

    screen对象包含了显示设备的信息。

    // 显示设备的高度,单位为像素
    screen.height
    // 1920
    
    // 显示设备的宽度,单位为像素
    screen.width
    // 1080
    
    

    一般使用以上两个属性,了解设备的分辨率。上面代码显示,某设备的分辨率是1920x1080。除非调整显示器的分辨率,否则这两个值可以看作常量,不会发生变化。显示器的分辨率与浏览器设置无关,缩放网页并不会改变分辨率。

    window.getComputedStyle

    getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration])

    关于getComputedStyle方法的注意点:参考 获取样式 getComputedStyle

        var style = window.getComputedStyle("元素", "伪类");
    

    第二个参数没有伪类则不设置

        var div = document.getElementById('test');
    
        console.log(getComputedStyle(div).width);
    

    currentStyle

    这个是低版本IE的实现方案,我们可以写个兼容的方式

    element.currentStyle ?
        element.currentStyle : window.getComputedStyle(element, null)
    

    一些现在不常用的 alert()、prompt()、confirm()

    alert()、prompt()、confirm()都是浏览器用来与用户互动的方法。它们会弹出不同的对话框,要求用户做出回应。

    需要注意的是,alert()、prompt()、confirm()这三个方法弹出的对话框,都是浏览器统一规定的式样,是无法定制的。

    alert方法弹出的对话框,只有一个“确定”按钮,往往用来通知用户某些信息。

    // 格式
    alert(message);
    
    // 实例
    alert("Hello World");
    
    

    用户只有点击“确定”按钮,对话框才会消失。在对话框弹出期间,浏览器窗口处于冻结状态,如果不点“确定”按钮,用户什么也干不了。

    prompt方法弹出的对话框,在提示文字的下方,还有一个输入框,要求用户输入信息,并有“确定”和“取消”两个按钮。它往往用来获取用户输入的数据。

    // 格式
    var result = prompt(text[, default]);
    
    // 实例
    var result = prompt('您的年龄?', 25)
    
    

    上面代码会跳出一个对话框,文字提示为“您的年龄?”,要求用户在对话框中输入自己的年龄(默认显示25)。

    prompt方法的返回值是一个字符串(有可能为空)或者null,具体分成三种情况。

    1. 用户输入信息,并点击“确定”,则用户输入的信息就是返回值。
    2. 用户没有输入信息,直接点击“确定”,则输入框的默认值就是返回值。
    3. 用户点击了“取消”(或者按了Escape按钮),则返回值是null。

    prompt方法的第二个参数是可选的,但是如果不提供的话,IE浏览器会在输入框中显示undefined。因此,最好总是提供第二个参数,作为输入框的默认值。

    confirm方法弹出的对话框,除了提示信息之外,只有“确定”和“取消”两个按钮,往往用来征询用户的意见。

    // 格式
    var result = confirm(message);
    
    // 实例
    var result = confirm("你最近好吗?");
    
    

    上面代码弹出一个对话框,上面只有一行文字“你最近好吗?”,用户选择点击“确定”或“取消”。

    confirm方法返回一个布尔值,如果用户点击“确定”,则返回true;如果用户点击“取消”,则返回false。

    URL的编码/解码方法

    JavaScript提供四个URL的编码/解码方法。

    为什么要编码?

    • URL 只能使用 ASCII 字符集来通过因特网进行发送。也就是说URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。
    • 这意味着如果URL存在汉字,就必须编码后使用。

    编码:

    1. encodeURI()
    2. encodeURIComponent()

    解码:

    1. decodeURI()
    2. decodeURIComponent()

    区别

    encodeURI方法不会对下列字符编码

    1. ASCII字母
    2. 数字
    3. ~!@#$&*()=:/,;?+'
    
    

    encodeURIComponent方法不会对下列字符编码

    1. ASCII字母
    2. 数字
    3. ~!*()'
    
    

    所以encodeURIComponent比encodeURI编码的范围更大。

    实际例子来说,encodeURIComponent会把 http:// 编码成 http%3A%2F%2F 而encodeURI却不会。

    关于另一种编码escape参考下面文章
    escape,encodeURI,encodeURIComponent的有什么区别?

    浏览器存储

    cookie

    1. cookie是存储在浏览器上的一小段数据,用来记录某些当页面关闭或者刷新后仍然需要记录的信息。在控制台用 「document.cookie」查看你当前正在浏览的网站的cookie。
    2. cookie可以使用 js 在浏览器直接设置(用于记录不敏感信息,如用户名), 也可以在服务端通使用 HTTP 协议规定的 set-cookie 来让浏览器种下cookie,这是最常见的做法。(打开一个网站,清除全部cookie,然后刷新页面,在network的Response headers可以查看set-cookie)
    3. 每次网络请求 Request headers 中都会带上cookie。所以如果 cookie 太多太大对传输效率会有影响。
    4. 一般浏览器存储cookie 最大容量为4k,所以大量数据不要存到cookie。
    5. 设置cookie时的参数:
      • path:表示 cookie 影响到的路径,匹配该路径才发送这个 cookie。expires 和 maxAge:告诉浏览器 cookie 时候过期,maxAge 是 cookie 多久后过期的相对时间。不设置这两个选项时会产生 session cookie,session cookie 是 transient 的,当用户关闭浏览器时,就被清除。一般用来保存 session 的 session_id。
      • secure:当 secure 值为 true 时,cookie 在 HTTP 中是无效,在 HTTPS 中才有效
      • httpOnly:浏览器不允许脚本操作 document.cookie 去更改 cookie。一般情况下都应该设置这个为 true,这样可以避免被 xss 攻击拿到cookie。

    参考

    cookie 参数
    简述 Cookie 是什么

    session

    当一个用户打开淘宝登录后,刷新浏览器仍然展示登录状态。服务器如何分辨这次发起请求的用户是刚才登录过的用户呢?这里就使用了session保存状态。用户在输入用户名密码提交给服务端,服务端验证通过后会创建一个session用于记录用户的相关信息,这个 session 可保存在服务器内存中,也可保存在数据库中。

    • 创建session后,会把关联的session_id 通过setCookie 添加到http响应头部中。
    • 浏览器在加载页面时发现响应头部有 set-cookie字段,就把这个cookie 种到浏览器指定域名下。
    • 当下次刷新页面时,发送的请求会带上这条cookie, 服务端在接收到后根据这个session_id来识别用户。

    cookie 是存储在浏览器里的一小段「数据」,而session是一种让服务器能识别某个用户的「机制」,session 在实现的过程中需要使用cookie。 二者不是同一维度的东西。

    参考

    session和cookie

    localStorage

    1. localStorage HTML5本地存储web storage特性的API之一,用于将大量数据(最大5M)保存在浏览器中,保存后数据永远存在不会失效过期,除非用 js手动清除。
    2. 不参与网络传输。
    3. 一般用于性能优化,可以保存图片、js、css、html 模板、大量数据。
  • 相关阅读:
    剑指 Offer 30. 包含min函数的栈
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 18. 删除链表的节点
    剑指 Offer 24. 反转链表
    Jmeter
    Jmeter
    Linux搭建Jenkins
    [基金项目] 青年基金写作的历程与经验(2)
    [基金项目] 青年基金写作的历程与经验(1)
    浅析mysql存储过程
  • 原文地址:https://www.cnblogs.com/evenyao/p/9395476.html
Copyright © 2020-2023  润新知