参考  :  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. Linux 应用程序编程基础

    一个计算机应用程序在内存中可以分成两个部分:存放代码的代码段和存放数据的数据段.代码段存放用户编写的代码;数据段存放栈和堆. 相关内存管理函数 #include <stdlib.h> vo ...

  3. python实现人民币大写转换

    问题描述: 银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序. 在中文大写方式中,0到10以及100.1000.10000被依次表示为: 零 壹 贰 ...

  4. 漫谈C语言结构体

    相信大家对于结构体都不陌生.在此,分享出本人对C语言结构体的学习心得.如果你发现这个总结中有你以前所未掌握的,那本文也算是有点价值了.当然,水平有限,若发现不足之处恳请指出.代码文件test.c我放在 ...

  5. PHP中global与$GLOBALS的区别

    单一个global是一个关键字,通常附加在变量前,用于将变量声明至全局作用域: $GLOBALS是预定义的超全局变量,把变量扔到里边的话一样可以带到全局去. $GLOBALS 是一个关联数组,每一个变 ...

  6. shell 跟踪命令

    添加跟踪 set -x 去除跟踪 set +x

  7. 字符串连接之“+”和append

    在解决这个问题之前,需要了解的内容: 1.String是只读字符串,即String引用的字符串内容是不可改变的. 1 String s1 = "abc"; 2 s1 = " ...

  8. redis 学习入门篇

    基本概念 redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库(非关系性数据库). redis的特点 速度快,因为数据存在内存中,读写数据的时候都不 ...

  9. SpringCloud-技术专区-Zuul-使用指南

    Zuul作为微服务系统的网关组件,用于构建边界服务,致力于动态路由.过滤.监控.弹性伸缩和安全. Zuul功能 认证 压力测试 金丝雀测试 动态路由 负载削减 安全 静态响应处理 主动/主动交换管理 ...

  10. 5、springcloud整合mybatis注解方式

    1.上一篇学习了服务提供者provider,但是并不是单单就学习了服务提供者.中间还穿插使用了Hikari数据源和spring cloud整合mybatis.但是上篇使用mybatis时还是沿用了老的 ...