JavaScript页面操作笔记

本文详细介绍了JavaScript中DOM的节点操作,包括获取和创建节点、修改节点属性和样式,以及BOM的相关知识,如事件处理、窗口尺寸和滚动等。重点讲解了innerHTML与innerText的区别、nodeType属性的含义,以及事件的冒泡和捕获机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DOM

获取节点

  • document.getElementById()
  • document.getElementByClassName()
  • document.getElementsByTagName()
  • document.getElementsByName()
  • document.querySelector()
  • Node.parentNode() 当前节点的父节点
  • Node.nextSibling/previousSibling 当前节点的兄弟节点
    • Node.parentNode.children[index] 第n个兄弟节点
//兼容性
const node = Node.nextSibling || Node.nextElementSibling 
//前者为ie678,后者为火狐谷歌ie9+
  • Node.childNodes/children 所有子节点,后者只会返回html元素节点(ie678连注释也算)
  • Node.firstChild/lastChid 一个子节点

特殊集合

  • document.anchors 返回document对象中所有带name特性值的a元素
  • document.forms
  • document.images
  • document.links 返回document对象中所有带href特性值的a元素

操作节点

添加和创建

  • document.createElement(“li”)
  • parentNode.appendChild(node) 插入最后一个新子节点,(有些小bug)
<div class="box11"><div class="box12"></div></div>
<div class="box21"><div class="box22"></div></div>
<!--box11.appendChild(box22) 结果是box22会跑到box11中去。box21里没有box22.-->
  • parentNode.insertBefore(newNode,referenceNode) 在参考节点referenceNode前插入一个新节点,参考节点为null则效果和appendChild一样

删除节点

  • parentNode.removeChild(node) 删除子节点node
  • node.cloneNode() 参数为空/null/false,则只复制节点node本身,参数为true则node和其所有子节点都复制(深度拷贝),建议在复制之前先把绑定的事件都解绑

替换节点

  • parentNode.replaceChild(newNode, someChild) 用newNode节点替换掉someChild节点

处理文本节点

  • parentNode.normalize() 删除不含文本的空文本节点、合并两个相邻的文本节点为一个
parent.appendChild(document.createTextNode('text1')
parent.appendChild(document.createTextNode('text2')
// parent.children.length = 2
parent.normalize()
// parent.children.lenght = 1

获取节点属性和样式

  • node.属性名
  • Node.className 获得标签上的类名
    • className +=" newClass" 添加新类名
    • className = “newClass”
  • node[属性名]
  • node[“className”] 获取类名
  • 以上只能获取或修改原生的属性的属性值,以下无论是自定义属性还是原生属性都能获取到值以及修改。对于自定义属性的设置,用上面的方法设置的属性不会出现在标签上,下面的方法可以,所以设置自定义属性只能统一使用上面的get和set方法或者下面的get和set方法,上面和下面的方法不能混用。
  • node.getAttribute(“class”) 获取node节点上的属性的值
  • Node.setAttribute(“属性名”, “新的属性值”) 设置node标签上属性的值
  • node.removeAttribute(“属性名”) 删除节点属性
  • 获取内嵌或外联样式(只读),w3c:window.getComputedStyle(“要获取样式的元素”,“伪元素(没有的话null)”);ie和opera:obj.currentStyle;
  • Node.style.属性名 ->获取或者修改行内样式的属性值,注意style是一个对象,可以通过style.cssText="字符串形式的样式"一次性设置行内样式。

innerHTML和innerText(老版的火狐是textContent)的区别

前者会获得双闭合标签里面的内容(会识别标签),用来修改的话,会把节点里面的所有内容都会替换(替换内容有标签的话会识别成标签),而后者识别标签,修改的话替换内容就算有标签也会被当成文本,不会被识别成标签而被浏览器解析。

nodeType属性

  • nodeType == 1表示元素节点;2表示属性节点;3表示文本节点
  • nodeName(属性名)、nodeValue(属性值)

脚本化css

  • 读写样式 dom.style.prop
    • 写伪元素:通过js改变元素class属性 .a::after -> .b::after,这样就能达到修改伪元素的目的了
  • 查询计算样式(只读)
    • window.getComputedStyle(ele,null) 返回一个类数组。里面的属性值是包含有css样式表里面的属性值(绝对值)。在后面添加.width,可以获得单个属性。第二个参数是解决伪元素的(放入伪元素名称)
    • ie9以下不兼容。dom.currentStyle,返回的样式不是经转换后的绝对值。浏览器独有。

BOM

  • window.innerWidth/Height 窗口文档的宽高
  • clientX/Y,pageX/Y 鼠标点击的位置坐标。
  • 让滚动条滚动
    • window.scroll(x,y)/scrollTo(x,y) 多次执行相同的,不会有叠加效果。
    • window.scrollBy() 有累加效果。
  • 获得可视窗口大小
    • window.innerWidth/innerHeight
    • ie9以下使用:document.documentElement.clientWidth/clientHeight
    • 怪异模式下的浏览器(文档第一行没有)
      • document.body.clientWidth/clientHeight
      • 举例说我是在ie6编写的网页,但是有ie7的用户访问,那么解决这种冲突,就使用怪异模式,是让ie7用户向后兼容,不使用ie7的高级功能。
  • 查看元素的几何尺寸
    • element.getBoundingClientRect()
      • 兼容性很好,该方法返回一个对象,对象里面有bottom、height、left、right、top、width属性
      • height和width属性在老版本ie并未实现,解决办法:width = right - left。
      • 返回的结果不是实时的
    • dom.offsetWidth/offsetHeight
      • 比上面的高级,让上面的被遗弃。返回实际宽高
  • 查看元素位置
    • dom.offsetLeft/offsetTop 对于无定位父级元素,返回相对文档坐标(对于顶部注意塌陷问题),对于有定位的父级的元素,返回相对于最近的有定位的父级的坐标,不管自己是不是定位元素,也不管这距离是由什么产生的。
    • dom.offsetParent
      • 返回最近的有定位的父级,如无,返回body。

事件

事件对象event

该对象里包含着当前事件相关的一切信息

  • ie678是window.event
//兼容写法
function(event){
    event = event || window.event;
}
  • 事件源对象
    • event.target 火狐只有这个
    • event.srcElement ie只有这个
    • chrome都有上面两个

事件流

事件传播阶段:事件捕获(ie除外)->目标->件冒泡

  • 事件捕获:结构上嵌套关系的元素,才会存在事件捕获功能。沿dom树从上到下找,直到捕获到事件目标target。在这过程中默认情况下,相应的监听函数不会被触发。事件传递顺序window > document > html >body > 父元素、子元素、目标元素。
  • 事件冒泡:结构上嵌套关系的元素,才会存在事件冒泡功能。事件从target开始,从子元素向祖先元素冒泡,直到页面的最上一级标签,通俗来说就是子元素事件被触发,父元素I(也绑定了函数)的同样的事件也会被触发。顺序是和捕获阶段相反(ie6最上一层是document,不是window)。
  • 不会冒泡的事件:blur、focus、load、unload、mouseenter、mouseleave、reset。检查事件是否能冒泡可以用event.bubbles,返回值是true则可以冒泡。

事件处理

  • 取消冒泡
    • event.stopPropagation() w3c标准,不支持ie9以下版本
    • event.cancelBubble = true ie独有,谷歌也可以使用。
  • 阻止默认事件:表单提交、a标签跳转、右键菜单等
    • return false;以对象属性的方式注册的事件才生效
    • e.preventDefault() w3c标准,ie9以下不兼容
    • event.returnValue = false 兼容ie
function(event) {
    event = event || window.event;
    if(event.preventDefault) {
        event.preventDefault();
    }else {
        event.returnValue = false;
    }
}
  • 事件委托机制:利用冒泡或捕获机制来绑定事件,对于处理大量的事件绑定无需使用循环。扩展性和性能好。

事件类型

  • 鼠标对象Mouse.event
    • click 鼠标点击。DOM3标准规定:click事件只能监听左键
    • dblclick 双击
    • mouseover 鼠标悬停
    • mouseout 鼠标移走
    • mouseup 鼠标按键弹起
    • mousedown 鼠标按键按下
    • contextmenu 弹出右键菜单
  • keyup 按下键盘并释放
  • change 文本内容或下拉菜单中的选项改变时
  • focus 获得焦点
  • blur 失去焦点
  • load 网页加载完后触发
  • unload 关闭网页
  • submit 表单提交
  • reset 重置表单
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值