参考  :  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. Django--分页器(paginator)、Django的用户认证、Django的FORM表单

    分页器(paginator) >>> from django.core.paginator import Paginator >>> objects = ['joh ...

  2. ubuntu Linux下chromium无法使用flash解决方法

    Chromium作为谷歌的开源浏览器将不再支持Netscape浏览器插件API,Adobe公司的Flash将无法正常工作了.然而用户可以使用Pepper Flash Player,这是谷歌浏览器上一款 ...

  3. VMware Hyper-V不兼容

    VMware Workstation Windows系統的Hyper-V不相容 禁用Device Guard或Credential Guard 1. 以管理員身份運行Windows Powershel ...

  4. js判断是否pc端

    function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ['Android', 'iPhone', 'Symbi ...

  5. 个人笔记 - C++相关收藏

    一.文件操作 1.C++从txt文件中读取二维的数组

  6. 火狐foxyproxy + burp

    下载 火狐foxyproxy 和 burp 两个代理ip端口填写一致 如果对于公司有正向代理服务器,则需要配置burp的上游代理 对于IE浏览器的代理是windows操作系统的全局代理,在ie配置代理 ...

  7. linux下文件编码格式转换方法(gb18030/utf-8)

    文章转载自:http://www.firekyrin.com/archives/249.html linux下文件编码格式转换方法(gb18030/utf-8) 在Linux做开发或者系统管理遇到乱 ...

  8. CSS Sprites技术原理和使用

      在分析各个网站的CSS时,我们经常可以看到一些网站有很多的元素共享了一张背景图片,而这张背景图片包含了所有这些元素需要的背景,这种技术就叫做CSS Sprites. 淘宝的css sprites ...

  9. Redis源码编译安装

    介绍 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI C语言编写.遵 ...

  10. 把我坑惨的一个MySQL双引号!

    来源:For DBA www.fordba.com/mysql-double-quotation-marks-accident.html 一.前言 最近经常碰到开发误删除误更新数据,这不,他们又给我找 ...