1. dom对象的innerText
和innerHTML
有什么区别?
-
innerText
用于获取元素内的文本内容; -
innerHTML
用于获取元素内的HTML结构。
2. elem.children
和elem.childNodes
的区别?
-
elem.children
属性返回一个动态的HTMLCollection集合,由当前节点所有的Element
子节点组成; -
elem.childNodes
属性返回一个NodeList对象(类数组对象),包括但不限于Element节点,还包括Text节点(换行,空格)和
注释节点。
3. 查询元素有几种常见的方法?
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>task22</title>
<style type="text/css">
</style>
</head>
<body>
<div id="div1" class="wrap">
<a href="#" name="link1">jirengu</a>
</div>
<div id="div2" class="wrap">
<a href="#" name="link2">hello <span>world</span></a>
</div>
<script type="text/javascript">
var byId = document.getElementById('div1'); // 1
var byCls = document.getElementsByClassName('wrap'); // 2
var byTgName = document.getElementByTagName('span'); // 3
var byName = document.getElementByName('link1'); // 4
var getEl = document.querySelector('#div1'); // 5
var getEls = document.querySelectorAll('.wrap'); // 6
</script>
</body>
</html>
4. 如何创建一个元素?如何给元素设置属性?
- 可以通过
createElement()
方法创建新的HTML元素节点;通过setAttribute()
方法设置元素属性。
var newDiv = document.createElement('div');
newDiv.setArrribute('class','wrap');
5. 元素的添加、删除?
- 使用
appendChild
方法在元素内的最后位置添加新元素节点;通过removeChild
方法删除元素。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>task22</title>
<style type="text/css">
#purchases .sale {
color:red;
}
</style>
</head>
<body>
<h1>What to buy</h1>
<p>Don't forget to buy this stuff.</p>
<ul id="purchases">
<li>A tin of beans</li>
<li class="sale">Cheese</li>
<li class="sale important">Milk</li>
</ul>
<script type="text/javascript">
var newLi = document.createElement('li'); // 创建新的 li 元素节点
var oldLi = document.querySelector('.important'); // 获取需要删除的元素节点
var newContent = document.createTextNode('Apple') // 创建新的内容节点
var ul = document.getElementById('purchases'); // 获取需要添加位置的父元素节点
ul.removeChild(oldLi); // 从父节点上删除子节点
newLi.appendChild(newContent); // 将内容节点添加到新的 li 节点上
newLi.setAttribute('class','sale'); // 给新的 li 节点添加 class 属性
ul.appendChild(newLi); // 将 newLi 添加到 HTML 内
</script>
</body>
</html>
6. DOM0 事件和DOM2级在事件监听使用方式上有什么区别?
- DOM0事件是将时间作为元素的一个属性,当需要对事件进行监听时,只要将需要执行的函数赋值给这个属性即可,需要删除该事件监听是只需将该属性的值改为null即可;该方法操作直观简便,兼容性最好,但一个事件只能绑定一个函数。
// HTML
var btn = document.querySelector('#btn');
// JS
btn.onclick = function() {
console.log('DOM0');
}
- DOM2级事件是使用元素的
addEventListener
和removeEventListener
方法对事件进行监听,事件类型和处理函数做为上述方法的参数,其中addEventListener
方法只能通过removeEventListener
取消。该方法可以为一个事件绑定多个函数。
// HTML
var btn = document.querySelector('#btn');
// JS
btn.addEventListener('click', function(){
console.log('DOM2');
})
7. attachEvent
与addEventListener
的区别?
-
addEventListener
对IE8 及之前的版本不兼容,只能用attachEvent
对事件进行监听,同时,监听事件的取消也只能用detachEvent
实现而不能使用removeEventListener
。
-
attachEvent
添加的事件处理程序只能发生在事件冒泡过程中,而addEventListener
的第三个参数可以决定事件处理程序是在捕获阶段还是在冒泡阶段处理,一般浏览器默认发生在冒泡阶段(即第三个参数默认为false); -
addEventListener
方法第一个参数是事件类型(如click
、load
),而attachEvent
的第一个参数是事件名称(如onclick
、onload
); - 二者事件处理程序的作用域不同。
addEventListener
事件的作用域是元素本身,而attachEvent
的事件处理程序会在全局作用域内运行; - 为一个事件添加多个事件处理程序时,执行顺序不同。
addEventListener
会按照处理程序添加的顺序执行,而attachEvent
执行多个事件处理程序的顺序没有规律。
8. 解释IE事件冒泡和DOM2事件传播机制?
- IE事件冒泡机制中事件最开始是由最具体的元素接收,然后向其祖先元素进行传播,其祖先元素可以在此过程中接收事件并引发事件处理程序;
- DOM2事件传播在根节点到事件发生的具体元素过程中提供了截取事件的机会,然后则是冒泡机制。
9. 如何阻止事件冒泡? 如何阻止默认事件?
- 通过
stopPropagation()
方法可以阻止事件冒泡; - 通过
preventDefault()
可以阻止默认事件。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>task22</title>
<style type="text/css">
.wrap {
height:100px;
width:100px;
background-color:red;
margin:50px;
}
.main {
height:70px;
width:70px;
background-color:yellow;
}
</style>
</head>
<body>
<div class="wrap">
<div class="main">
<a class="link" href="http://jirengu.com/">饥人谷</a>
</div>
</div>
<script type="text/javascript">
var wrap = document.querySelector('.wrap');
var main = document.querySelector('.main');
var link = document.querySelector('.link');
wrap.addEventListener('click', function(){
console.log('wrap');
})
main.addEventListener('click', function(){
console.log('main');
})
link.addEventListener('click', function(e){
e.preventDefault();
console.log('link');
e.stopPropagation();
})
</script>
</body>
</html>
单击链接,实现如下效果:
代码题
1. 有如下代码,要求当点击每一个元素li
时控制台展示该元素的文本内容。不考虑兼容
<ul class="ct">
<li>这里是</li>
<li>饥人谷</li>
<li>前端9班</li>
</ul>
<script>
function $(str) {
return document.querySelector(str);
}
function $$(str) {
return document.querySelectorAll(str);
}
var ul = $('.ct');
ul.addEventListener('click', function(e){
console.log(e.target.innerText);
})
</script>
2. 补全代码,要求:
- 当点击按钮
开头添加
时在<li>这里是</li>
元素前添加一个新元素,内容为用户输入的非空字符串;当点击结尾添加
时在<li>前端6班</li>
后添加用户输入的非空字符串. - 当点击每一个元素
li
时控制台展示该元素的文本内容。
实现效果
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>task22-2</title>
</head>
<body>
<ul class="ct">
<li>这里是</li>
<li>饥人谷</li>
<li>前端6班</li>
</ul>
<input class="ipt-add-content" placeholder="添加内容"/>
<button id="btn-add-start">开头添加</button>
<button id="btn-add-end">结尾添加</button>
<script>
function $(str){
return document.querySelector(str);
}
function $$(str){
return document.querySelectorAll(str);
}
var ul = $('.ct');
var ipt = $('.ipt-add-content');
var btnAddStart = $('#btn-add-start');
var btnAddEnd = $('#btn-add-end');
// 当文本框内容发生改变时获取文本框value值并添加至新建的li标签内
ipt.addEventListener('change', function(){
newLi = document.createElement('li');
newLi.innerText = ipt.value
})
// 定义两个按钮的单击事件
btnAddStart.addEventListener('click', function() {
ul.insertBefore(newLi,ul.firstChild);
ipt.value = '';
})
btnAddEnd.addEventListener('click', function() {
ul.appendChild(newLi);
ipt.value = '';
})
ul.addEventListener('click', function(e){
if(e.target.tagName.toLowerCase() === 'li') {
console.log(e.target.innerText);
}
})
</script>
</body>
</html>
3. 补全代码,要求:当鼠标放置在li
元素上,会在````img-preview里展示当前
li元素的
data-img```对应的图片.
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>task22-3</title>
</head>
<body>
<ul class="ct">
<li data-img="images/task22-3-1.jpg">鼠标放置查看图片1</li>
<li data-img="images/task22-3-2.jpg">鼠标放置查看图片2</li>
<li data-img="images/task22-3-3.jpg">鼠标放置查看图片3</li>
<li data-img="images/task22-3-4.jpg">鼠标放置查看图片4</li>
</ul>
<div class="img-preview"></div>
<script>
var ul = document.querySelector('.ct');
var div = document.querySelector('.img-preview');
var newImg = document.createElement('img');
ul.addEventListener('mouseover', function(e){
if(e.target.tagName.toLowerCase() === 'li'){
var src = e.target.getAttribute('data-img');
newImg.src = src;
div.appendChild(newImg);
}
})
</script>
</body>
</html>
4. 实现如下图Tab切换的功能
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>task22-4</title>
<style type="text/css">
#tab {
border-collapse: collapse; /* 合并边框 */
width: 500px;
border: 1px solid #888;
border-spacing: 0;
}
#tab td {
border: 1px solid #888;
padding: 0;
}
.tabs td {
text-align: center;
line-height: 30px;
cursor: pointer;
}
.tabs .active {
background-color: #ccc;
}
#tab .main {
height: 100px;
}
#tab .main td li {
list-style: none;
padding: 10px;
display: none;
}
#tab .main .active {
display: block;
}
</style>
</head>
<body>
<table id="tab">
<tr class="tabs">
<td>tab1</td>
<td>tab2</td>
<td>tab3</td>
</tr>
<tr class="main">
<td colspan="3">
<ul>
<li class="active">内容一</li>
<li>内容二</li>
<li>内容三</li>
</ul>
</td>
</tr>
</table>
<script type="text/javascript">
var tabs = $('.tabs')
var tabArr = $$('.tabs>td');
var mainArr = $$('.main li');
tabs.addEventListener('click', function(e){ // 在tabs上加时间监听
var clickNode = e.target;
if (clickNode.tagName.toLowerCase() === 'td') { // tabs的点击效果
for (var i=0; i<tabArr.length; i++){
tabArr[i].classList.remove('active');
}
clickNode.classList.add('active');
}
var index = [].indexOf.call(tabArr,clickNode); // 利用index将tabs和mainList联系起来
for (var i=0; i<mainArr.length; i++){
mainArr[i].classList.remove('active');
}
mainArr[index].classList.add('active');
})
function $(str) {
return document.querySelector(str);
}
function $$(str) {
return document.querySelectorAll(str);
}
</script>
</body>
</html>
5. 实现下图的模态框功能
- HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>task22-5</title>
<link rel="stylesheet" href="task22-5.css">
</head>
<body>
<div class="btn-wrap">
<button type="button" id="btn-boss">点我</button>
</div>
<div class="modal">
<div class="dialog-box">
<div class="header">
<h1>我是标题</h1>
<a class="close icon-close" href="#"></a>
</div>
<div class="contents">
<p>我是内容1</p>
<p>我是内容2</p>
</div>
<div class="footer">
<a class="btn confirm" href="#">确定</a>
<a class="btn cancel" href="#">取消</a>
</div>
</div>
</div>
<script type="text/javascript" src="task22-5.js"></script>
</body>
</html>
- CSS
div,p,h1,h2,h3,h4,h5,h6,a,button{
margin: 0;
padding: 0;
font-size: 16px
}
@font-face {font-family: "iconfont";
src: url('iconfont.eot?t=1471481907'); /* IE9*/
src: url('iconfont.eot?t=1471481907#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('iconfont.woff?t=1471481907') format('woff'), /* chrome, firefox */
url('iconfont.ttf?t=1471481907') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
url('iconfont.svg?t=1471481907#iconfont') format('svg'); /* iOS 4.1- */
}
.icon-close {
font-family:"iconfont" ;
font-size:16px;
font-style:normal;
-webkit-font-smoothing: antialiased;
-webkit-text-stroke-width: 0.2px;
-moz-osx-font-smoothing: grayscale;
}
.icon-close:before { content: "\e62d"; }
a {
text-decoration: none;
color: #333;
}
.modal {
display: none;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background-color: rgba(0,0,0,0.3)
}
.dialog-box {
width: 400px;
border: 1px solid #ccc;
border-radius: 4px;
background-color: #fff;
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
-webkit-transform: translate(-50%, -50%);
}
.dialog-box .header {
border-bottom: 1px solid #aaa;
}
.dialog-box .header h1 {
line-height: 40px;
display: inline-block;
margin-left: 15px;
}
.dialog-box .header .close {
display: table-cell;
float: right;
line-height: 40px;
margin-right: 15px;
}
.dialog-box .contents {
padding:15px;
border-bottom: 1px solid #ccc;
}
.dialog-box .contents p {
line-height: 30px;
}
.dialog-box .footer .btn {
line-height: 40px;
float: right;
margin-right: 15px;
}
- JS
function $(str) {
return document.querySelector(str);
}
function $$(str) {
return document.querySelectorAll(str);
}
var btnBoss = $('#btn-boss');
var modal = $('.modal');
var dialogBox = $('.dialog-box');
function hasClass(ele, cls) {
var reg = new RegExp('\\b' + cls + '\\b','ig');
return reg.test(ele.className)
}
btnBoss.addEventListener('click', function(){
modal.style.display = 'block';
})
dialogBox.addEventListener('click', function(e){
e.stopPropagation();
if (hasClass(e.target, 'close') || hasClass(e.target, 'cancel')) {
modal.style.display = 'none';
}
})
modal.addEventListener('click', function(e){
modal.style.display = 'none';
})
本教程版权归本人和饥人谷所有,转载请注明来源。