JavaScript权威指南笔记14

爱⌒轻易说出口 提交于 2019-12-04 10:26:49

第14章、window对象
1、计时器
    I-1 setTimeout()和setInterval()可在指定时间后调用
        setTimeout()返回值可传递给clearTimeout()用于取消该函数的执行。
            多久后执行。
        setInterval()指定时间间隔里重复调用(每隔多久执行)
        例:计时器
        /*
         *安排函数f()在未来的调用模式
         *在若干毫秒后调用f()
         *如果设置了interval并没有设置end参数,则对f()调用将不会停止
         *只有指定了f(),才会从start=0的时刻开始
         *调用invoke()不会阻塞,它会立即返回
         */
        function invoke(f,start,interval,end){
            if(!start) start=0;
            if(arguments.length<=2)
                setTimeout(f,start);
            else{
                setTimeout(repeat,start);
                function repeat(){
                    var h = setInterval(f,interval); //循环调用f()
                    //在end毫秒后停止调用,前提是end已经定义了
                    if(end) setTimeout(function(){clearInterval(h);},end);
                }
            }
        }
        若参数f不是函数而是字符串,那么这个字符串会在指定时间后进行求值(相当于eval())
2、浏览器定位和导航
    I-1 Window对象的location属性引用的是Location对象,Document对象的location属性也引用到Location对象。
        window.location ===document.location;//总是返回true
        显示文档的URL,并定义了方法来使窗口载入新的文档。
        Document对象的URL属性
        document.URL属性不会对定位到文档中的片段标识符做相应的更新,Location对象会。
    I-2 解析URL
        Location对象,表示该窗口中当前显示的文档的URL
        Location对象的href属性是一个字符串,包含URL的完整文本
        Location对象的toString()返回href属性的值,所以隐式调用时可用
            location代替location.href。
        另外,这个对象的其他属性(URL分解属性):
        protocol,host,hostname,port,pathname和search,分别表示URL的各个部分
        同时被Link对象支持。
        Location对象的hash和search属性:
        hash属性返回URL中的"片段标识符"部分。
        search属性返回的是问号之后的URL。用来参数化URL并在其中嵌入参数。

        例:urlArgs()函数,提取URL的搜索字符串中的参数
        /*这个函数用来解析来自URL的查询串中的name=value参数对
         *它将name=value对存储在一个对象属性中,并返回该对象
         *
         *var args = urlArgs();
         *var q = args.q||"";
         *var n = args.n?parseInt(args.n):10;
         */
         function urlArgs(){
             var args = {};
            var query = location.search.substring(1); //查找到查询串,并去掉'?'
            var pairs = query.split("&");    //根据&符号将查询串隔开
            for(var i =0;i<pairs.length;i++){
            var pos = pairs[i].indexOf('=');//查找"name=value"
                if(pos==-1) continue;    //没有就跳过
                var name =pairs[i].substring(0,pos);//提取name
                var value =pairs[i].substring(pos+1);//提取value
                value = decodeURIComponent(value);//对value进行解码
                args[name] = value;    //存储为属性
            }
            return args;    //返回解析后的参数
        }
    I-3 载入新的文档
        Location对象的assign()和replace()方法

        //如果浏览器不支持XMLHttpRequest对象
        //则将其重定向到一个不需要Ajax页面的静态页面
        if(!XMLHttpRequest) location.replace("staticpage.html");
        
        Location对象的reload()方法,让浏览器重新载入当前文档。
        跳转新页面可直接把URL赋给location属性:
        location = "http://www.baidu.com";
        还可把相对URL副歌location,相对当前URL进行解析:
        location = "page2.html";
        片段标识符(相对URL的一种),滚动到文档的某个位置 "#top"查找ID为top的元素,
        没有就跳到文档顶部:
        location ="#top";
        改变hash属性,则在当前文档中进行跳转
        location.search = "?page="+(pagenum+1); //载入下一个页面

3、浏览历史
    I-1 Window对象的history属性引用的是该窗口的History对象。
        length属性表示浏览历史列表的元素数量。
        History对象的back()和forward()方法与浏览器的后腿和前进按钮一样。
            可使浏览器在浏览历史中前后跳转一格。
        go()接受一个整数参数,正整数(向前),负整数(向后跳过任意多个页)
        history.go(-2);//相当于单击后退两次
4、浏览器和屏幕信息
        navigator和screen属性(引用Navigator和Screen对象)
    I-1 Navigator对象 使用其四个属性可用于浏览器嗅探
        appName Web浏览器全称,如IE:"Microsoft Internet Explorer",Firefox及其他通常是"Netscape",网景浏览器
        appVersion 浏览器版本信息和厂商
        userAgent 浏览器在它的USER-AGENT HTTP头部中发生的字符串。通常包含appVersion中的所有信息
        platform 在其上运行浏览器的操作系统(并且可能是硬件)的字符串
        
        另
        onLine 表示浏览器当前是否连接到网络。
        geolocation Geolocation对象定义用于确定用户地理位置信息的接口。
        javaEnabled() 非标准方法,判断浏览器是否可以运行java小程序。
        cookieEnabled() 是否可以保存永久的cookie。
    I-2 Screen对象 提供有关窗口显示大小和可用的颜色数量的信息
        属性width和height指定以像素为单位的窗口大小。
        属性availWidth和availHeight指定实际可用的显示大小。
        属性colorDepth指定显示的BPP(bits-per-pixel)值,典型的值有16、24和32
        可用来确定web应用是否运行在一个小屏幕的设备上。如果屏幕有限可选择更小的字体和图片等。
5、对话框
    I-1 三个方法显示
        alert()  显示消息并等待关闭
        confirm() 显示消息并要求点击确定或取消
        prompt() 显示消息,等待用户输入字符信息,并返回字符串。
        do{
            var name = prompt(What is your name?);
            var correct = confirm("you entered '"+name+"'.\n"+
            "Click Okay to proceed or Cancel to re-enter.");
        }while(!correct)
        alert("Hello,"+name);
        
        方法confirm()和prompt()都会产生阻塞。alert()大多数浏览器上会。
        以上都显示纯文本。
        showModalDialog() 显示包含HTML格式的"模态对话框":显示后就不能点选位于其下面的对话框。
        例:使用showModalDialog()的HTML文件
        <!--
        var p = showModalDialog("multiprompt.html",["Enter 3D point coordinates","x","y","z"],
                    "dialogwidth:400;dialogheight:300;resizable:yes");
        -->
        <form>
        <fieldset id="fields"></fieldset><!--对话框的正文部分-->
        <div style="text-align:center">     <!--关闭对话框的按钮-->
        <button onclick="okay()">Okay</button>    <!--设置返回值和关闭事件-->
        <button onclick="cancel()">Cancel</button><!--关闭时不带返回值-->
        </div>
        <script>
        //创建对话框的主体部分,并在fieldset中显示出来
        var args = dialogArguments;
        var text = "<legend>"+args[0]+"</legend>";
        for(var i=1;i<args.length;i++)
            text += "<label>"+args[i]+":<input id='f"+i+"></label><br>";
        document.getElementById("fields").innerHTML=text;

        //直接关闭这个对话框,不设置返回值
        function cancel(){window.close();}

        //读取输入框的值,然后设置一个返回值,之后关闭
        function okay(){
            window.returnValue = [];
            for(var i=1;i<args.length;i++)
                window.returnValue[i-1] =document.getElementById("f"+i).value;
            window.close();
        }
        </script>
        </form>
6、错误处理
    I-1 onerror属性(事件处理程序)传入三个字符串参数
        参数1,错误信息的描述
        参数2,发生错误的文档的URL
        参数3,文档中发生错误的行数
        window.onerror = function(msg,url,line){
            if(onerror.num++<onerror.max){
                alert("ERROR:"+msg+"\n"+url+":"+line);
                return true;
            }
        }
        onerror.max=3;
        onerror.num=0;
7、Window对象属性的文档元素(作为全局变量)
    id 不能定义为window对象已占有的属性名(history、location、navigation)。
    
    若文档中包含一个id为"x"的元素(已是全局的了),并且还在代码中声明并赋值给全局变量x,那么显式声明的变量
    会隐藏隐式的元素变量。
    若声明的同名变量在元素之前,则会阻止元素获取window属性,在元素之后则会覆盖该属性的隐式值。
    例:
    var ui =["input","prompt","heading"];//数组中存放要查找的元素id
    ui.forEach(function(id)){         //用每个id查找对应的元素
        ui[id] = document.getElementById(id);//将其存放在一个属性中
    });
    这样就可用全局变量input(即window.input)代替ui.input
    var $ = function(id){return document.getElementById(id);};
    ui.prompt = $("prompt");

    id元素在文档中是唯一的,name属性可以有多个相同的,具有该名称的隐式全局变量
    会引用一个类数组对象,其元素就是所有命名的元素。
    <iframe>中的name或id不会引用元素自身的Element对象,而是引用<iframe>元素创建的嵌套浏览器窗体的Window对象.
8、多窗口和窗体
    一个Web浏览器窗口->多个标签页(每页独立的browsing context,独立的Window对象),互不干扰。
    嵌套的浏览上下文之间并不是独立的,在一个窗体中可以看到它的祖先和子孙窗体。(同源策略的限制)

    若有同源策略的限制,则可以使用另一个窗口定义的对象、属性和方法。
    HTML5提供一个基于事件的消息传输API,可以间接通信。

    I-1 打开和关闭窗口
        Window.open()载入指定的URL到新的或已存在的窗口中,并返回代表那个窗口的Window对象。4个可选参数
        参数1,要在新窗口显示的文档的URL,省略则使用空页面的URL about:blank
        参数2,新窗口的名字,若是已经存在的名字,则直接跳转。省略则使用指定的名字,"_blank"
            只有设置的允许导航(allowed to navigate)的页面才可以通过窗口名字来操纵这个窗口的Web应用。
            嵌套窗体可相互导航,可使用"_top"(顶级祖先窗口)和"_parent"(直接父级)来获取彼此的上下文
        参数3,一个以逗号分隔的列表,包含大小和各种属性(菜单栏、状态栏、工具栏和地址栏),用以表明新窗口是如何打开的
        var w = window.open("smallwin.html","smallwin","width=400,height=350,status=yes,resizable=yes");
        参数4,布尔值,已存在同名(参数2)窗口时,是覆盖替换(true),还是创建一个新的(false),后者是默认值

        opener属性引用的是打开它的脚本的Window对象(即父窗口的window对象),在新打开的窗口中其值为null
        关闭窗口:window.close();//要显示调用,避免和Document对象的close()方法混淆
        已关闭的窗口,代表它的Window对象还存在,即close属性为true,document为null,但它的方法不会再工作了。
    I-2 窗体之间的关系
        通过opener属性可以打开它的原始窗口,两者相互调用,读取属性

        代表自己的window或self,引用父窗口的parent
        parent.history.back();
        parent ===self;        //只有顶级窗口才返回true,top直接引用顶级
        
        通过获取<iframe>元素引用子窗体
        <iframe id ="f1">
        var iframeElement = document.getElementById("f1");
        <iframe>元素的contentWindow属性,引用该窗体的Window对象
        var childFrame = document.getElementById("f1").contentWindow;
        frameElement属性引用父窗口的Window对象,顶级窗口的该属性值为null
        var elt = document.getElementById("f1");
        var win = elt.contentWindow
        win.fromeElement ===elt        //=>true
        window.frameElement ===null    //=>true

        类数组frames,引用自身包含的窗口(窗体)的子窗体(不含自身),通过数字或窗体名进行索引
        如:第一个子窗体frame[0]
        引用自己的兄弟窗体parent.frames[1]
        注意:数组里的是Window对象,而不是<iframe>元素
        若指定<iframe>元素的name或id属性,那么还可以通过名字索引
        frames["f1"]或frames.f1

        词法作用域限制,变量或函数的作用范围取决于定义它的作用域,而不是调用它的。


 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!