获取自定义属性需要使用getAttribute()
//元素
<div id="person" age="10" sex="男">我是皮特</div>
//JS
<script>
var person = document.getElementById("person");
// 固有属性可以直接打点调用
var id = person.id;
//自定义属性需要使用getAttribute()
var age = person.getAttribute("age");
console.log(age);
console.log(id);
</script>
删除自定义属性
//删除自定义属性
person.removeAttribute("sex");
console.log(person); // 我是皮特
添加自定义属性
//设置自定义属性
person.setAttribute("weight",50);
console.log(person); // 我是皮特
也可调用自有属性
var idAttr = person.getAttribute("id");
console.log(idAttr); // person
传递的属性名不需要进行属性名的修改
person.setAttribute("class", "testClassName");
console.log(person) // 我是皮特
//创建节点
var node = document.createElement("div")
node.innerHTML = "hello45";
// append追加节点
document.body.append(node);
//获取子元素数组 children
var node = document.getElementsByClassName("divList")[0];
var children = node.children;
console.log(children);
// 元素节点
var testNode = document.getElementById("test");
console.log(testNode.nodeType); // 1
// 属性节点获取
var idNode = testNode.getAttributeNode("id");
console.dir(idNode); // nodeType:2 nodeValue:"test" nodeName:"id"
//修改属性节点,也会直接作用到标签之上
idNode.value = "demo";
//获取子节点
var node = testNode.childNodes;
console.log(node[0].nodeType); // 3
//修改文本节点的值,也会直接作用到标签之上
node[0].nodeValue = '12313123123'
var p = my$("p3");
console.log(p)
//获取兄弟节点的前一个
console.log(p.previousSibling)
//获取兄弟节点的下一个
console.log(p.nextSibling);
//获取上一个节点元素
console.log(p.previousElementSibling)
//获取下一个节点元素
console.log(p.nextElementSibling)
//创建元素节点
var div = document.createElement("div");
console.dir(div);
//创建属性节点
var myClass = document.createAttribute("class");
console.dir(myClass);
//创建文本节点
var text = document.createTextNode("hello");
console.dir(text)
//将文本节点添加到元素内部
var div = my$("div1");
div.append(text);
/*
* DOM原有节点也可以传给appendChild当参数,做了两个步骤
* 1、将节点从原始位置移除
* 2、添加到新的指定位置
* 原因:内存中这个原有节点只有一个,渲染的时候只能有一个位置
*/
var p2 = my$("p2");
div.appendChild(p2);
//浅拷贝
var c1 = test.cloneNode(false);
console.log(c1);
//深拷贝(元素内部的节点也拷贝)
var c2 = test.cloneNode(true);
console.log(c2);
var test = my$("test");
console.log(test.hasChildNodes()) // true
console.log(test.firstChild != null)// true
console.log(test.childNodes.length > 0) // true
使用addEventListener进行事件的添加,添加的事件会逐个进行执行(事件排队)。
var clickMe = document.getElementById("clickMe");
//DOM级事件
clickMe.onclick = function(){
alert(1)
}
//DOM 2级事件绑定方式
/*不支持ie9以下的浏览器*/
clickMe.addEventListener("click",function(){
alert(1);
})
clickMe.addEventListener("click",function(){
alert(2);
})
使用进行事件监听,注意,事件类型的字符串需要加“on”
/*支持ie10及以下浏览器*/
clickMe.attachEvent("onclick",function(){
alert(1);
})
clickMe.attachEvent("onclick",function(){
alert(2);
})
// 调用
addEvent(clickMe, "click", function(){
alert(1);
})
function addEvent(ele, type, fn){
//ie9以上浏览器使用addEventListener
//IE9以下浏览器使用attachEvent
if(ele.addEventListener){
ele.addEventListener(type, fn);
}else if(ele.attachEvent){
ele.attachEvent("on" + type, fn);
}
}
function removeEvent(ele, type, fn){
if(ele.removeEventListener){
ele.removeEventListener(type, fn);
}else if(ele.detachEvent){
ele.detachEvent("on" + type, fn);
}
}
//第三个参数如果为true,则是事件捕获
//false:事件冒泡
box1.addEventListener("click", function(){
console.log("box1")
}, true);
box2.addEventListener("click", function(){
console.log("box2")
}, true);
box3.addEventListener("click", function(){
console.log("box3")
}, true);
注意:onclick添加的事件,只能冒泡,没有捕获;attachEvent()只能冒泡,没有捕获
**事件委托:**将一些子级的公共类型的事件委托给他们的父级添加,在父级内部想办法找到真正触发事件的自底层的事件源。
<ul id="ul">
<li>1</li>
<li>1</li>
<li>1</li>
</ul>
// e.target 获取事件源
var ul = document.getElementById("ul");
var liList = ul.children;
// 兼容问题
e = e || window.event;
// 兼容问题
var target = e.target || e.srcElement;
ul.onclick = function(e){
for(var i = 0; i < liList.length; i++){
liList[i].style.backgroundColor = "";
}
target.style.backgroundColor = "pink"
};
box3.onclick = function(e){
console.log(3);
//取消默认事件
e.preventDefault();
//取消事件冒泡
e.stopPropagation();
//低版本兼容浏览器使用
e.cancelBubble = true;
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-phvlVRbU-1611473589857)(C:\Users\张艳杰\AppData\Roaming\Typora\typora-user-images\1611471273933.png)]