(46)替代jQuery常用功能的原生JS代码
①addEventListener
命令 |
addEventListener |
效果 |
添加响应事件 |
兼容性 |
IE9及以上 https://caniuse.com/#search=addEventListener |
注: |
同一个回调函数,多次添加不会重复触发 |
范例:
<p id="test"> abc </p> <script> var node = document.getElementById("test"); console.log(node); node.addEventListener("click", function () { alert("click!"); }) </script>
②DOMContentLoaded
命令 |
DOMContentLoaded |
效果 |
页面加载完成后触发本事件 |
兼容性 |
IE9及以上 https://caniuse.com/#search=DOMContentLoaded |
范例:
<script> document.addEventListener("DOMContentLoaded", function () { var node = document.getElementById("test"); console.log(node); }) </script> <p id="test"> abcd </p>
注:
假如不加这个事件,那么输出结果是null
③querySelector、querySelectorAll 选择器
命令 |
querySelector(单个,遇见的第一个); querySelectorAll(全部符合的) |
效果 |
DOM元素选择器,类似jQuery的选择器 |
兼容性 |
IE9及以上,IE8只有部分支持 https://caniuse.com/#search=DOMContentLoaded |
关于IE8 |
IE8的支持,被限制在CSS2.1和CSS3的一小部分。另外,在IOS8.x里会有bug(id然后加元素会失效)。 具体可以参见上面url里的说明 |
范例:
<script> document.addEventListener("DOMContentLoaded", function () { var node = document.querySelector('.container').querySelector('.test'); console.log(node); var node = document.querySelector('body').querySelectorAll('.test'); console.log(node); }) </script>
<body> <script> document.addEventListener("DOMContentLoaded", function () { var node = document.querySelector('.container').querySelector('.test'); console.log(node); var node = document.querySelector('body').querySelectorAll('.test'); console.log(node); }) </script> <p class="test"> abcd </p> <p class="container"> <p class="test"> defg </p> </p> </body>
注:
【1】可以选择某一个DOM元素下的子元素(如第二个);
【2】不加All的是选择第一个,返回结果是单个DOM元素;加了All返回的是一个数组(即使只有一个);
④removeEventListener 移除事件
命令 |
removeEventListener |
效果 |
移除响应事件 |
兼容性 |
没有查到,但推测和addEventListener相同 |
注: |
同一个回调函数,多次添加不会重复触发; 删除已删除事件也不会报错。 |
<script> document.addEventListener("DOMContentLoaded", function () { var event = function () { alert("event happened!"); } var node = document.querySelector('.test'); var add = document.querySelector('.add'); var remove = document.querySelector('.remove'); add.addEventListener("click", function () { node.addEventListener("click", event); }) remove.addEventListener("click", function () { node.removeEventListener("click", event); }) }) </script> <p class="test"> 事件触发器(点击触发) </p> <button class="add">添加事件</button> <button class="remove">移除事件</button>
⑤classList 类列表
命令 |
DOM.classList |
效果 |
类列表 |
兼容性 |
IE10及以上 https://caniuse.com/#search=classList |
注: |
结果是一个对象,但可以像数组那样获取第N个类名; |
常用方法 |
单独获取所有类名(以字符串形式)是classList.value 添加类名是classList.add(类名) 移除类名是classList.remove(类名) 查看是否存在某个类classList.contains(类名) 切换是否显示某个类classList.toggle(类名) |
范例:
<script> document.addEventListener("DOMContentLoaded", function () { var node = document.querySelector('.test'); var list = node.classList; console.log(list); var add = document.querySelector('.add'); var remove = document.querySelector('.remove'); add.addEventListener("click", function () { list.add("anotherClass") }) remove.addEventListener("click", function () { list.remove("anotherClass") }) }) </script> <p class="test"> 事件触发器(点击触发) </p> <button class="add">添加</button> <button class="remove">移除</button>
⑥textContent和innerHTML
命令 |
textContent、innerHTML |
效果 |
前者查看文本内容; 后者查看html内容 |
兼容性 |
前者IE9及以上; 后者IE8及以上 https://caniuse.com/#search=textContent https://caniuse.com/#search=innerHTML |
范例:
<script> document.addEventListener("DOMContentLoaded", function () { var node = document.querySelector('.test'); var add = document.querySelector('.add'); var remove = document.querySelector('.remove'); add.addEventListener("click", function () { console.log(node.textContent); }) remove.addEventListener("click", function () { console.log(node.innerHTML); }) }) </script> <p class="test"> <span>事件触发器(点击触发)</span> </p> <button class="add">查看textContent内容</button> <button class="remove">查看innerHTML内容</button>
注:
可以直接对其属性进行修改;但修改textContent属性,如果内容有html标签,不会被解释为html标签;
但通过innerHTML修改的html标签会被解释。