http://www.w3school.com.cn/js/js_window.aspjavascript
https://developer.mozilla.org/zh-CN/docs/Web/API/Windowjava
浏览器对象模型(Browser Object Model)尚无正式标准。因为现代浏览器已经(几乎)实现了 JavaScript 交互性方面的相同方法和属性,所以常被认为是 BOM 的方法和属性。android
window对象的原理ios
Location
对象,其中包含有关文档当前位置的信息。
DOMString
window.location = 'http://www.example.com' // 同下 window.location.href = 'http://www.example.com'
API:web
reload(Boolean) // 刷新当前页面,能够传递参数,true表示强制从服务器从新加载当前页面,默认为false,即便用缓存 replace('http://www.cnblogs.com/fanlinqiang')// 修改地址并保持hash值 href // 当前页地址 hostname //返回 web 主机的域名 pathname //返回当前页面的路径和文件名 port //返回 web 主机的端口 (80 或 443) search //向服务器发送字符串数据 hash // #.., 地址中的hash值,在单页面应用中常常用到
navigator对象 (如下属性不兼容)面试
appName //浏览器名称 appVersion //浏览器版本 platform //操做系统 // 最新的浏览器已经全面放弃以上这些属性 userAgent //用户代理信息,经过该属性能够获取浏览器及操做系统信息
如何判断移动端手机浏览器版本?编程
window.onload = function() { var u = navigator.userAgent; if(u.indexOf('Android') > 一1 || u.indexOf('Linux') > -1) { //安卓手机 alert("安卓手机"); } else if(u.indexOf('iPhone') > 一1) { //苹果手机 alert("苹果手机"); } else if(u.indexOf('Windows Phone') > 一1) { //winphone手机 alert("winphone 手机"); } }
// 浏览器信息 let browser = { versions: function () { let u = window.navigator.userAgent; return { trident: u.indexOf('Trident') > -1, //IE内核 presto: u.indexOf('Presto') > -1, //opera内核 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') === -1, //火狐内核 mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android终端或者uc浏览器 iPhone: u.indexOf('iPhone') > -1 || u.indexOf('Mac') > -1, //是否为iPhone或者安卓QQ浏览器 iPad: u.indexOf('iPad') > -1, //是否为iPad webApp: u.indexOf('Safari') === -1, //是否为web应用程序,没有头部与底部 weixin: u.indexOf('MicroMessenger') === -1 //是否为微信浏览器 }; }() };
history对象浏览器
length // 当前域名下访问页面的个数
back() //回退 forward() //前进 go(-2) //跳转指定页面
// 如下为h5新增
pushState(state, title, url) // 会触发popstate事件
history.replaceState({page: 3}, "title 3", "?page=3")
history.pushState()
或history.replaceState()不会触发popstate事件。只有在作出浏览器动做时,才会触发该事件,如用户点击浏览器的回退按钮(或者在Javascript代码中调用
history.back())
实例:阻止浏览器后退按钮?使浏览器后退按钮失效缓存
window.onload = function() { window.onpopstate = function() { window.history.pushState('forward', null, '#'); window.history.forward(1); } window.history.pushState('forward', null, '#'); //在IE中必须得有这两行 window.history.forward(1); }
常见方法服务器
open(url) // close() blur() alert() // 阻塞式方法 confirm() //用户交互、有boolean返回值;是一个阻塞式的方法,alert()也是阻塞式方法 prompt() //接收用户的反馈信息,返回值是字符串
其中:let windowObjectReference = window.open(strUrl, strWindowName, [strWindowFeatures]);
strUrl === 要在新打开的窗口中加载的URL。
strWindowName === 新窗口的名称。
strWindowFeatures === 一个可选参数,列出新窗口的特征(大小,位置,滚动条等)做为一个DOMString
。
eval()方法 动态的执行代码,
function test() { var m = 'abc'; eval('alert(m)'); //abc }
// 将字符串转为对象时须要添加一层 {}
var a = '{name:123,age:456}'
console.log( eval("{a}") )
JavaScript是单线程的语言,但使用setTimout(延时器) 和 setInterval(定时器)能够模拟多线程
setInterval(function(){ console.log(111) },1000)
setTimeout(function(){
console.log(222)
},1000)
在JavaScript代码执行期间,遇到setTimeout 和 setInterval 会将其依次放置到执行栈中,当其余代码执行完后才开始执行执行栈中的“任务”,所以当碰到
... ...
setTimeout(function(){}, 0)
... ...
至关于将其中的任务放置到JavaScript代码最后执行,(1)若是回调的执行时间大于间隔间隔,那么浏览器会继续执行它们,致使真正的间隔时间 比原来的大一点;(2)它们存在一个最小的时钟间隔,在 IE6~IE8 中为 15.6ms6,后来精准到 10ms,IE10 为 4ms,其余浏览器相仿。但这些太容易受外部因素影响,好比电池快没电 了,同时打开的应用程序太多了,致使 CPU 忙碌,这些都会让它的数值偏高。
此外还有使用setInterval时其中的“任务”也是一个费时的过程则表现出的现象并非咱们想要的,如:假设咱们想要一个任务每隔10s运行一次,而这个任务每次运行可能须要9秒,这样表现出来的可能就是每一秒就运行了这个任务;更有甚者,假设咱们想要一个任务每隔10s运行一次,而这个任务每次运行的过程可能要11秒或者20s...,,这时候setInterval就会在执行栈进行累积,随后连续触发,为此咱们能够使用setTimeout来实现咱们想要的结果:
使用setTimeout代替setInterval??
!function(){ console.log("这是一个须要9秒的任务") setTimeout(arguments.callee,10000) }()
面试题:
for(var i=0;i<3;i++){ setTimeout(function(){ console.log(i--) // 3 2 1 },0) }
旧版本 IE 的最短时钟间隔太长,可利用 image 死链时当即执行 onerror 回调的状况来实现setTimeout
var orig_setTimeout = window.setTimeout; window.setTimeout = function(fun, wait) { if (wait < 15) { orig_setTimeout(fun, wait); } else { var img = new Image(); img.onload = img.onerror = function() { fun(); }; img.src = "data:,foo"; } };
JS是单线程仍是多线程?
setInterval(function(){console.log(1111);},0); console.log(2222); 输出顺序: 2222 1111
JavaScript引擎的主线程负责执行代码,因为只有一个线程,执行固然是同步的,即按顺序来。JavaScript中的异步一般都是经过回调函数来实现的,回调函数就是将函数的执行权转让给别人。另外,还有一个叫任务队列的东西,全部的异步代码都是从队列当中来。
因此在实际上咱们会发现,JavaScript根本不能同时执行两个任务,本质上仍是单线程。在JavaScript中所谓的异步有三种: