简介
在 JavaScript 中,一个浏览器窗口就是一个 window 对象,简单地说,JavaScript 会把一个窗口看成一个对象,这样我们就可以用这个对象的属性和方法来操作这个窗口。实际上,我们在打开一个页面时,浏览器都会自动为这个页面创建一个 window 对象。
window 对象存放了这个页面的所有信息,为了更好地分类处理这些信息,window 对象下面又分为很多对象。
    window 对象及下面这些 location、navigator 等子对象,由于都是用于操作浏览器窗口的,所以我们又称之为“BOM”,也就是 Browser Object Module(浏览器对象模型)。
窗口操作
打开窗口
window.open(url,target)
url 指的是新窗口的地址,如果 url 为空,则表示打开一个空白窗口。空白窗口很有用,我们可以使用 document.write( )往空白窗口输出文本,甚至输出一个 HTML 页面。
target 表示打开方式,它的取值跟 a 标签中 target 属性的取值是一样的,常用取值有两个:_blank 和 _self。当 target 为“_blank(默认值)”时,表示在新窗口中打开;当 target 为“_self”时,表示在当前窗口中打开。
oBtn.onclick = function(){window.open("https://www.yuque.com/explore/events");window.open("https://www.yuque.com/explore/events","_blank");}
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script>window.onload = function(){var oBtn = document.getElementById("btn");oBtn.onclick = function(){var opener = window.open();opener.document.write("a new page")opener.document.body.style.backgroundColor = "blue";}}</script></head><body><input type="button" id="btn" value="button"></body></html>
window.open( )就像函数调用一样,会返回(也就是 return)一个值,这个值就是新窗口对应的 window 对象。
如果打开的是同一个域名下的页面或空白窗口,就可以像上面那样操作新窗口的元素或样式;但是如果打开的是另外一个域名下的页面,是不允许操作新窗口的内容的,因为涉及跨域的问题。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function(){
      var oBtn = document.getElementById("btn");
      var opener = null;
      oBtn.onclick = function(){
        opener = window.open();
        var strHtml = '<!DOCTYPE html>\
<html lang="en">\
<head>\
  <title>Document</title>\
</head>\
<body>\
  <strong>someting</strong>\
</body>\
</html>';
opener.document.write(strHtml);
  }
}
  </script>
</head>
<body>
  <input type="button" id="btn" value="button">
</body>
</html>
关闭窗口
window.close()
对话框
alert
这个方法在之前用了很多次,这里不再多说。对于 alert( ),只需记住一点:在 alert( )中实现文本换行,用的是 \n。
confirm( )
提供文字,提供确认。
confirm("提示文字")
如果用户点击【确定】按钮,confirm( )会返回 true;如果用户点击【取消】按钮,则会返回 false。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      var oBtn = document.getElementById("btn");
      oBtn.onclick = function () {
        if(confirm("are you sure?")){
          window.location.href = "https://weread.qq.com/web/reader/1fb32f0071cad7841fb22d7k65b326f026965b9eea6e6e1";
        }
      }
    }
  </script>
</head>
<body>
  <input type="button" id="btn">
</body>
</html>
prompt
prompt( )对话框不仅会提示文字,还会返回一个字符串。
prompt("提示文字")
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      var oBtn = document.getElementById("btn");
      oBtn.onclick = function () {
        var name = prompt("enter your name");
        document.write("welcome "+name);
    }
  }
  </script>
</head>
<body>
  <input type="button" id="btn">
</body>
</html>

一般不会采用默认的对话框,之后会进行学习。
定时器
实现网页计时,轮播图等,每隔一段事件就执行一次代码。
setTimeout( )和 clearTimeout( )
在 JavaScript 中,我们可以使用 setTimeout( )方法来“一次性”地调用函数,并且可以使用 clearTimeout( )来取消执行 setTimeout( )。
setTimeout(code,time)
参数 code 可以是一段代码,可以是一个函数,也可以是一个函数名。参数 time 是时间,单位为毫秒,表示要过多长时间才执行 code 中的代码。
<script>
    window.onload = function () {
      setTimeout('alert("欢迎")',2000)
  }
</script>
<script>
    window.onload = function () {
      setTimeout(function(){alert("欢迎")},2000)
  }
</script>
<script>
    window.onload = function () {
  //两种方式等价
      setTimeout(alertMes,2000)
      setTimeout("alertMes()",2000)
  }
    function alertMes(){
      alert("欢迎");
    }
</script>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      var oBtn = document.getElementsByTagName("input");
      var timer = null;
      oBtn[0].onclick = function () {
        timer = setTimeout(
          function () { alert("welcome") }, 2000
        )
      }
      oBtn[1].onclick = function () {
        clearTimeout(timer)
      }
    }
  </script>
</head>
<body>
  <p>点击按钮,两秒后提示欢迎语句</p>
  <input type="button" value="开始">
  <input type="button" value="暂停">
</body>
</html>
如果点击【开始】按钮,2秒后就会弹出对话框。如果在 2 秒内再次点击【暂停】按钮,就不会弹出对话框。
setInterval( )和 clearInterval( )
在 JavaScript 中,我们可以使用 setInterval( )方法来“重复性”地调用函数,并且可以使用 clearInterval( )来取消执行 setInterval( )。
setInterval(code,time);
三种写法,同上。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    window.onload = function () {
      var n = 5;
      setInterval(countDown,1000);
      function countDown(){
        if(n > 0){
          n--;
          document.getElementById("num").innerHTML = n;
        }
      }
    }
  </script>
</head>
<body>
  <div>倒计时:<span id="num">5</span></div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style type="text/css">
    div{width: 100px;height: 100px;border: 1px solid silver;}
  </style>
  <script>
    window.onload = function(){
      var oBtn = document.getElementsByTagName("input");
      var oDiv = document.getElementsByTagName("div")[0];
      var colors = ["red","blue","orange","yellow","green","blue","purple"];
      var timer = null;
      var i = 0;
      oBtn[0].onclick = function(){
        timer = setInterval(
          function(){oDiv.style.backgroundColor = colors[i];i++;i%=colors.length},1000
        )
        oBtn[1].onclick = function(){
          clearInterval(timer);
        }
      }
    }
  </script>
</head>
<body>
  <input type="button" value="开始">
  <input type="button" value="暂停">
  <div></div>
</body>
</html>
其实每点击一次,都会新开一个 setInterval( ),如果你不断点击按钮, setInterval( )就会累加起来。也就是说,当你点击 3 次按钮时,其实已经开了 3 个 setInterval( ),此时如果想要停下来,就必须点击 3 次【暂停】按钮。为了避免产生这个累加的 bug,我们在每次点击【开始】按钮时就要清除一次定时器,改进后的代码如下。
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style type="text/css">
    div{width: 100px;height: 100px;border: 1px solid silver;}
  </style>
  <script>
    window.onload = function(){
      var oBtn = document.getElementsByTagName("input");
      var oDiv = document.getElementsByTagName("div")[0];
      var colors = ["red","blue","orange","yellow","green","blue","purple"];
      var timer = null;
      var i = 0;
      oBtn[0].onclick = function(){
        clearInterval(timer);
        timer = setInterval(
          function(){oDiv.style.backgroundColor = colors[i];i++;i%=colors.length},1000
        )
        oBtn[1].onclick = function(){
          clearInterval(timer);
        }
      }
    }
  </script>
</head>
<body>
  <input type="button" value="开始">
  <input type="button" value="暂停">
  <div></div>
</body>
</html>
优化:每一次点击开始之后就清除一次计时器。
location 对象
在 JavaScript 中,我们可以使用 window 对象下的 location 子对象来操作当前窗口的 URL。所谓的 URL,指的就是页面地址。对于 location 对象,我们只需要掌握以下 3 个属性:
window.location.href
 <script>
    var url = window.location.href;
    document.write("URL: "+url);
</script>
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script>
    setTimeout(function(){
      window.location.href = "https://www.bilibili.com/";
    },2000);
  </script>
</head>
<body>
  <p>两秒后跳转</p>
</body>
</html>
window.location.search
我们可以使用 location 对象的 search 属性来获取和设置当前页面地址“?”后面的内容。
<script>
    document.write(window.location.search);
</script>
此时页面是空白的,我们在浏览器地址后面加上 ?id=1(要自己手动输入),再刷新页面,就会出现结果了。
window.location.hash
我们可以使用 location 对象的 hash 属性来获取和设置当前页面地址井号(#)后面的内容。
<script>
    document.write(window.location.hash);
</script>
navigator 对象
我们可以使用 window 对象下的子对象 navigator 来获取浏览器的类型。
<script>
    document.write(window.navigator.userAgent);
</script>
                    