已关闭,此问题需要更focused,目前不接受回答。
**想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。
七年前就关门了。
Improve this question
我习惯使用jQuery来操作DOM,例如:
var mything = $("#mything");
mything.on("click", function() {
mything.addClass("red");
mything.html("I have sinned.");
});
但是现在我想用Vanilla JavaScript做同样的事情。这可能吗?我该怎么做?
注意:本题旨在成为Vanilla JavaScript DOM操作的综合资源。
1条答案
按热度按时间ni65a41a1#
当使用Vanilla JS操作文档对象模型时,您将直接访问
Document
和Node
。文档包含Element
,特别是HTMLElement
和SVGElement
,它们都是Node
。Element
也可能包含Text
。查找元素
你可以用
mynode.querySelector()
得到第一个匹配CSS选择器的元素,用myNode.querySelectorAll()
得到所有匹配选择器的元素。大多数情况下,myNode
是Document
,所以你可以得到文档中匹配选择器的任何东西-但是,当myNode
是一个元素时,你只能查看节点的后代。类似于
jQuery('p:hover')
。还有更专业的方法,如:
myNode.getElementById()
myNode.getElementsByTagName()
myNode.getElementsByClassName()
myNode.getElementsByName()
注意,
.getElementBy...
返回单个元素,而.getElementsBy...
(复数元素s)返回NodeList
,这本质上是一个节点数组,但它没有标准的数组方法。标签:What's the best way to loop through a set of elements in JavaScript?
每个元件还可以具有:
parentNode
previousSibling
previousElementSibling
(不包括文本节点)nextSibling
nextElementSibling
(不包括文本节点)firstChild
firstElementChild
(不包括文本节点)lastChild
lastElementChild
(不包括文本节点)childElementCount
(与children.length
相同)和
NodeList
s:childNodes
children
(不包括文本节点)这样,我们就可以遍历DOM。
例如,要获取
#clickme
的父元素中第一个段落元素的最后一个子元素,请执行以下操作:x一个一个一个一个x一个一个二个x
...你找到它的
parentNode
,使用getElementsByTagName
只得到段落后代,取其中的第一个,得到它的lastChild
。要获取其中包含的文本,可以获取其文本节点(第一个子节点),然后使用
text.wholeText
。创建删除
你可以用
document.createElement('aTagName')
创建一个元素,也可以用newElement = myElement.cloneNode()
克隆另一个元素。传递cloneNode
true
作为它的第一个参数,以复制它的后代。不要克隆有ID的元素,因为这会导致同一个文档中出现2个具有相同ID的元素。然后,您可以使用
parent.appendChild(newElement)
将新元素(或现有元素)追加到父元素,或者使用parent.insertBefore(newElement, referenceElement)
将其追加到另一个元素之后。insertAfter
方法不存在,但可以创建:可以使用
parent.removeChild()
删除节点,或者使用parent.replaceChild(newChild)
替换节点,或者使用mynode.remove()
内联删除节点。类和样式
我说的“和样式”指的是类。**样式是用于CSS的。**您只能将CSS样式应用于使用JavaScript添加了类的元素。1
HTML中的元素有一个
classList
属性,它是一个DOMTokenList
,代表一个空格分隔的属性,在本例中是class
。你可以在classList中选择.add()
、.remove()
和.toggle()
类,或者检查它是否是一个.contains()
类。属性
可以使用
querySelector
和querySelectorAll
选择具有某些属性的元素。大多数属性都是您正在使用的元素的属性。例如:但如果它们不是,则可以使用
getAttributeNode
、setAttributeNode
和removeAttributeNode
访问任何属性。AttributeNodes具有 ownerElements 和 value。“data-*”属性可以通过
myelement.dataset
访问。例如,mydiv.dataset.pie = 'yummy'
会将data-pie="yummy"
添加到div中。事件
事件稍微复杂一些。* 绑定 * one(如
jQuery('selector').on
)非常简单:(其他对象也有此方法-例如,
window
)也可以删除事件:
参见:
removeEventListener
事件列表可以在here中找到。
传递给
addEventListener
的函数将被传递事件发生的参数,并具有事件侦听器 * 绑定 * 到的元素的this
。然而,事情并没有这么简单:像点击按钮这样微不足道的事情可能会在不同的元素上为不同的事件触发许多事件侦听器。
标签:What is event bubbling and capturing?
1如果你真的需要用JS修改样式,使用
myElement.style.styleProperty = 'value'
修改 *inline style属性 *。