P102. DOM增删改
- createElement()
- 可以用于创建一个元素节点对象
- 他需要一个标签名作为参数,将会根据改标签名创建元素节点对象,并将创建好的对象返回
- 语法:
document.createElement("元素标签");
- createTextNode()
- 可以用来创建文本节点对象
- 需要一个文本内容传参,将会根据该内容创建文本节点,并将新的节点返回
- 语法:
document.createTextNode("文本");
- appendChind()
- 像一个父节点中创建一个新的子节点
- 语法:
父节点.appendChind(子节点);
- insertBefore()
- 可以在指定子节点前插入新的子节点,如果没有指定旧节点,默认创建在父节点的末尾
- 语法:
父节点.insertBefore(新节点,旧节点);
,可以简单看成在父节点上,把新节点放在旧节点前面。
- replaceChild()
- 可以使用指定的子节点替换已有的子节点
- 语法:
父节点.replaceChild(新节点,旧节点);
- removeChild()
- 删除指定的子节点
- 语法:
父节点.removeChild(子节点);
,不过父节点我们一般可以不用特意再去声明,可以直接使用:子节点.parentNode.removeChild(子节点);
,上面的同理。此外,我们创建一个新的节点还可以使用innerHTML的方式,如:
var city = document.querySelector("#city");
city.innerHTML += "<li>广州</li>"; //利用+=进行字符串的拼接
不过这种添加方式有一个弊端,利用appendChild()创建的子节点只会影响该子节点,而这种方法创建的子节点,会影响其他兄弟节点,因为这是采用的字符串拼接的手段,在实际应用中我们应该两者结合使用,下面是优化方法:
var city = document.querySelector("#city");
var li = document.createElement("li");
li.innerHTML = "广州"; // 这里添加广州的文本我们不采用document.createTextNode()的方法
city.appendChild(li);
举个例子
下面的代码中,将会应用上面所讲到的函数。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
*{
padding: 0;
margin: 0;
list-style: none;
}
#all{
margin: 100px auto;
width: 1000px;
height: 500px;
text-align: center;
background-color: transparent;
}
#unor{
background-color: rgb(185, 211, 233);
width: 100%;
display: flex;
justify-content: center;
}
li{
float: left;
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
margin: 10px;
background-color: aquamarine;
}
button{
width: 200px;
height: 50px;
line-height: 50px;
margin: 10px;
}
</style>
<script type="text/javascript">
window.onload = function(){
// 创建一个“广州”节点
Myclick("btn01",function(){
var li = document.createElement("li"); //创建广州节点
var gztxt = document.createTextNode("广州"); //创建广州文本节点对象
li.appendChild(gztxt); //将gztxt设置为li的子节点
var city = document.querySelector("#city"); //将广州添加到#city下
city.appendChild(li)
});
// 将“广州”节点插入到#bj前面
Myclick("btn02",function(){
// 创建一个“广州”节点
var li = document.createElement("li");
var gztxt = document.createTextNode("广州");
li.appendChild(gztxt);
//获取#bj节点和#city节点
var bj = document.querySelector("#bj");
var city = document.querySelector("#city");
city.insertBefore(li,bj);
});
// 使用“广州”节点替换#bj节点
Myclick("btn03",function(){
var li = document.createElement("li");
var gztxt = document.createTextNode("广州");
li.appendChild(gztxt);
var city = document.querySelector("#city")
var bj = document.querySelector("#bj");
city.replaceChild(li,bj);
});
// 删除#bj节点
Myclick("btn04",function(){
var city = document.querySelector("#city");
var bj = document.querySelector("#bj");
//city.removeChild(bj);
bj.parentNode.removeChild(bj); //这种比上方的那个方法更方便好用
});
// 读取#bj中的html代码
Myclick("btn05",function(){
var city = document.querySelector("#city");
alert(city.innerHTML); //读取带标签的html代码
alert(city.innerText); //读取文本元素
});
// 设置#bj中的html代码
Myclick("btn06",function(){
var bj = document.querySelector("#bj");
bj.innerText = "杭州";
});
// innerHTML创建一个“广州”节点
Myclick("btn07",function(){
var city = document.querySelector("#city");
/* city.innerHTML += "<li>广州</li>"; */
var li = document.createElement("li");
li.innerHTML = "广州";
city.appendChild(li);
});
};
//将单击事件封装到一个函数中,也可以不封装
function Myclick(isStr,fun){
var btn = document.getElementById(isStr);
btn.onclick = fun;
}
</script>
</head>
<body>
<div id="all">
<div id="unor">
<ul id="city">
<li id="bj">北京</li>
<li>厦门</li>
<li>上海</li>
<li>泉州</li>
<li>成都</li>
</ul>
</div>
<div id="btnList">
<div><button id="btn01">创建一个“广州”节点</button></div>
<div><button id="btn02">将“广州”节点插入到#bj前面</button></div>
<div><button id="btn03">使用“广州”节点替换#bj节点</button></div>
<div><button id="btn04">删除#bj节点</button></div>
<div><button id="btn05">读取#bj中的html代码</button></div>
<div><button id="btn06">设置#bj中的html代码</button></div>
<div><button id="btn07">innerHTML创建一个“广州”节点</button></div>
</div>
</div>
</body>
</html>
P103. DOM练习
点击超链接后会跳转到另一个页面,这是超链接的默认行为 如果希望点击一个超链接后不要跳转到新的页面,我们可以为此超链接绑定一个单击响应函数,最后return false来取消默认行为。
confirm()函数用于弹出一个带有确定和取消按钮的对话框,括号内填需要显示的内容,确定返回true,取消返回false
单击响应函数调用的方式不同,this指向的对象也不同:
如果单击响应函数的单击事件是在js中定义的,那么谁调用的,this就是谁,如:
a.onclick = function(){
alert(this.innerHTML);
} //这里的this就是a这个元素节点本身,this.innerHTML就是获取它本身的文本
如果单击响应函数的单击事件是在HTML标签中定义的,那么this默认是window,我们可以把this作为参数传进去,如:
<script type="text/javascript">
function del(obj){ //定义一个obj来接受this
alert(obj.innerHEML); //这时候obj就等于a这个元素节点
}
</script>
...
<body>
<a onclick="del(this)">删除</a> //这里把this作为参数传到该函数中
</body>
P107. DOM操作Css样式
通过JS修改元素的样式
- 语法:
元素.style.样式名 = "样式值"; //样式值要为字符串
- 注意:如果修改的css样式中含有”-“,如:background-color。我们需要改用驼峰命名法,如:backgroundColor
我们通过JS设置的样式属性都是行内样式的,所以一般情况下优先级最高,修改后的样式往往会立即显示 ,但是如果我们在css样式表中定义的样式包含了”!important”,则有可能出现意外,导致JS设置样式失效
读取元素的样式
语法:
元素.style.样式名
注意:由于我们修改元素的样式只能修改到行内样式中,所以我们读取元素样式的时候也只能读取行内样式!
获取元素当前显示的样式
方法一:
!!!注意:此方法仅IE支持,其他浏览器不支持
语法:
元素.currentStyle.样式名
- 这个方法就可以显示css样式表中的样式了,因为这是当前显示什么就返回什么值,如果属性值在样式表中未定义,则返回默认值,如宽度默认auto,背景默认透明
方法二:
!!!注意:此方法IE8及以下的浏览器不支持
- 语法:
getComputedStyle(参数1,参数2).样式名
- 参数1:要获取的元素节点
- 参数2:传递一个伪类元素,没有可传null
- 这是一个window对象的方法,所以可以和alert一样直接调用。
- 该方法返回的是一个对象,我们可以用”.对象名”来获取对象的样式属性
- 如果样式的属性没有设置,也会返回一个具体的值,而不是默认值。
- 如:获取width属性,没有设置时可能会随着父标签的长度改变而改变,我们用这个方法可以获取到父元素的长度。
注意:通过currentStyle和getComputedStyle获取到的样式都是只读的,不可修改的,所以要修改还是要用style属性!
方法三:
方法三就是有我们自定义一个函数,其中包括前两种方法,视情况返回哪种方法
// obj为元素节点对象,name为需要获取的样式名
function getSty(obj,name){
//如果网页有getComputedStyle方法,就执行此方法,不然就执行另一种方法
if(window.getComputedStyle){
//注意:由于这里使用变量调用,所以不能使用点操作符来获取,要使用[]来获取
return getComputedStyle(obj,null)[name];
}else{
return obj.currentStyle[name];
}
}
P110. 其他样式修改相关的属性
注意:以下方法返回的都是一个整数,如宽度不显示px,只显示数值。并且下面的方法都是只读的,不能修改,如果要修改使用style方法。
相关属性
clientWidth 和 clientHeight
- 获取元素的可见宽度和可见高度,注意是可见高度和宽度
- 如果样式表中设置的宽度为200px,但是由于内边距或其他原因显示的实际宽度更高,以实际的可见宽度为准,但是不包括边框宽度!
- 返回的数值是不含px的宽度和高度
- 语法:
元素节点.clientWidth
offsetWidth 和 offsetHeight
- 获取元素的整个高度和宽度
- 这个不仅获取了可见宽度,包括内边距,边框都会算上去,是整个元素的宽度
- 语法:
元素节点.offsetWidth
offsetParent
- 获取元素的定位父元素
- 注意是”定位”父元素,所以获取到的其实是离当前元素最近的开启定位的祖先父元素,如果所以祖先元素都没有开启定位,则默认返回body。
- 语法:
元素节点.offsetparent
offsetTop 和 offsetLeft
- 获取元素其定位父元素的垂直偏移量和水平偏移量
- 注意:这里还是和上面一样,需要有开启定位的祖先父元素
- 语法:
元素节点.offsetTop
scrollWidth 和 scrollHeight
- 获取元素整个滚动区域的宽度
- 我们设置的子元素有时候可能会比父元素更宽或高,此时我们可能会使用overflow来设置子元素的显示方式。
- 此方法可以获取到子元素真实的高度,或者父元素加上隐藏区域的高度
- 语法:
元素节点.scrollWidth
scrollLeft 和 scrollTop
- 可以获取水平滚动条的和垂直滚动条滑动的距离
- 需要在有滚动条的时候使用,不然返回0
- 此方法在谷歌浏览器和个别浏览器返回的是小数!!
-
两个重要等式
当满足
scrollHeight - scrollTop == clientHeight
,说明垂直滚动条拖动到底了。- 当满足
scrollWidth - scrollLeft == clientWidth
,说明水平滚动条拖动到底了。 因为clientHeight代表的是可见的高度,而scrollHeight代表着整个滚动区域的高度,当滚动的区域-滚动的距离的时候,减到0了,说明就到底了 ,如果遇到等式两端有小数的情况,可以使用parseInt()取整。
表单disable属性
如果一个表单控件的标签中的disable=”disable”时,该表单控件为不可用
- 如果JS获取元素节点后,我们需要让表单控件不可用,可以让disable=true,反之可用为disable=false。