• JavaScript学习笔记(九)---- BOM


    • window对象----BOM的核心
    • 控制窗口、框架和弹出窗口
    • 利用location对象中的页面信息
    • 使用navigator对象

    (一)window对象

    在浏览器中,window对象有双重角色:既是通过Javascript访问浏览器窗口的一个接口,又是ECMAScript规定的Global对象。

    1.全局作用域

    在全局作用域中声明的变量、函数都会变成window对象的属性和方法。

    var age = 29;
    function sayAge(){
        alert(this.age);
    }
    alert(window.age); //29
    sayAge(); //29
    window.sayAge();//29
    View Code

       注意两点:

      1)定义全局变量与window对象上直接定义属性的差别  

    var age = 29;
    window.color = "red"; 
    • 全局变量不能通过delete操作符删除
    var deleAge = delete window.age;
    alert(deleAge); //false
    alert(window.age); //29
    • 直接在window对象上定义的属性可以使用delete操作符删除
    var deleColor = delete window.color;
    alert(deleColor); //true
    alert(window.color); //undefined

    使用var语句添加的window属性有一个名为[[Configurable]]的特性,这个特性的值被设置为false,因此不可以通过delete操作符删除。

       2)尝试访问未声明的变量会抛出错误,但是通过查询window对象,可以知道某个可能未声明的变量是否存在。   

    var newValue = oldValue;
    alert(newValue); //ReferenceError: oldValue is not defined
    var newValue = window.oldValue;
    alert(newValue); //null

    2.窗口关系及框架

      top对象始终指向最外围的框架,也就是整个浏览器窗口。

      parent对象表示包含当前框架的框架。

      self对象则回指window。

    所有这些对象都是window对象的属性,都可以通过window.parent、window.top等形式来访问。

    3.窗口位置

    • screenLeft 和 screenTop属性

       分别表示窗口相对与屏幕左边和上边的位置。IE、Safari、Opera和Chrome提供了该属性。

    • screenX 和screenY属性 

       Firefox提供了该属性,Safari和Chrome也同时支持这个属性。

      兼容性考虑:跨浏览器取得窗口左边和上边的位置代码,如下

    var leftPos = (typeof window.screenLeft=="number")? window.screenLeft:window.screenX;
    var topPos = (typeof window.screenTop == "number")? window.screenTop:window.screenY;
    
    alert("LeftPos:"+ leftPos); //0
    alert("TopPos:"+ topPos); //0

    4.窗口大小

    跨浏览器确定一个窗口的大小不是一件简单的事。

    IE9+、FireFox、Safari、Opera和Chrome均为此提供了4个属性:innerWidth、innerHeight、outerHeight、outerWidth。

    • outerWidth 和 outerHeight

       在IE9+、FireFox 和 Safari 中,返回浏览器窗口本身的尺寸。

       在Opera中,这两个属性的值表示页面视图容器的大小。

    • innerWidth 和 innerHeight

        表示该容器中页面视图区的大小(减去边框宽度)。

    • document.documentElement.clientWidth 和 document.documentElement.clientHeight 

       在IE、Firefox、Safari、Opera 和 Chrome中,取得页面视口的大小。

    • document.body.clientWidth和clientHeight

       在混杂模式下的Chrome,通过该属性取得视口的大小。

    取得视口大小的代码:

    document.compatMode 用来判断当前浏览器采用的渲染方式;CSS1Compat表示标准兼容模式开启,BackCompat表示标准兼容模式关闭
    var pageHeight = window.innerHeight;
    var pageWidth = window.innerWidth;
    //alert(pageHeight +" "+ pageWidth); //undefined undefined
    
    //alert(document.compatMode); //CSS1Compat
    if(typeof pageHeight !="number"){    
        if(document.compatMode == "CSS1Compat"){ 
            pageHeight = document.documentElement.clientHeight;
            pageWidth = document.documentElement.clientWidth;
        }else{
            pageHeight = document.body.clientHeight;
            pageWidth = document.body.clientWidth;
        }
    }
        
    alert("Height:"+pageHeight+"; Width:"+pageWidth);    //Height:402;Width:954

    5.导航和打开窗口

    • window.open()

       可以接收4个参数:要加载的URL、窗口目标、描述新窗口特性字符串、新页面是否取代浏览器历史激励中当前加载页面的布尔值。

    <body>
          <p>
              This will open a new window/tab:
            <input type="button" value="Go to w3school" onclick="window.open('http://www.w3school.com.cn/')"/>
        </p>
        <p>
            This will open in the current window/tab:
            <input type="button" value="Go to w3school" onclick="window.open('http://www.w3school.com.cn/','_self')">
        </p>
        <p>
            This will open a small new  window/tab:
            <input type="button" value="Go to w3school" onclick="window.open('http://www.w3school.com.cn/','','height=400,width=400,top=10,left=10,resizable=yes')">
        </p>
    </body>
    •  window.resizeTo(width,height) 和 window.moveTo(left,top)
    function openNewWindow(){
        var newWin = window.open('http://www.w3school.com.cn','','top=50,width=300,height=300,left=50');
        newWin.resizeTo(600,600); //窗口大小600*600
        newWin.moveTo(100,0); //窗口位置左100,上0
    }
    openNewWindow();
    • window.resizeBy(widthIncrease,heightIncrease) 和 window.moveTo(leftIncrease,topIncrease)
    function openNewWindow(){
        var newWin = window.open('http://www.w3school.com.cn','','top=50,width=300,height=300,left=50');
        newWin.resizeBy(600,600); //在原来300*300的基础上增加了(600,600) -> (900,900)
        newWin.moveBy(100,0); //在(50,50)的基础上移动了(100,0)->(150,50)
    }
    openNewWindow();
    • 使用try...catch块儿检测window.open()弹出的窗口是否被屏蔽
    var blocked = false;
    try{
        var win = window.open('http://www.w3school.com.cn','_blank');
        if(win==null){
            blocked = true;
        } 
    }catch(ex){
         blocked=true;
    }
    if(blocked){
         alert("The popup was blocked");
    }

    6.间歇调用和超时调用

    Javascript是单线程语言,但它允许通过设置超时值(在指定的时间过后执行代码)和间歇值(每隔指定的时间就执行一次代码)来调度代码在特定的时刻执行。

    • 超时调用:window对象的setTimeout()方法

      两个参数:第一个参数要执行的代码,可以是字符串(就和eval( )执行函数中使用的字符串一样),也可以是一个函数,可以直接传入函数名字。第二个参数以毫秒表示的时间(即在执行代码前需要等待多少毫秒)。

      例如:在一秒钟后显示一个警告框

    setTimeout(function(){
        alert("hello world");
    },1000);

      注意:正因为Javascript是单线程的解释器,因此一段时间内只能执行一段代码。setTimeout()的第二个参数告诉Javascript再过多长时间把当前任务添加到队列中。如果队列是空的,就立即执行;如果队列非空,那就等前面的代码执行完了以后再执行。

      调用setTimeout()之后,该方法返回一个数值ID,表示超时调用。超时调用ID是计划执行代码的唯一表示符,可以通过它来取消超时调用。

    var timeoutId = setTimeout(function(){
        alert("hello world");
    },3000);
    clearTimeout(timeoutId);
    View Code
    • 间歇调用:window对象的setInterval()方法

        与setTimeout()方法类似。

    例如:每个5秒弹出一个提示。

    setInterval(function(){
        alert("hello world!");
    },5000);

    调用setInterval()方法同样也会返回一个间歇调用ID,该ID可用于在将来的某个时刻取消间歇调用。取消间歇调用的重要性要远远高于取消超时调用,因为在不加干涉的情况下,间歇调用将会一直执行到页面卸载。

    例如:如果执行次数达到了max设定的值,则取消后续尚未执行的调用

    var num = 0;
    var max = 10;
    function incrementNumber(){
        num++;
        if(num == max){
            clearInterval(intervalId);
            alert("Done");
        }
    }
    intervalId = setInterval(incrementNumber,500);

    同样,使用setTimeout()方法,完成该操作

    var num = 0;
    var max = 10;
    function incrementNumber(){
        num++;
        if(num < max){
            setTimeout(incrementNumber,500);        
        }else{
            alert("Done");
        }
    }
    setTimeout(incrementNumber,500);
    View Code

    7.系统对话框

     浏览器通过alert()、confirm()和prompt()方法可以调用系统对话框向用户显示消息。

    • 对话框的外观有操作系统或浏览器设置决定,而不是由CSS决定。
    • 显示这些对话框的时候代码会停止执行,而关掉这些对话框后代码又会恢复执行。
    var result = prompt("hello",'');
    if(result!=null){
        alert("hello "+ result);
    }
    • window.find()相当于Ctrl+F查找
    • wind.print()弹出打印配置页面

    (二)location对象

    location是最有用的BOM对象之一,它提供了与当前窗口中加载的文档有关的信息,还提供了一下导航功能。

    • location对象既是window对象的属性,也是document对象的属性。换句话说,window.location和document.location引用的是同一个对象。
    • location将URL解析为独立的片段,让开发人员通过不同的属性访问这些片段。
    • location对象的所有属性:

     假设初始URL为http://www.baidu.com/

    (1)将URL修改为http://www.baidu.com/#section1

    location.hash = "#section1";

    (2)将URL修改为http://www.baidu.com/?q=javascript

    location.search = "?q=javascript";

    (3)将URL修改为http://www.yahoo.com.cn

    location.hostname = "www.yahoo.com.cn";

    (4)将URL修改为http://www.baidu.com/mydir

    location.pathname = "mydir";

    (5)将URL修改为http://www.baidu.com:8080

    location.port = 8080
    • 每次修改location属性(hash除外),页面都会以新URL重新加载。
    • 通过上述任何一种方式修改URL之后,用户通过单击“后退”按钮都会导航到前一个页面。要禁用这种行为可以使用replace()方法。

    replace()方法:

    setTimeout(function(){
            location.replace("http://www.w3school.com.cn/");        
        },3000);

    (三)navigator对象

     包含诸多属性,用于识别客户端浏览器的信息等。

    alert(navigator.appCodeName); //Mozilla
        alert(navigator.appName);//firefox/chrome-->Netscape;IE-->Micrsoft Internet Explorer;
        alert(navigator.cookieEnabled);//true/false

    1.检测插件

     检测浏览器中是否安装了特定的插件式一种最常见的检测用法。

     1)对于非IE浏览器,使用plugins数组来达到这个目的。数组中的每一项都包含下列属性:

        name:插件的名字。

        description:插件的描述。

        filename:插件的文件名。

        length:插件所处理的MIME类型数量。

            例如:输出Firefox中安装的所有插件信息

        for(var i=0;i<navigator.plugins.length;i++){
            document.write("name: "+navigator.plugins[i].name+"<br/>"+
                           "description: "+navigator.plugins[i].description+"<br/>"+
                           "filename: "+navigator.plugins[i].filename+"<br/>"+
                           "length: "+navigator.plugins[i].length+"<br/>"
                           );        
            document.write("<br><hr/>");
        }

      输出结果:

    例如:检测浏览器中是否安装了某插件(在IE中无效),在Firefox、Safari、Opera和Chrome中可以使用这种方法来检测插件。

    function hasPlugin(name){
            name = name.toLowerCase();
            for(var i=0;i<navigator.plugins.length;i++){
                if(navigator.plugins[i].name.toLowerCase().indexOf(name)>-1){
                    return true;
                }
            }
        }
    
            //检测Flash插件
            alert(hasPlugin("Flash"));//true

    循环迭代每个插件并将插件的name与给定的名字进行比较。

      2)检测IE中的插件

       IE不支持Netscape式的插件。在IE中检测插件的唯一方式就是使用专有的ActiveXObject类型,并尝试创建一个特定的插件的实例。IE是以COM对象的方式实现插件的,而COM对象使用唯一标示符来识别。因此,要想检查特定的插件,就必须知道其COM标识符。

      例如:检测IE中的插件

    function hasIEPlugin(name){
        try{
            new ActiveXObject(name);
            return true;
        }catch(ex){
            return false;
        }
    }
    alert(hasIEPlugin("ShockwaveFlash.ShockwaveFlash"));

    (四)screen对象

    screen对象基本上只用来表明客户端的能力,其中包括浏览器窗口外部的显示器的信息,如像素宽度和高度等。

    alert(screen.availWidth+"*"+screen.availHeight); //1280*984

    (五)history对象

    history对象保存着用户上网的历史记录,从窗口被打开的那一刻算起。

    • go()方法

      go()接受一个参数,表示向后或向前跳转的页面数的一个整数值。负数表示向后跳转,正数表示向前跳转。  

    history.go(-1); //后退一页
    history.go(2);  //向前两页
    • back():后退一页
    history.back();
    • forward():前进一页
    history.forword();
    • length属性:保存历史记录的数量

     history.length等于0,表示用户打开窗口的第一个页面。

  • 相关阅读:
    基本排序算法
    Ubuntu下fcitx安装。(ibus不会用)
    sublime搭建Java编译平台及编码问题
    Centos6.5(final)安装gcc和g++,python以及导致问题的解决方法
    如何查询centos查看系统内核版本,系统版本,32位还是64位
    vim插件之SnipMate
    Linux rename命令
    Hadoop安装(Ubuntu Kylin 14.04)
    vim 文字插入
    Checkbox indeterminate属性
  • 原文地址:https://www.cnblogs.com/yanyangbyou/p/3962252.html
Copyright © 2020-2023  润新知