参考  :  https://www.cnblogs.com/Peng2014/p/4725524.html

1、 window对象   https://www.runoob.com/jsref/obj-window.html

  属性:

  a、onpopstate 和 onhashchange:这两个事件都是 url变化的监听器(必须是同一个document文档上,url变化才会触发这个事件。如:单页面应用的url,history.pushState创建的url)。

  b、window.name:每个窗口都有独立的window.name属性,这个属性是挂在窗口上的,这个窗口 document文档 无论怎么变,文档的js都可以读写到。(只要窗口不关,就不会销毁)

  c、window.parent:parent 属性返回当前窗口的父窗口。

  d、window.self:self 属性返回指向当前 window 对象的引用。

  e、window.top:Top属性返回当前窗口的最顶层浏览器窗口。

  f、window.innerWidth:返回窗口的文档显示区的宽度。

  方法:

  a、window.scrollTo():把内容滚动到指定的坐标。

  b、window.scrollBy():按照指定的像素值来滚动内容。

2.、history对象 (常用) :https://blog.csdn.net/u012028371/article/details/67636395 或 https://developer.mozilla.org/zh-CN/docs/Web/API/History_API(推荐) 或 https://www.cnblogs.com/accordion/p/5699372.html(有实践案例)

   history对象保存着从窗口被打开起的历史记录,每个浏览器窗口、标签页、框架都有自己的history对象。

  history的使用  http://www.cnblogs.com/yy95/p/5678961.html  (有时间研究下)

  用history api"偷换"浏览器历史记录   :   http://justcoding.iteye.com/blog/2219339

  a、pushState(stateObject, title, url) :三个参数,pushState函数向浏览器的 url堆栈 压入一个设定值的 url 记录,并改变 url堆栈的当前指针至栈顶。(亲测,这个url必须和当前URL在同一个域,感觉是为hybrid-App开发的)

     url 的值有多种用法:

      1、""   【添加一个当前的url进去】、
      2、"?data=1" 【拼接在之前url后面】
      3、"https://www.cnblogs.com/?data=1" 【添加的就是这个url】
      4、"data/1" 【替换url最后一个目录的值】
      5、"/data/1" 【替换url根下的所有值】
      6、"data=1" 【替换url最后一个目录的值】等等

     history.pushState 给 url堆栈 添加的的url,只是一个url标志,占一个位置,并没有真实请求这个地址的文件。手动刷新下页面,就会真实发起请求。所以一般的都是添加一个当前 url+string

  b、replaceState():和 pushState是一样的用法,replaceState是替换浏览器历史堆栈的当前历史记录为设定的ur。

  c、onpopstate事件触发(该事件是window的属性):在不改变document的前提下,一旦当前指针改变则会触发onpopstate事件。(跳转到其他的html文档不会触发这个事件)

     document文档不变(即html文件不变),只有两种情况,地址栏url变化,而html文档不变。第一种是,单页面的跳转,文档是不变的;第二种是,history.pushState创建的url地址,前进回退,页面html文档不变。

    onpopstate触发条件:点击后退或前进按钮(或者在JavaScript中调用history.back()或history.go()方法)时触发。       http://www.mamicode.com/info-detail-1331288.html

    注意:在 history 中插入新的url是不会触发这个事件的,即页面中正常的链接跳转是不会触发这个事件的

  d、history.state:获取当前状态

   案例说明:history.pushState 的功能,在 hybrid-App 中就很有用(所有 点击回退按钮,而不希望页面跳转,只是执行某个程序的功能,都会用到history.pushStat。因为,点击回退按钮,url是一定会后退的)。

  • 需求描述:H5中调用 原生的 app 分享功能,底部弹出原生分享组件。这个时候如果点击回退按钮,H5页面肯定会退回到上一个页面,但是我们实际需求是页面不变,分享组件退出去。
  • 实现原理:点击回退按钮,H5页面回退到上一个页面肯定是改不了的。但是我们可以通过history.pushState,给url堆栈中加一个url,但是页面又不变。这个时候url堆栈回退了,H5页面并没有刷新动作。

3.、location对象  (常用):既是window对象的属性,同时也是document对象的属性

  location对象提供了与当前窗口中加载的文档有关的信息以及一些导航功能;它既是window对象的属性,同时也是document对象的属性.

  a、location.href 跳转页面 会刷新页面,所以单页面之间的跳转,不要使用 location.href 来实现,功能上虽然是实现了。但是会有bug(用户体验的问题),当页面刷新时,vue实例都会被重新加载,页面跳转会出现闪烁。

主要属性有:

4.、navigator对象 

   navigator对象用来描述浏览器本身,包括浏览器的名称、版本、语言、系统平台、用户特性字符串等信息.

5.、screen对象  

  screen对象用来表明客户端显示器的能力。 包括浏览器窗口外部的显示器的信息,如像素宽度和高度等,每个浏览器中的screen对象都包含着各不相同的属性。

6.、document对象  

  document对象既是BOM顶级对象的一个属性,更是DOM模型中的顶级对象,在DOM中一起总结。


总结:

1、location.href 和 history.pushState 对浏览器 url 堆栈的操作:(这里url堆栈就是,保存 浏览器历史记录的一些信息,即地址栏上url每次的改变都反馈到 url堆栈中)

    a、location 和 history对象都有 操作 浏览器 url堆栈 的API接口。(如,location.href 、history.pushStat 等)

    b、window.location.href=newUrl和window.history.pushState(obj," ",newUrl)之间有什么区别:

      相同点:他们都会使  浏览器向 url堆栈 中 push newURl,url地址变成newURl。

      不同点:location.href 操作后,使用新的url向服务器发送请求刷新页面;而

          history.pushState 不会去请求,也不会刷新页面。

        但是,history.pushState不允许跨域使用。location.href 跳转到当前url上,刷新页面,浏览器不会向url堆栈中push newURl,而history.pushState会把这个url压入url堆栈中。

     比如:

  个人理解:随着技术的发展(SPA和Hybrid的广泛使用),在location对象下的历史记录功能不够用,于是创建一个history对象,和历史记录相关的属性方法在这个对象里面(history对象操作url必须是tongyu,感觉就是为单页面应用开发的功能)。

        location对象的历史记录更多的是这个窗口的一个历史记录,所以 location.href 可以跳转 任意的地址。

         location对象的历史记录和history对象是两个东西,他们各管个的。只是两个对象都有操作 url 堆栈 的API(location.href,history.pushState)。

2、(个人理解,只是猜测的一个模型,至于底层具体怎么实现的,这是浏览器工程师考虑的问题,我们不需要去深究)可以想象 url堆栈 是一个二维数组 形式的 储存对象。比如:

pushState = [pushState1,pushState2]   // history.pushState 生成的 url地址。url指针 指向 pushState 时,刷新一次浏览器,之后url指针 在pushState内变化时,就不去刷新页面了
urls = [url0,url1,pushState,url3,url4,url5] // 浏览器当前url指针在外层数组中变化会刷新浏览器,在内层数组中数组中变化不会刷新页面。

  基于这种模型就很好理解 location.href 和 history.pushState的差别了,前一个是操作外层数组;后一个是操作内层数组。

js中浏览器对象BOM的更多相关文章

  1. js中XMLHttpRequest对象实现GET、POST异步传输

    js中XMLHttpRequest对象实现GET.POST异步传输 /* * 统一XHR接口 */ function createXHR() { // IE7+,Firefox, Opera, Chr ...

  2. JS中的对象和方法简单剖析

    众所周知,在js中对象就是精髓,不理解对象就是不理解js. 那么什么事js中的对象呢? 在js中,几乎一切皆对象: Boolean ,String,Number可以是对象(或者说原生数据被认作对象): ...

  3. js中 json对象与json字符串相互转换的几种方式

    以下总结js中 json对象与json字符串相互转换的几种方式: 一.JSON对象转化为JSON字符串 1.使用JSON.stringify()方法进行转换 该方法不支持较老版本的IE浏览器,比如:i ...

  4. 深入理解JS中的对象(一)

    目录 一切皆是对象吗? 对象 原型与原型链 构造函数 参考 1.一切皆是对象吗? 首先,"在 JavaScript 中,一切皆是对象"这种表述是不完全正确的. JavaScript ...

  5. 深入理解JS中的对象(二):new 的工作原理

    目录 序言 不同返回值的构造函数 深入 new 调用函数原理 总结 参考 1.序言 在 深入理解JS中的对象(一):原型.原型链和构造函数 中,我们分析了JS中是否一切皆对象以及对象的原型.原型链和构 ...

  6. 深入理解JS中的对象(三):class 的工作原理

    目录 序言 class 是一个特殊的函数 class 的工作原理 class 继承的原型链关系 参考 1.序言 ECMAScript 2015(ES6) 中引入的 JavaScript 类实质上是 J ...

  7. js中判断对象具体类型

    大家可能知道js中判断对象类型可以用typeof来判断.看下面的情况 <script> alert(typeof 1);//number alert(typeof "2" ...

  8. 浅解析js中的对象

    浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...

  9. JavaScript学习12 JS中定义对象的几种方式

    JavaScript学习12 JS中定义对象的几种方式 JavaScript中没有类的概念,只有对象. 在JavaScript中定义对象可以采用以下几种方式: 1.基于已有对象扩充其属性和方法 2.工 ...

随机推荐

  1. ofbiz保存jsp页面数据

    1.前台js保存 <script type="text/javascript" src="/ecloud/js/js/jquery.min.js"> ...

  2. 回调函数 和 promise对象,及封装API接口

    1.回调函数:https://blog.csdn.net/baidu_32262373/article/details/54969696 注意:回调函数不一定需要用到 return.如果浏览器支持Pr ...

  3. 建站手册-浏览器信息:Internet Explorer 浏览器

    ylbtech-建站手册-浏览器信息:Internet Explorer 浏览器 1.返回顶部 1. http://www.w3school.com.cn/browsers/browsers_inte ...

  4. (转)spring ioc原理(看完后大家可以自己写一个spring)

    原文地址:https://blog.csdn.net/it_man/article/details/4402245 最近,买了本Spring入门书:spring In Action .大致浏览了下感觉 ...

  5. c# networkcomms 3.0实现模拟登陆总结 转载https://www.cnblogs.com/zuochanzi/p/7039636.html

    最近项目需要做一个客户查询状态系统,当前上位机缺少服务功能,于是找到了networkcomms 开源框架,作为项目使用. 最新版networkcomms 下载地址:https://github.com ...

  6. VisualStudio下std::string的内存布局

    主要成员 union _Bxty { // storage for small buffer or pointer to larger one _Elem _Buf[_BUF_SIZE]; _Elem ...

  7. NMS python实现

    import numpy as np ''' 目标检测中常用到NMS,在faster R-CNN中,每一个bounding box都有一个打分,NMS实现逻辑是: 1,按打分最高到最低将BBox排序 ...

  8. 安全服务——CVE中CVSS相关指标介绍

    目录 CVSS相关指标 一.CVSS是什么 二.指标内容 1.Base指标 2.Temporal指标 3.Environmental指标 三.Base, Temporal, Environmental ...

  9. SQL才是世界上最牛逼的语言!

    身处互联网行业,SQL 可能是你需要掌握的核心技能之一. 最早的时候,SQL 作为一门查询数据库的语言,是程序员的必备技能,运维.开发.Web 以及数据等从业人员都需要用到 SQL,毕竟只有查询到正确 ...

  10. HDU 1261 字串数(排列组合)

    字串数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...