JavaScript 知识点 - Web API

2018-08-28  本文已影响7人  千反田爱瑠爱好者

DOM

便于描述树形结构的文档对象的模型,使浏览器可识别、JS可操作。

DOM属性操作

获取DOM节点:

var div1 = document.getElementById("div1")
var divList = document.getelementsByTagName("div")
var containerList = document.getElementsByClassName(".container")

property:JS对象属性(获取/修改)

var pList = document.querySelectorAll('p')
var p = pList[0]
p.style.width
p.className
p.nodeName

attribute:HTML标签属性(获取/修改)

var pList = document.querySelectorAll('p')
var p = pList[0]
p.getAttribute("data-name")
p.setAttribute("data-name", "ywh")
p.getAttribute("style")

DOM结构操作

// 新增节点
var div1 = document.getElementById("div1")
var p1 = document.createElement("p")
p1.innerHTML = "p1"
div1.appendChild(p1)
var p2 = document.getElementById("p2")
div1.appendChild(p2)

// 获取父子元素
var div1 = document.getElementById("div1")
var parent = div1.parentElement
var child = div1.childNodes
div1.removeChild(child[0])

BOM

浏览器对象模型

navigator.userAgent

screen.width
screen.height

location.href
location.protocol
location.pathname
location.search
location.hash

history.back()
history.forward()

事件

通用事件绑定

var btn = document.getElementById("btn1")
btn.addEventListener("click", function(event) {
    console.log("clicked")
})

function bindEvent(elem, type, fn) {
    elem.addEventListener(type, fn)
}

var a = document.getElementById("link1")
bindEvent(a, "click", function(e) {
    e.prevntDefault()
    alert("clicked")
})

事件冒泡

节点事件触发时,如果其父节点都绑定相同的事件,则事件会从节点依次向外传递。

<body>
<div id="div1">
    <p id="p1">激活</p>
    <p id="p2">取消</p>
</div>
<script>
    function bindEvent(elem, type, fn) {
        elem.addEventListener(type, fn)
    }

    var p1 = document.getElementById("p1")
    var body = document.body

    bindEvent(p1, "click", function(e) {
        e.stopPropagation()     // 阻止点击p1时点击事件传递到body而产生alert("取消")
        alert("激活")
    })
    bindEvent(body, "click", function(e) {
        alert("取消")
    })
</script>
</body>

代理:在父节点绑定事件(并加入对子节点的判断),而不需要对每个子节点都绑定事件(且支持动态增删)

使用代理完善通用绑定事件函数:

<div id="div1">
    <a id="a1">a1</a>
    <a id="a2">a2</a>
    <a id="a3">a3</a>
    <a id="a4">a4</a>
</div>
<script>
    function bindEvent(elem, type, selector, fn) {

        if (fn === undefined) {
            fn = selector
            selector = null
        }

        elem.addEventListener(type, function (e) {
            if (selector && e.target && e.target.matches(selector))
                fn.call(e.target, e)
            else
                fn(e)
        })
    }

    // 使用代理
    var div1 = document.getElementById("div1")
    bindEvent(div1, "click", "a", function (e) {
        console.log(this.innerHTML)
    })

    // 不使用代理
    var a = document.getElementById("a1")
    bindEvent(div1, "click", function (e) {
        console.log(a.innerHTML)
    })
</script>

详见《DOM基础总结》

兼容性问题

HTTP请求

XMLHttpRequest

readyState:

status:

let xhr = new XMLHttpRequest()
xhr.open("GET", "/api", false)
xhr.onreadystatechange = function() {
    if (xhr.readyState === 4) {   
        if (xhr.status === 200) {
            alert(xhr.responseText)
        }
    }
}
xhr.send(null)

兼容性问题

跨域

见《跨域问题及解决方法》

存储

Cookie

LocalStorage和SessionStorage

回答以下问题

  1. DOM是哪种基本的数据结构?
  2. DOM操作的常用API有哪些?
  3. DOM节点的attr和property有何区别?
  4. 如何检测浏览器类型?
  5. 拆解url各部分。
  6. 编写一个通用的事件监听函数。
  7. 描述事件冒泡流程。
  8. 对于一个无限下拉加载图片的页面,如何给每个图片绑定事件?
  9. 手动编写一个ajax,不依赖第三方库。
  10. 跨域的几种实现方式。
  11. Cookie,SessionStorage,LocalStorage的区别。
上一篇 下一篇

猜你喜欢

热点阅读