-_-#【JS】HTML5 API

《JavaScript高级程序设计(第3版)》

 

<!DOCTYPE html>

<html>

<head>

    <meta charset="utf-8">

    <title></title>

</head>

<body>

    <ul class="list">

        <li class="item">1</li>

        <li class="item">2</li>

        <li class="item current">3</li>

    </ul>

    <button id="myButton">button</button>

    <script>

        /**

         * getElementsByClassName()

         * 支持 getElementsByClassName()方法的浏览器有 IE 9+、Firefox 3+、Safari 3.1+、Chrome 和 Opera 9.5+

         */

        +function() {

            var nodeList = document.getElementsByClassName('item current') // item && current

            console.log(nodeList)

            var nodeList = document.getElementsByClassName('item')

            console.log(nodeList)

        }();



        /**

         * classList

         * 支持 classList 属性的浏览器有 Firefox 3.6+和 Chrome

         * add(value)

         * contains(value)

         * remove(value)

         * toggle(value)

         */

        +function() {

            var nodeList = document.getElementsByClassName('item')

            nodeList.item(0).classList.add('current')

            nodeList.item(2).classList.remove('current')

        }();



        /**

         * document.activeElement document.hasFocus()

         * 实现了这两个属性的浏览器的包括 IE 4+、Firefox 3+、Safari 4+、Chrome 和 Opera 8+

         * 元素获得焦点的方式有页面加载、用户输入(通常是 通过按 Tab 键)和在代码中调用 focus()方法

         * 默认情况下,文档刚刚加载完成时,document.activeElement 中保存的是 document.body 元 素的引用。

         * 文档加载期间,document.activeElement 的值为 null

         * 查询文档获知哪个元素获得了焦点,以及确定文档是否获得了焦点

         * 通过检测文档是否获得了焦点,可以知道用户是不是正在与页面交互

         */

        +function() {

            console.log(document.activeElement)

            console.log(document.hasFocus())

            var button = document.getElementById('myButton')

            button.focus()

            console.log(document.activeElement === button)

            console.log(document.hasFocus())

        }();



        /**

         * document.readyState

         * 支持 readyState 属性的浏览器有 IE4+、Firefox 3.6+、Safari、Chrome 和 Opera 9+

         * IE4 最早为 document 对象引入了 readyState 属性。

         * 然后,其他浏览器也都陆续添加这个属性, 最终 HTML5 把这个属性纳入了标准当中

         * Document 的 readyState 属性有两个可能的值

         * loading,正在加载文档

         * complete,已经加载完文档

         */

        +function() {

            if (document.readyState == 'complete') {

                console.log('complete')

            }

        }();



        /**

         * document.compatMode

         * 陆续实现这个属性的浏览器有 Firefox、Safari 3.1+、Opera 和 Chrome

         * 标准模式 CSS1Compat

         * 混杂模式 BackCompat

         */

        if (document.compatMode == 'CSS1Compat') {

            console.log('Standards mode')

        } else {

            console.log('Quirks mode')

        }



        /**

         * 作为对 document.body 引用文档的<body>元素的补充,HTML5 新增了 document.head 属性, 引用文档的<head>元素

         * 实现 document.head 属性的浏览器包括 Chrome 和 Safari 5

         */

        var head = document.head || document.getElementsByTagName('head')[0]

        console.log(head)

    </script>

</body>

</html>

 

<!DOCTYPE html>

<html>

<head>

    <meta charset="utf-8">

    <title></title>

</head>

<body>

    <ul class="list">

        <li class="item" data-appId="12345" data-my-name="na">1</li>

        <li class="item">2</li>

        <li class="item current">3</li>

    </ul>

    <div id="box1">box1</div>

    <div id="box2">box2</div>

    <div id="box3" style="margin-top:600px">box3</div>

    <div id="box4">box4</div>

    <script>

        /**

         * document.charseet

         * document.defalutCharset

         * 表示根据默认浏览器及操作系统的设置,当前文档默认的字符集 应该是什么

         * 支持 document.charset 属性的浏览器有 IE、Firefox、Safari、Opera 和 Chrome。

         * 支持 document.defaultCharset 属性的浏览器有 IE、Safari 和 Chrome

         */

        console.log(document.charset, document.defaultCharset)



        // dataset

        var firstLi = document.querySelector('.item')

        firstLi.setAttribute('data-appId2', '54321')

        firstLi.setAttribute('data-my-name2', 'nana')

        // chrome DOMStringMap {appid: "12345", myName: "na", appid2: "54321", myName2: "nana"}

        console.log(firstLi.dataset)

        if (firstLi.dataset.appid) {

            firstLi.dataset.appid = 111111

        }



        var lastLi = document.querySelectorAll('.item')[2]

        lastLi.dataset.appId = 'data-app-id'

        lastLi.dataset.appid = 'data-appid'



        /**

         * innerHTML

         * 但是,不同浏览器返回的文本格式会有所不同。

         * IE 和 Opera 会将所有标签转换为大写形式,

         * 而 Safari、 Chrome 和 Firefox 则会原原本本地按照原先文档中(或指定这些标签时)的格式返回 HTML,包括空格 和缩进。

         * 不要指望所有浏览器返回的 innerHTML 值完全相同

         *

         * 并不是所有元素都支持 innerHTML 属性。

         * 不支持 innerHTML 的元素有:<col>、<colgroup>、 <frameset>、<head>、<html>、<style>、<table>、<tbody>、<thead>、<tfoot>和<tr>。

         * 此 外,在 IE8 及更早版本中,<title>元素也没有 innerHTML 属性

         */



        /**

         * outerHTML

         * 支持 outerHTML 属性的浏览器有 IE4+、Safari 4+、Chrome 和 Opera 8+。

         * Firefox 7 及之前版本都不 支持 outerHTML 属性

         */

        document.getElementById('box1').outerHTML = '<p>This is a paragraph.</p>'



        /**

         * insertAdjacentHTML

         * 支持 insertAdjacentHTML()方法的浏览器有 IE、Firefox 8+、Safari、Opera 和 Chrome

         */

        var element = document.querySelector('#box2')

        //作为前一个同辈元素插入

        element.insertAdjacentHTML("beforebegin", "<p>Hello world!</p>")

        //作为后一个同辈元素插入

        element.insertAdjacentHTML("afterend", "<p>Hello world!</p>")

        //作为第一个子元素插入

        element.insertAdjacentHTML("afterbegin", "<p>Hello world!</p>")

        //作为最后一个子元素插入

        element.insertAdjacentHTML("beforeend", "<p>Hello world!</p>")



        /**

         使用本节介绍的方法替换子节点可能会导致浏览器的内存占用问题,尤其是在 IE 中,问题更加明

显。在删除带有事件处理程序或引用了其他 JavaScript 对象子树时,就有可能导致内存占用问题。假设 某个元素有一个事件处理程序(或者引用了一个 JavaScript 对象作为属性),在使用前述某个属性将该元 素从文档树中删除后,元素与事件处理程序(或 JavaScript 对象)之间的绑定关系在内存中并没有一并 删除。如果这种情况频繁出现,页面占用的内存数量就会明显增加。因此,在使用 innerHTML、 outerHTML 属性和 insertAdjacentHTML()方法时,最好先手工删除要被替换的元素的所有事件处理 程序和 JavaScript 对象属性



         在插入大量新 HTML 标记时,使用 innerHTML 属性与通过多次 DOM 操作先创建节点再指定它 们之间的关系相比,效率要高得多。这是因为在设置 innerHTML 或 outerHTML 时,就会创建一个 HTML 解析器。这个解析器是在浏览器级别的代码(通常是 C++编写的)基础上运行的,因此比执行 JavaScript 快得多。不可避免地,创建和销毁 HTML 解析器也会带来性能损失,所以最好能够将设置 innerHTML 或 outerHTML 的次数控制在合理的范围内

         */



        /**

         * scrollIntoView

         * 支持 scrollIntoView()方法的浏览器有 IE、Firefox、Safari 和 Opera

         */

        setTimeout(function() {

            document.getElementById('box4').scrollIntoView()

        }, 0)

    </script>

</body>

</html>

 

你可能感兴趣的:(html5)