JavaScript浏览器环境

来源:互联网 发布:msvcp120.dll丢失知乎 编辑:程序博客网 时间:2024/06/09 00:57

js浏览器环境

//js浏览器环境    # 在html页面中引入js代码    # 概述:DOM和BOM        . 页面中的js代码有一系列可以访问的对象            $ 当前载入页面所拥有的对象(可免有时候也加叫文档)                # 此对象集,称之为文档对象模型(DOM)                # DOM是一个标准化组件,由W3C负责制定,拥有多个不同版本,DOM level1,DOM level2,DOM level3(迄今为止最后一个版本),现代浏览器基本上都实现了DOM level1。DOM标准出现之前,各浏览器都有各自文档的实现(DOM 0),实际上并没有DOM level0标准存在,但其中大部分所有浏览器都实现了支持,这部分也被写入DOM level1标准。            $ 页面意外事务所拥有的的对象(即浏览器窗口和桌面屏幕)                # 此对象集,称之为浏览器对象模型(BOM)                # BOM不属于标准化组件,它的一部分对象集的到了所有浏览器的支持,另一部分则属于浏览器特性。    *************************************************************************    # BOM(浏览器对象模型)        . 通过全局对象window或window.screen来访问。        . window.navigator            #(用于反映浏览器本身及其功能信息的对象。)            # window.navigator.userAgent                .(显示用户代理字符串)                .(可以用来做浏览器检测)(但是避免使用此种方法,浏览器版本太多,太复杂,而且用户可以更改代理字符串来伪装浏览器)                .(一般用特性检测法做浏览器检测)        . window.location            # 一个用于存储当前载入页面URL信息的对象。                ***(demo)                    href = "http://search.phpied.com:8080/search?p=javascripts#results"                    hash:"#results"                    host:"search.phpid.com:8080"                    hostname:"search.phpid.com"                    pathname:"/search"                    port:"8080"                    protocol:"http:"                    search:"?p=javascripts"                ***(demo)            # location对象三个方法                . reload()  ==>  重新载入某个页面                    ***(demo)                        window.location.reload( url );                        window.location.href = window.location.href;                        location = location;                    ***(demo)                ****************************************************                . assign()    ==> 页面载入                . replace()   ==> 页面载入,(不会留下历史记录)                    ***(demo)                        window.location.href="http://www.baidu.com";                        location.href="http://www.baidu.com";                        location="http://www.baidu.com";                        location.assign( "http://www.baidu.com" );                        location.replace( "http://www.baidu.com" );                    ***(demo)                ( 两种方法使用完全相同,区别是replace()不会在history对象中留下记录,不能进行回退。 )                ****************************************************        . window.history            # 允许我们在一个浏览器会话( session )期间存储有限数量的浏览记录。            # 对象方法                . go()                . back()                . forward()                ***(demo)                    window.history.back();   ==>   回退一页                    window.history.forward(); ==>  前进一页                    window.history.go( -1 );  ==>   回退一页                    window.history.go( -2 );  ==>   回退两页                    window.history.go( 0 ;)   ==>   停留当前页                ***(demo)        . window.frames            # 当前页面中所有frame元素的集合,不区分frame和iframe。            # 无论当前页面是否存在frame元素,window.frames属性总是存在,并且指向了window对象本身。   (window.frames === window  ==>  true)            # 通过检测length属性来检测当前页面中是否含有frame元素。                *** window.frames.length  1  (1个frame元素)            # 访问iframe元素的window对象。                ***(demo)                    window.frames[0]                    window.frames[0].window                    frames[0].window                    frames[0]                ***(demo)            # 通过子元素来访问父级页面。 frames[0].parent === window  true            # top属性(访问到当前最顶层页面,包含所有其它frame元素的页面。)                ***(demo)                    window.frames[0].window.top === window                    window.frames[0].window.top === window.top                    window.frames[0].window.top === top                ***(demo)            # self属性(作用与window基本相同。)                ***(demo)                    self === window ==> true                ***(demo)        . window.screen            # 提供浏览器以外的桌面信息。            # Screen                availHeight:728  (除操作系统菜单栏以外的分辨率,任务栏等。)                availLeft:0                availTop:0                availWidth:1366                colorDepth:24   (显示器色位)                height:768   (总分辨率)                orientation:ScreenOrientation                pixelDepth:24                width:1366        . window.open()/close()            ***(demo)                var win = window.open(                     "http://www.baidu.com",  ==>  url                    "packt",                 ==>  新建窗口名称                    "width=300,height=300,resizable=yes"  ==>  功能列表                 );                * 通过检测win是否为falsy值来判断弹出框是否被屏蔽了。            ***(demo)        . window.moveTo()、window.resizeTo()            ***(demo)                window.moveTo( 100,100 )    ==> 当前窗口移动到100,100                window.moveBy( 10,-10 )  ==> 右移10,上移10                window.resizeTo()                window.resizeBy()            ***(demo)        . window.alert()、window.prompt()、window.confirm()            ***(demo)                var answer = window.confirm( "are you cool" );                var answer = window.prompt( "and your name was","axing" );            ***(demo)        . window.setTimeout()、window.setInterval()        . window.document            # window.document是一个BOM对象,表示当前所载入的文档(页面),但它的方法和属性同时也属于DOM对象的范围。    *************************************************************************    *************************************************************************    # DOM(文档对象模型)        // 通过DOM的方法和元素,我们可以访问到页面中的任何元素,并进行元素的修改,删除,添加等操作。        // Core Dom和HTML Dom            # Core Dom(Dom Level1中用于解析所有XML文档的那部分。)            # HTML Dom(Core Dom的基础上进行扩展的那部分。)        // Dom节点的访问            # document(文档节点)(我们当前所访问的文档)                (document ==> Document index.html)                . document.nodeType ==> 9                . document.nodeValue ==> null                . document.nodeName ==> "#document"            # documentElement                 (每个XML文档都有一个用来封装文档中其它内容的根节点,具体到HTML中,这个根节点就是<html>标签,我们可以通过document对象的documentElement属性来访问它。)                . document.documentElement ==> <html>                . document.documentElement.nodeType ==> 1(元素类节点)                . document.documentElement.nodeName ==> "HTML"                . document.documentElement.nodeValue ==> null                . document.documentElement.tagName ==> "HTML"                (对于元素类节点来说,nodeName和tagName属性等于其自身的名字。)            # 子节点                . hasChildNodes() ==> (判断一个节点是否含有子节点)                    $ document.documentElement.hasChildNodes() ==> true                . childNodes ==> (访问元素子节点)(兼容性问题)                    $ document.documentElement.childNodes.length ==>   (2/3)(不兼容)                    $ [0]  ==> <head>                    $ [1]  ==> <body>                 . parentNode ==> (访问元素父节点)                    # document.documentElement.childNodes[1].parentNode ==>  <html>             # 属性节点                . hasAttributes()  ==> (检查某个元素是否存在属性)                     $ document.documentElement.hasAttributes() ==> true                . 访问属性                    $ 通过索引值                        > .attributes[0]                    $ 通过属性名                        > .attributes['class']                    $ 通过getAttribute()方法                        > .getAttribute( 'class' )            # 访问标签中的内容                . textContent ==> 获取段落中的**文本**内容(会获取多余的空格)                    $ bd.childNodes[1].textContent                    XXX(不兼容IE 6,7,8)                    $ <p>段落文本<em>hello</em>ccc</p>                        ==> "段落文本helloccc         "                . innerText ==> 获取段落中的**文本**内容(没有多余的空格)                    $ bd.childNods[1].innerText                    XXX(兼容所有浏览器)                    $ <p>段落文本<em>hello</em>ccc</p>                        ==> "段落文本helloccc"                . innerHTML(不属于标准DOM组件)(返回指定节点中所有的HTML代码)                    $ bd.childNodes[3].innerHTML                         ==> "<em>second</em>paragraph"                 . 文本节点的nodeValue                    $ bd.childNodes[1].childNodes[0].nodeName ==> "#text"                    $ bd.childNodes[1].childNodes[0].nodeValue ==> "first paragraph"            # DOM访问的快捷方法                . getElementsByTagname() ==> "以标签名为参数,返回当前HTML页面中所有匹配该标签名的节点集合(一个数组类对象)"                    XXX列表中的各项可以用中括号或者item()方法来索引访问。                        ==>  document.getElementsByTagName( "p" ).item( 0 )  (不推荐使用)                        ==>  document.getElementsByTagName( "p" )[0](推荐使用)                . getElementsByName()                . getElementsByClassName()                . gteElementById()            # 兄弟节点,body元素及首尾子节点                . nextSiblings                . previousSiblings                . document.body ==> <body>                . document.body.nextSiblings ==> null                . document.body.previousSiblings ==> <head>                . firstChild <==> childNodes[0]                . lastChild <==> childNodes[childNodes.length-1]            # 新建节点                . createElement()                . createTextNode()                . appendChild()            // cloneNode() ==> 布尔参数,深拷贝(包含子节点)或浅拷贝(不包含子节点)            // insertBefore()             // removeChild() ==> 返回被移除节点的引用。            // replaceChild() ==> 在移除一个节点的同时将另一个节点放在其位置,返回被移除节点的引用。            // 访问文档的基本方法                (与DOM组件可以访问页面中的所有元素不同的是(甚至包括注释和空白处),JavaScript所能访问的内容只局限于一些HTML文档中的内容。)                # document.images ( 当前页面中所有元素的集合 ) <==> Core Dom组件中,document.getElementsByTagName( "img" );                 # document.applets                # document.links ==> 页面中所有含href属性的a标签                # document.anchors ==> 所有带name属性的链接                # document.forms ==> form标签的列表            // document.write()             // document.writeIn()                # document.write( "foo\n" )                # document.writeIn( "foo" )                    ==> 以上两种写法等效                ( *只能在页面被载入时能调用document.write(),如果页面载入之后调用,整个页面的内容会被替换掉。* )                ***(demo)                window.onload = function(){                    document.writeIn( "foo" );  ==> 内容全部被"foo"覆盖掉                }                ***(demo)            // Cookies,Title,Referrer,Domain                # document.cookie                # document.title ==> 并未改变title标签本身的值,只是改变了其在浏览器窗口中的显示内容。                    *** document.title="我是百小度"; ***                # document.referrer(拼写正确) ==> 记录我们之前所访问的页面的URL,与浏览器请求页面时所发送的HTTP头信息的Referer(拼写错误)值相同                # document.domain ==> 当前载入页面的域名                    // 域名的设置只能朝着非具体化的方向进行。                        * www.yahoo.com ==> yahoo.com 正确                        * yahoo.com ==> www.yahoo.com 错误            // 事件                # 内联HTML属性法                    <div onclick="alert( 'click' );">click</div>                # 元素属性法                    oDiv.onclick = function(){                        console.log( "啊哈!!!" );                    };                # DOM事件监听器                    (为一个事件指定多个监听函数,事件被处罚时,所有的监听函数都会被执行,互相之间相互独立,不知道彼此的存在,任何一个加入退出不会影响其它的工作。)                    oDiv.addEventListener( "click",function(){                        console.log( "123" );                    },false );                    oDiv.addEventListener( "click",console.log,false );                     (第三个参数确定是否采用捕捉法来处理事件。)                # 捕捉法与冒泡法                    ***(demo)                    <body>                        <ul>                            <li><a href="www.fxqp1202.com">blog</a></li>                        </ul>                    </body>                    ( 当我们单击a标签时,同时也单击了li,ul,body,甚至整个document对象,对该链接的点击可以看做是对document对象的点击,形成一个事件传播链。 )                    ***(demo)                    --------------------------------------------------                    <img src="images/dom_event_propagation.png" alt="DOM LEVEL2级事件传播"/>                    由DOM Level2,事件传播分为3个阶段:先在标签上使用捕捉法, 而后使用冒泡法。也就是说,事件传播的路径是从document到相关标签,然后回到document。                    --------------------------------------------------                    (事件传播过程的实现有两种方式)                    // 捕捉法                        ==> document -> ul -> li -> a链接                    // 冒泡法                        ==> a链接 -> li -> ul -> document                        (用ev.eventPhase来查看某一事件的当前所处阶段。)                        (事件对象的eventPhase属性返回事件传播的当前阶段。它的值是下面的三个常量之一,它们分别表示捕获阶段、正常事件派发和起泡阶段。)                        ***                            常量  值                            Event.CAPTURING_PHASE   1                            Event.AT_TARGET         2                            Event.BUBBLING_PHASE    3                        ***                    ***(demo)                    var oDiv = document.getElementById( "box" );                    oDiv.addEventListener( "click",function(){                        console.log( "oDiv被点击" );                    },true );                    document.addEventListener( "click",function(){                        console.log( "document被点击" );                    },true );                    window.addEventListener( "click",function(){                        console.log( "window被单击" );                    },true );                    true ==> 使用捕获式                        1. window被单击                        2. document被点击                        3. oDiv被点击                    false ==> 禁止捕获式(使用冒泡式)                        1. oDiv被点击                        2. document被点击                        3. window被单击                    ***(demo)                       ¥¥¥                         (对于DOM标准来说,window事件是不存在的,这就是为什么DOM指的是文档而不是浏览器。)                                 ¥¥¥                    ***(匿名函数监听器无法被移除)                        oDiv.addEventListener( "click",function(){                            console.log( "此种形式监听器无法被移除" );                        },false );                    ***(匿名函数监听器无法被移除)                    ***(移除事件)                        removeEventListener( "",function(){},false )                    ***(移除事件)                # 阻断传播(阻止冒泡式行为)                    ***(demo)                        // 事件处理函数                        function handleEvent( ev ){                            var ev = ev || window.event;                            console.log( "我被禁止冒泡了" );                            ev.stopPropagation();                        }                        oDiv.addEventListener( "click",handleEvent,false );                    ***(demo)                # 防止默认行为                    // 相关事件对象调用preventDefault()方法。                    ***(demo)                        (阻止a标签默认跳转行为)                        a.addEventListener( "click",function( ev ){                            var ev = ev || window.event;                            if( ev.cancelable ){                                ev.preventDefault();                            }                        },false );                    ***(demo)                    &&&并不是所有事件的默认行为都是可以阻止的,检测事件对象的cancellable属性。&&&                # 跨浏览器事件监听器(IE6,7,8)                    // attachEvent()(事件监听方法)                     // window.event (全局事件对象)                    // srcElement (对应于DOM2级浏览器中事件触发元素的target属性)                    // 不支持捕捉法                    // returnValue设为false (对应于DOM2级浏览器的preventDefault()方法来阻止事件默认行为)                    // cancleBubble设置为true (对应于DOM级浏览器的stopPropagation()阻止冒泡方法。)                    // detachEvent() (对应于DOM2级浏览器的removeEventListener())                    ***(demo)                        (各浏览器兼容版本)                        function callback( ev ){                            var ev = ev || window.event;                            var target = ( typeof ev.target != 'undefined')?ev.target:ev.srcElement;                            console.log( target.nodeName );                        }                        // 事件监听                        if( document.addEventListener ){                            document.addEventListener( "click",callback,false );                        }else if( document.attachEvent ){                            document.attachEvent( "onclick",callback );                        }else{    // IE5之前的IE版本,不用考虑                            document.onclick = callback;                        }                    ***(demo)                # 事件类型                    // 自行查阅。。。            // 从IE9开始,实现了更多的DOM Level2标准。    *************************************************************************
1 0