1.frame相关对象

  • top:指向最外层框架,使用top可以在一个框架中访问另一个框架,例如top.frames[index/name]

  • parent:指向当前框架的直接上层框架

  • window:代码所在框架的特定实例,所以window对象不唯一,各个框架都有各自的window对象

  • self:指向window,二者可以互换

2.窗口、页面相关

1.获取窗口相对屏幕左边界和上边界的位置

var x = (typeof window.screenLeft === 'number') ? window.screenLeft : window.screenX;//FF只支持后者
var y = (typeof window.screenLeft === 'number') ? window.screenLeft : window.screenX;
alert(x + ', ' + y);///

浏览器对窗口位置的理解不同,浏览器窗口最大化时上面的代码输出结果是:

  • Chrome:(0, 0)

  • IE8:(0, 0)

  • FF:(-4, -4)

Safari和Opera未知,浏览器厂商的分歧在于窗口位置是浏览器窗口的位置还是页面容器(viewport)的位置

2.获取页面视口(viewport)大小

var pageWidth = window.innerWidth;
var pageHeight = window.innerHeight; if(typeof pageWidth !== 'number'){
if(document.compatMode == 'CSS1Compat'){
pageWidth = document.documentElement.clientWidth;
pageHeight = document.documentElement.clientHeight;
}
else{
pageWidth = document.body.clientWidth;
pageHeight = document.body.clientHeight;
}
}
alert(pageWidth + ', ' + pageHeight);///

视口(viewport)指的是页面可见区域,也就是浏览器给页面提供的容器,浏览器窗口最大化时上面的代码输出结果是:(分辨率1366*768)

  • Chrome:(1366, 653)

  • IE8:(1362, 644)

  • FF:(1366, 667)

PC端浏览器在这一点上达成了共识,但移动浏览器存在差异,如果需要支持移动端浏览器,还需要仔细研究各个浏览器的支持情况,这里不再展开

3.打开新窗口的方式

//window.open(url, target, strOptions, replaceOrNot);//等价于<a href="http://ayqy.net/" target="_self"></a>,target值还可以是frameName,表示在指定的frame中打开页面
//window.open('http://ayqy.net/', '_self');//在当前页面打开,返回按钮失效
//var win = window.open('http://ayqy.net/', '_blank', 'width=200, height=200');//弹出200\*200的窗口
//setTimeout(win.close(), 3000);//3s后自动关闭
//window.open('http://ayqy.net/', '_self', '', true);//替换掉当前历史记录,无痕跳转

P.S.用窗口方式展示内容不利于SEO,最常见的弹出窗口除了广告就是第三方帐号登录,这些不需要SEO的地方

3.超时调用

setTimeout(strCode/funcName, timeout);表示经过timeout毫秒后code不一定会执行,因为该函数的确切含义是:timeout毫秒后把指定的任务添加到任务队列中

取消尚未执行的延时任务:

var timeoutId = setTimeout(strCode/fun, timeout);
clearTimeout(timeoutId);

P.S.setTimeout的第一个参数虽然可以是字符串,但建议用函数名,因为字符串需要先解析成js代码才能执行,存在性能损失

4.间歇调用

setInterval(strCode/fun, timeout);表示按照指定时间间隔把任务插入任务队列

注意:如果准备插入新任务时上次插入的任务还没有执行完,会自动取消本次插入。也就是说,如果任务队列里没有相同任务,则插入,否则等下一次

取消尚未执行的间歇任务:与超时调用相同,clearInterval(intervalId);

注意:不建议使用间歇调用,因为后一个间歇调用可能会在前一个结束前启动。一般用递归超时调用来模拟,例如:

(function(){
alert('x');
setTimeout(arguments.callee, 3000);//注意不要用函数名,用arguments.callee更安全,因为不怕函数名被从外部更改
})();//匿名函数立即执行

5.对话框

  • alert(msg):警告框,用来显示错误信息,只有一个确定按钮

  • confirm(msg):确认框,用于确认某些重要操作,例如删除,有确认/取消按钮,返回true/false

  • prompt(msg, hint):输入框,用于获取用户输入,有确认/取消按钮,返回输入值/null

  • windowprint()、window.find():打印/查找,用处很少

6.location对象

1.获取url

  • location.href:获取当前页面的完整url,例如”http://www.ayqy.net”

  • location.search:获取查询字符串,例如”?keyword=do”

  • location.hash:获取锚(#以及后面的值,叫hash是因为在UNIX中,#就叫hash),例如”#menu”

  • location.host:获取主机名和端口号,例如”www.ayqy.net:80″

  • location.hostname:获取主机名,例如”www.ayqy.net”

  • location.pathname:获取url中的目录或文件名,例如”/film/”

  • location.port:获取端口号,例如”80″

  • location.protocol:返回页面使用的协议,例如”https:”

2.跳转,重定向

  • location.assign(url);

  • location.href = url;//最常用

  • window.location = url;

  • location.replace(url);//跳转且无法返回

  • location.reload(true/false);//重新载入当前页面,若true则不从缓存中取

7.navigator对象(用来检测浏览器相关参数)

提供插件检测和注册处理程序等功能,注册处理程序相当于通知浏览器当前页面提供某种在线功能(例如在线电子邮件,RSS阅读器等等),注册后用户执行某些操作(例如访问RSS源页面)后会自动请求已注册页面,相当于桌面应用的设置默认打开方式

8.screen对象

用于获取客户端相关信息,例如屏幕宽高、可用宽高等等,用处不多,浏览器支持性也不好

9.history对象

  • history.go(delta);或者history.go(str);向前/后跳转,或者跳转到最近的url包含str的页面(可能向前也可能向后)

  • history.back();history.forward();模拟浏览器的后退/前进按钮

  • history.length;获取历史记录条数,为0则说明当前页是用户打开浏览器后访问的第一页

注意:可以在历史记录中跳转,但无法获得历史URL(安全性限制)

P.S.HTML5提供了hsitory.pushState/history.replaceState函数,有人把pushState + Ajax合起来叫PJax技术,用来实现页内刷新的无跳转web App,但pushState存在兼容性问题,需要引入其它支持组件

10.客户端检测技术

  1. 功能检测(特性检测):在编写代码之前先检测用户浏览器的能力,以便用不同的方式来实现目的,例如:

    if(typeof String.startsWith === 'function'){...}
  2. 怪癖检测:某些浏览器执行特定代码时会出现不合理的结果,当某个怪癖会干扰脚本运行时才使用(此处的怪癖其实是针对浏览器实现的js的bug而言的,比如不该枚举的属性可枚举等等,怪癖比较少见)

  3. 用户代理检测:通过检测UA字符串来识别用户浏览器的具体信息,但UA具有欺骗性

P.S.需要使用客户端检测技术时,优先选择级别如上所述,先做功能检测,不行就怪癖检测,UA检测是下下策,因为UA检测是针对特定型号的浏览器的,浏览器补丁可能会让现有方案失效

JS学习笔记4_BOM的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. Vue.js学习笔记(2)vue-router

    vue中vue-router的使用:

  3. JS 学习笔记--9---变量-作用域-内存相关

    JS 中变量和其它语言中变量最大的区别就是,JS 是松散型语言,决定了它只是在某一个特定时间保存某一特定的值的一个名字而已.由于在定义变量的时候不需要显示规定必须保存某种类型的值,故变量的值以及保存的 ...

  4. WebGL three.js学习笔记 使用粒子系统模拟时空隧道(虫洞)

    WebGL three.js学习笔记 使用粒子系统模拟时空隧道 本例的运行结果如图: 时空隧道demo演示 Demo地址:https://nsytsqdtn.github.io/demo/sprite ...

  5. WebGL three.js学习笔记 法向量网格材质MeshNormalMaterial的介绍和创建360度全景天空盒的方法

    WebGL学习----Three.js学习笔记(5) 点击查看demo演示 Demo地址:https://nsytsqdtn.github.io/demo/360/360 简单网格材质 MeshNor ...

  6. WebGL three.js学习笔记 创建three.js代码的基本框架

    WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...

  7. vue.js 学习笔记3——TypeScript

    目录 vue.js 学习笔记3--TypeScript 工具 基础类型 数组 元组 枚举 字面量 接口 类类型 类类型要素 函数 函数参数 this对象和类型 重载 迭代器 Symbol.iterat ...

  8. 2019-4-29 js学习笔记

    js学习笔记一:js数据类型   1:基本数据类型       number类型(整数,小数)      String类型          boolean类型        NaN类型其实是一个nu ...

  9. 一点感悟:《Node.js学习笔记》star数突破1000+

    写作背景 笔者前年开始撰写的<Node.js学习笔记> github star 数突破了1000,算是个里程碑吧. 从第一次提交(2016.11.03)到现在,1年半过去了.突然有些感慨, ...

随机推荐

  1. Ubuntu安装R及R包

    安装R $sudo apt-get update $sudo apt-get install r-base $sudo apt-get install r-base-dev 安装一些可能的依赖包 $s ...

  2. String、StringBuffer、StringBuilder和StringTokenizer的区别

    1)String.StringBuffer.StringBuilder都用于字符串操作,其中,String是不可变类,即String对象一旦被创建,其值不能被修改,而StringBuffer和Stri ...

  3. MS SQMServer2008R2 连接不到远程服务的解决办法

    问题: MS SQMServer2008R2 连接不到远程服务的解决办法.程序提示的错误如下: [2017/02/19 17:46:21] 在与 SQL Server 建立连接时出现与网络相关的或特定 ...

  4. 【转载】 了解实时媒体的播放(RTP/RTCP 和 RTSP)

    http://blog.csdn.net/span76/article/details/12913307 离线媒体只是用 Http协议去读取服务器端文件而已,而对于实时直播如何实现, 这里就要用到 R ...

  5. 自学java坎坷之路——20155312张竞予

    20155312 2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 第一周并没有在课堂上对教材内容进行学习,学习内容概括如下 课程分数构成,其中包括课堂测验(每 ...

  6. (16)The beauty of what we'll never know

    https://www.ted.com/talks/pico_iyer_the_beauty_of_what_we_ll_never_know/transcript 00:13One hot Octo ...

  7. 范围for循环(c++11)

    1.概念 1)c++11新标准下用范围for循环来遍历序列 2)使用范围for循环时,如果要修改序列中的元素,则必须把循环变量定义成引用类型: int main() { string s = &quo ...

  8. SQL之GROUP BY 语句

    合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...

  9. mysql学习之路_视图

    视图 视图:view是一种有结构的但是没有结构来源的虚拟表,虚拟表的结构来源不是自己定义的而是从对应的基表中产生(来源) 创建视图 基本语法: Create view 视图名字 as select 语 ...

  10. VB6.0中WinSock控件属性和方法详解

    原文链接:http://liweibird.blog.51cto.com/631764/653134 WinSock控件能够通过UDP协议(用户数据报协议)或TCP协议(数据传输协议)连接到远程的机器 ...