JavaScript中Document对象常见的的方法分析

JavaScript中Document对象常见的的方法分析

        Document对象的方法是JavaScript操作DOM的核心手段,它能让开发者精准获取、创建、修改页面元素,还能绑定事件、管理样式与文档结构,是实现网页动态交互、内容更新与布局调整的关键,支撑着前端页面从静态展示到动态交互的转变,是前端开发中实现丰富用户体验的基础工具。

        在现代前端开发中,Document对象的方法依然是各类框架底层交互的核心依托,即便框架封装了更上层的API,其本质仍依赖Document方法与浏览器DOM进行通信。未来随着Web标准的持续演进,它的方法会更侧重安全与语义化,比如在跨域交互、隐私保护层面的限制会更严格,同时也会进一步强化与Web组件、渐进式Web应用(PWA)的协同能力,更好地适配多端、离线等复杂场景,成为构建下一代Web应用的重要基础。

          下面,对JavaScript中Document对象常见的方法进行逐一分析讲解:


第一部分:事件处理方法(4个)

1、document.addEventListener()

  • 含义:为文档添加事件监听器,当指定事件发生时执行回调函数。
  • 词源:Add(添加)+ Event(事件)+ Listener(监听器)。
  • 语法document.addEventListener(type, listener, options);
  • 参数及说明
    • type:事件类型字符串,如 'click''keydown''scroll'
    • listener:事件触发时要执行的回调函数,接收一个事件对象参数。
    • options(可选):可以是布尔值或对象。
      • 如果是布尔值:true 表示在捕获阶段触发,false 表示在冒泡阶段触发。
      • 如果是对象,可以包含:
        • capture:布尔值,是否在捕获阶段触发。
        • once:布尔值,是否只触发一次后自动移除。
        • passive:布尔值,是否永不调用 preventDefault()

例子

// 基本用法 document.addEventListener('click', function(event) { console.log('文档被点击了', event.clientX, event.clientY); }); // 只触发一次的监听器 document.addEventListener('DOMContentLoaded', function() { console.log('页面加载完成,只触发一次'); }, { once: true }); // 使用箭头函数和捕获阶段 document.addEventListener('scroll', () => { console.log('页面滚动中', window.scrollY); }, { capture: true });

2、document.removeEventListener()

  • 含义:移除之前通过 addEventListener 添加的事件监听器。
  • 词源:Remove(移除)+ Event(事件)+ Listener(监听器)。
  • 语法document.removeEventListener(type, listener, options);
  • 参数及说明
    • type:要移除的事件类型。
    • listener:要移除的回调函数(必须是同一个函数引用)。
    • options(可选):必须与添加时的配置一致才能正确移除。
    • 重要:如果添加时使用的是匿名函数,则无法移除。

例子

// 定义命名函数才能移除 function handleClick(event) { console.log('点击了文档'); } // 添加监听器 document.addEventListener('click', handleClick); // 后续移除监听器 document.removeEventListener('click', handleClick); // 错误示范:无法移除匿名函数 document.addEventListener('click', function() { console.log('这个监听器无法被移除'); }); // document.removeEventListener('click', ...) // 无法移除上面的匿名函数

3、document.dispatchEvent()

  • 含义:向文档派发一个自定义事件,触发相应的事件监听器。
  • 词源:Dispatch(派遣、发送)+ Event(事件)。
  • 语法let result = document.dispatchEvent(event);
  • 参数及说明
    • event:要派发的事件对象(可以是 new Event() 创建的自定义事件,也可以是系统事件)。
    • 返回值:布尔值。如果事件没有被任何监听器调用 preventDefault() 则返回 true,否则返回 false

例子

// 创建并派发自定义事件 let customEvent = new Event('userLogin'); // 监听自定义事件 document.addEventListener('userLogin', function(e) { console.log('用户登录事件触发', e.type); document.body.style.backgroundColor = 'lightgreen'; }); // 派发事件 let result = document.dispatchEvent(customEvent); console.log('事件派发成功?', result); // true // 带数据的自定义事件 let dataEvent = new CustomEvent('dataUpdate', { detail: { name: '张三', age: 25 } }); document.addEventListener('dataUpdate', function(e) { console.log('接收到的数据:', e.detail); // { name: '张三', age: 25 } }); document.dispatchEvent(dataEvent);

4、document.execCommand()

  • 含义:执行命令操作可编辑区域的内容(已废弃,但仍在部分浏览器中支持)。
  • 词源:Exec(执行)+ Command(命令)。
  • 语法let result = document.execCommand(command, showUI, value);
  • 参数及说明
    • command:命令名称字符串。常用命令:
      • 'bold':加粗选中文本
      • 'italic':斜体
      • 'underline':下划线
      • 'copy':复制选中内容
      • 'cut':剪切选中内容
      • 'paste':粘贴
      • 'createLink':创建链接
      • 'insertImage':插入图片
      • 'undo':撤销
      • 'redo':重做
    • showUI:布尔值,是否显示命令的用户界面(通常设为 false)。
    • value:命令需要的参数值(如链接 URL、图片地址等)。
    • 返回值:布尔值,表示命令是否执行成功。

例子

// 需要有一个可编辑区域 // <div contenteditable="true">这是可编辑文本</div> let editor = document.getElementById('editor'); editor.focus(); // 先让编辑器获得焦点 // 将选中文本加粗 let success = document.execCommand('bold', false, null); console.log('加粗成功?', success); // 创建链接 document.execCommand('createLink', false, 'https://example.com'); // 复制选中的内容 document.execCommand('copy'); // 注意:现代开发推荐使用 Clipboard API 替代 // navigator.clipboard.writeText('要复制的文本');

第二部分:节点导入与采用方法(2个)

5、document.adoptNode()

  • 含义:从其他文档中采用一个节点,使其归属于当前文档(原文档中的节点会被移除)。
  • 词源:Adopt(采用、收养)+ Node(节点)。
  • 语法let node = document.adoptNode(externalNode);
  • 参数及说明
    • externalNode:来自其他文档的节点(如 iframe 中的元素)。
    • 返回值:被采用后的节点,其 ownerDocument 变为当前文档。
    • 注意:采用后,原文档中的节点会被移除。

例子

// 假设页面中有一个 iframe // <iframe src="other.html"></iframe> let iframe = document.getElementById('myIframe'); let iframeDoc = iframe.contentDocument; // 获取 iframe 中的一个按钮 let iframeButton = iframeDoc.getElementById('btnFromIframe'); // 将按钮从 iframe 文档采用到主文档 let adoptedBtn = document.adoptNode(iframeButton); // 现在按钮已从 iframe 中移除,需要手动添加到主文档 document.body.appendChild(adoptedBtn); console.log('按钮已移动到主文档');

6、document.importNode()

  • 含义:从其他文档导入一个节点到当前文档(创建副本,原节点保留)。
  • 词源:Import(导入)+ Node(节点)。
  • 语法let node = document.importNode(externalNode, deep);
  • 参数及说明
    • externalNode:来自其他文档的节点。
    • deep:布尔值。true 表示深度导入(包括所有子节点),false 只导入节点本身。
    • 返回值:导入后的节点副本,原节点不受影响。

例子

// 假设有 iframe let iframe = document.getElementById('myIframe'); let iframeDoc = iframe.contentDocument; // 获取 iframe 中的一个复杂元素 let iframeDiv = iframeDoc.getElementById('complexDiv'); // 深度导入该元素及其所有子节点 let importedDiv = document.importNode(iframeDiv, true); // 将导入的副本添加到主文档 document.body.appendChild(importedDiv); // iframe 中的原元素仍然存在 console.log('原节点仍在 iframe 中,副本已添加到主文档');

第三部分:节点操作方法(10个)

7、document.appendChild()

  • 含义:向文档节点的子节点列表末尾添加一个节点。
  • 词源:Append(追加)+ Child(孩子)。
  • 语法document.appendChild(aChild);
  • 参数及说明
    • aChild:要追加的节点对象。
    • 重要警告:通常不直接对 document 使用 appendChild,因为文档只能有一个根元素 <html>。如果尝试添加另一个根元素会出错。

例子

// 错误示范:不能给 document 直接添加子节点 // let newDiv = document.createElement('div'); // document.appendChild(newDiv); // 会报错 // 正确用法:通常对 document.body 或其他元素使用 let newDiv = document.createElement('div'); document.body.appendChild(newDiv); // ✅ 正确

8、document.cloneNode()

  • 含义:克隆文档节点本身(不是克隆整个页面内容)。
  • 词源:Clone(克隆)+ Node(节点)。
  • 语法let clonedDoc = document.cloneNode(deep);
  • 参数及说明
    • deep:布尔值。true 表示深度克隆(包括所有子节点),false 只克隆文档节点本身。
    • 返回值:克隆后的文档节点副本。

例子

// 浅克隆 - 只克隆 document 对象本身,不包含子节点 let docShallow = document.cloneNode(false); console.log(docShallow.nodeName); // '#document' console.log(docShallow.hasChildNodes()); // false(没有子节点) // 深克隆 - 克隆整个文档结构 let docDeep = document.cloneNode(true); console.log(docDeep.childNodes.length); // 包含 doctype 和 html 等 // 注意:克隆的文档不在页面中显示,只是一个内存中的副本

9、document.insertBefore()

  • 含义:在参考节点之前插入一个节点。
  • 词源:Insert(插入)+ Before(在...之前)。
  • 语法let insertedNode = parentNode.insertBefore(newNode, referenceNode);
  • 参数及说明
    • newNode:要插入的新节点。
    • referenceNode:参考节点(新节点将插入到这个节点之前)。
    • 返回值:被插入的节点。

例子

// 通常对具体元素使用,而不是 document let parent = document.getElementById('parentDiv'); let firstChild = parent.firstElementChild; let newSpan = document.createElement('span'); newSpan.textContent = '插入的span'; // 在第一个子元素之前插入新span parent.insertBefore(newSpan, firstChild);

10、document.replaceChild()

  • 含义:用新节点替换父节点中的一个子节点。
  • 词源:Replace(替换)+ Child(孩子)。
  • 语法let oldChild = parentNode.replaceChild(newChild, oldChild);
  • 参数及说明
    • newChild:新节点。
    • oldChild:要被替换的旧子节点。
    • 返回值:被替换的旧节点。

例子

let parent = document.getElementById('container'); let oldP = document.getElementById('oldParagraph'); let newDiv = document.createElement('div'); newDiv.textContent = '替换后的新内容'; newDiv.className = 'new-content'; // 用 newDiv 替换 oldP let removed = parent.replaceChild(newDiv, oldP); console.log('已移除的节点:', removed);

11、document.removeChild()

  • 含义:从父节点中移除一个子节点。
  • 词源:Remove(移除)+ Child(孩子)。
  • 语法let oldChild = parentNode.removeChild(child);
  • 参数及说明
    • child:要移除的子节点。
    • 返回值:被移除的节点(仍存在于内存中,可以后续添加)。

例子

let parent = document.getElementById('list'); let lastItem = document.getElementById('lastItem'); // 移除最后一个项目 let removedItem = parent.removeChild(lastItem); console.log('已移除:', removedItem); // 稍后可以重新添加 parent.appendChild(removedItem);

12、document.hasChildNodes()

  • 含义:检查文档节点是否有子节点。
  • 词源:Has(有)+ Child(孩子)+ Nodes(节点)。
  • 语法let hasChildren = document.hasChildNodes();
  • 参数及说明:无参数。
  • 返回值:布尔值,有子节点返回 true,否则返回 false

例子

console.log(document.hasChildNodes()); // 通常返回 true(有 doctype 和 html) // 检查 body 是否有子节点 console.log(document.body.hasChildNodes()); // 取决于页面内容

13、document.normalize()

  • 含义:规范化文档,合并相邻的文本节点并删除空的文本节点。
  • 词源:Normalize(标准化、规范化)。
  • 语法document.normalize();
  • 参数及说明:无参数。清理文档树结构。

例子

let div = document.createElement('div'); div.appendChild(document.createTextNode('Hello')); div.appendChild(document.createTextNode(' ')); div.appendChild(document.createTextNode('World')); console.log(div.childNodes.length); // 3(三个文本节点) div.normalize(); console.log(div.childNodes.length); // 1(合并成 "Hello World")

14、document.prepend()

  • 含义:在文档的第一个子节点前插入一组节点或字符串。
  • 词源:Prepend(在前面附加)。
  • 语法document.prepend(...nodesOrStrings);
  • 参数及说明
    • 可以接受多个参数,可以是节点对象或字符串。
    • 字符串会自动转换为文本节点。
    • 注意:直接对 document 使用 prepend 通常不建议,因为文档只能有一个根元素。这个方法是继承自 ParentNode 接口。

例子

// 在文档最前面添加注释(不推荐直接对 document 使用) // 更好的用法是对具体元素使用 let list = document.getElementById('myList'); let firstItem = document.createElement('li'); firstItem.textContent = '新的第一项'; list.prepend(firstItem); // 在列表开头添加 // 可以同时添加多个 let p1 = document.createElement('p'); p1.textContent = '段落1'; let p2 = document.createElement('p'); p2.textContent = '段落2'; document.body.prepend(p1, p2, '文本内容'); // 在 body 开头添加

15、document.append()

  • 含义:在文档的最后一个子节点后插入一组节点或字符串。
  • 词源:Append(在后面附加)。
  • 语法document.append(...nodesOrStrings);
  • 参数及说明
    • 可以接受多个参数,可以是节点对象或字符串。
    • 字符串会自动转换为文本节点。
    • 与 appendChild 不同,append 可以接受多个参数和字符串。

例子

// 对 body 使用 let footer = document.createElement('footer'); footer.textContent = '版权信息'; document.body.append(footer, '文档结束'); // 可以同时添加元素和文本 // 对比 appendChild 和 append let div = document.getElementById('container'); // appendChild:只能接受一个节点,不能直接加字符串 div.appendChild(document.createTextNode('文本')); // 需要先创建文本节点 // append:可以直接加字符串,且可以加多个 div.append('文本1', '文本2', document.createElement('br')); // 返回值不同 let result1 = div.appendChild(document.createElement('span')); // 返回添加的节点 let result2 = div.append('文本'); // 返回 undefined

16、document.replaceChildren()

  • 含义:替换文档的所有子节点(清空并添加新节点)。
  • 词源:Replace(替换)+ Children(孩子们)。
  • 语法document.replaceChildren(...nodesOrStrings);
  • 参数及说明
    • 可以接受多个参数,作为新的子节点。
    • 如果不传参数,则清空所有子节点。
    • 危险操作:直接对 document 使用会清空整个文档。

例子

// 安全用法:对具体元素使用 let container = document.getElementById('container'); // 清空容器 container.replaceChildren(); // 移除所有子节点 // 替换为新内容 let h2 = document.createElement('h2'); h2.textContent = '新标题'; let p = document.createElement('p'); p.textContent = '新段落'; container.replaceChildren(h2, p, '一些文本'); // 对比 和 replaceChildren() // 性能更好,且不会导致内存泄漏(事件监听器会被正确清理) // 危险示范(仅用于理解,不要执行) // document.replaceChildren(); // 这会清空整个页面!

第四部分:文档状态与交互方法(10个)

17、document.hasFocus()

  • 含义:返回一个布尔值,表示文档是否获得焦点(即页面是否处于活动状态)。
  • 词源:Has(有)+ Focus(焦点)。
  • 语法let focused = document.hasFocus();
  • 参数及说明:无参数。
  • 返回值:如果文档获得焦点返回 true,否则返回 false

例子

// 实时监控页面焦点状态 setInterval(() => { if (document.hasFocus()) { console.log('用户在浏览当前标签页'); // 可以恢复动画、轮询等 } else { console.log('用户切换到其他标签页'); // 可以暂停动画、降低资源消耗 } }, 1000); // 离开页面时暂停视频 document.addEventListener('visibilitychange', function() { if (!document.hasFocus()) { let video = document.getElementById('myVideo'); if (video && !video.paused) { video.pause(); } } });

18、document.getElementById()

  • 含义:通过元素的 id 属性获取对应的元素对象。
  • 词源:Get(获取)+ Element(元素)+ By(通过)+ Id(标识符)。
  • 语法let element = document.getElementById(id);
  • 参数及说明
    • id:要查找的元素的 ID 字符串(区分大小写)。
    • 返回值:找到的 Element 对象,如果没有找到则返回 null

例子

let header = document.getElementById('main-header'); if (header) { header.style.backgroundColor = 'yellow'; header.textContent = '找到了标题'; } else { console.log('未找到该元素'); }

19、document.getElementsByClassName()

  • 含义:通过元素的类名获取一组元素对象的集合(实时更新)。
  • 词源:Get(获取)+ Elements(元素)+ By(通过)+ Class(类)+ Name(名称)。
  • 语法let elements = document.getElementsByClassName(names);
  • 参数及说明
    • names:包含一个或多个类名的字符串(用空格分隔)。
    • 返回值:实时的 HTMLCollection 集合。

例子

// 获取所有 的元素 let items = document.getElementsByClassName('item'); console.log('找到', items.length, '个项目'); // 遍历并修改样式 for (let item of items) { item.style.border = '1px solid black'; } // 同时匹配多个类名 let activeItems = document.getElementsByClassName('item active');

20、document.getElementsByName()

  • 含义:通过元素的 name 属性获取一组元素对象的集合。
  • 词源:Get(获取)+ Elements(元素)+ By(通过)+ Name(名称)。
  • 语法let elements = document.getElementsByName(name);
  • 参数及说明
    • name:要查找的 name 属性值。
    • 返回值:NodeList 集合(非实时,静态快照)。

例子

// 常用于表单元素 let genderRadios = document.getElementsByName('gender'); // 找出选中的单选按钮 let selectedGender = null; for (let radio of genderRadios) { if (radio.checked) { selectedGender = radio.value; break; } } console.log('选中的性别:', selectedGender);

21、document.getElementsByTagName()

  • 含义:通过标签名获取一组元素对象的集合(实时更新)。
  • 词源:Get(获取)+ Elements(元素)+ By(通过)+ Tag(标签)+ Name(名称)。
  • 语法let elements = document.getElementsByTagName(tagName);
  • 参数及说明
    • tagName:标签名(如 'div''p')。特殊值 '*' 匹配所有元素。
    • 返回值:实时的 HTMLCollection

例子

let paragraphs = document.getElementsByTagName('p'); console.log('页面中有', paragraphs.length, '个段落'); // 将所有段落文字变蓝 for (let p of paragraphs) { p.style.color = 'blue'; } // 获取所有元素 let allElements = document.getElementsByTagName('*'); console.log('总元素数:', allElements.length);

22、document.getElementsByTagNameNS()

  • 含义:通过标签名和命名空间 URI 获取元素集合。
  • 词源:Get(获取)+ Elements(元素)+ By(通过)+ TagName(标签名)+ NS(命名空间)。
  • 语法let elements = document.getElementsByTagNameNS(namespaceURI, localName);
  • 参数及说明
    • namespaceURI:命名空间 URI(如 SVG 的 'http://www.w3.org/2000/svg')。
    • localName:本地标签名(如 'svg''circle')。'*' 匹配所有。
    • 返回值:实时的 NodeList

例子

// 获取所有 SVG 元素 let svgElements = document.getElementsByTagNameNS( 'http://www.w3.org/2000/svg', '*' ); console.log('SVG 元素数量:', svgElements.length); // 获取所有 circle 元素 let circles = document.getElementsByTagNameNS( 'http://www.w3.org/2000/svg', 'circle' );

23、document.querySelector()

  • 含义:返回文档中匹配指定 CSS 选择器的第一个元素。
  • 词源:Query(查询)+ Selector(选择器)。
  • 语法let element = document.querySelector(selectors);
  • 参数及说明
    • selectors:一个有效的 CSS 选择器字符串。
    • 返回值:匹配的第一个元素,没有则返回 null

例子

let firstButton = document.querySelector('button.primary'); let header = document.querySelector('#header > nav .menu-item'); let complex = document.querySelector('div[data-type="user"]:nth-child(2)'); if (firstButton) { firstButton.click(); // 自动点击第一个按钮 }

24、document.querySelectorAll()

  • 含义:返回文档中匹配指定 CSS 选择器的所有元素的静态集合。
  • 词源:Query(查询)+ Selector All(所有选择器)。
  • 语法let elementList = document.querySelectorAll(selectors);
  • 参数及说明
    • selectors:CSS 选择器字符串。
    • 返回值:静态的 NodeList(支持 forEach 方法)。

例子

let items = document.querySelectorAll('.list-item'); console.log('找到', items.length, '个项目'); // 使用 forEach 遍历 items.forEach((item, index) => { item.textContent = `项目 ${index + 1}`; }); // 复杂选择器 let checkedItems = document.querySelectorAll( 'input[type="checkbox"]:checked, input[type="radio"]:checked' );

25、document.getSelection()

  • 含义:返回用户当前在页面上选中的文本范围。
  • 词源:Get(获取)+ Selection(选择)。
  • 语法let selection = document.getSelection();
  • 参数及说明:无参数。
  • 返回值:Selection 对象,包含选中区域的信息和方法。

例子

// 监听鼠标松开事件,获取选中的文本 document.addEventListener('mouseup', function() { let selection = document.getSelection(); let selectedText = selection.toString(); if (selectedText) { console.log('选中了:', selectedText); console.log('长度:', selectedText.length); console.log('起始位置:', selection.anchorOffset); console.log('结束位置:', selection.focusOffset); } }); // 手动获取并操作选中文本 function getSelectedHtml() { let selection = document.getSelection(); if (selection.rangeCount > 0) { let range = selection.getRangeAt(0); let fragment = range.cloneContents(); let div = document.createElement('div'); div.appendChild(fragment); return div.innerHTML; } return ''; }

26、document.exitFullscreen()

  • 含义:退出全屏模式,将文档恢复到正常显示状态。
  • 词源:Exit(退出)+ Fullscreen(全屏)。
  • 语法let promise = document.exitFullscreen();
  • 参数及说明
    • 无参数。
    • 返回值:一个 Promise,在全屏退出成功后 resolved,失败时 rejected。
    • 通常与 document.fullscreenElement 配合使用。

例子

// 退出全屏按钮 let exitBtn = document.getElementById('exit-fullscreen'); exitBtn.addEventListener('click', function() { if (document.fullscreenElement) { document.exitFullscreen() .then(() => console.log('成功退出全屏')) .catch((err) => { console.error('退出全屏失败:', err); alert('退出全屏失败:' + err.message); }); } }); // 按 ESC 键时自动退出全屏(浏览器默认行为,这里只是演示) document.addEventListener('fullscreenchange', function() { if (!document.fullscreenElement) { console.log('已退出全屏模式'); // 恢复一些 UI 状态 document.body.classList.remove('fullscreen-mode'); } else { document.body.classList.add('fullscreen-mode'); } }); // 全屏切换函数 async function toggleFullscreen(element) { if (!document.fullscreenElement) { // 进入全屏 await element.requestFullscreen(); } else { // 退出全屏 await document.exitFullscreen(); } }

第五部分:坐标与范围方法(6个)

27、document.elementFromPoint()

  • 含义:返回在页面指定坐标处最顶层的元素。
  • 词源:Element(元素)+ From(从)+ Point(点)。
  • 语法let element = document.elementFromPoint(x, y);
  • 参数及说明
    • x:相对于视口的水平坐标(像素)。
    • y:相对于视口的垂直坐标(像素)。
    • 返回值:指定坐标处的 Element,如果坐标在视口外则返回 null

例子

// 获取屏幕中心点的元素 let centerX = window.innerWidth / 2; let centerY = window.innerHeight / 2; let centerElement = document.elementFromPoint(centerX, centerY); console.log('屏幕中心点的元素:', centerElement.tagName); // 监听点击,并获取点击处的元素(即使有事件冒泡也能获取最上层元素) document.addEventListener('click', function(event) { let elemAtPoint = document.elementFromPoint(event.clientX, event.clientY); console.log('点击处最上层的元素:', elemAtPoint.tagName, elemAtPoint.className); });

28、document.elementsFromPoint()

  • 含义:返回在页面指定坐标处所有元素的数组(从最顶层到最底层)。
  • 词源:Elements(元素)+ From(从)+ Point(点)。
  • 语法let elements = document.elementsFromPoint(x, y);
  • 参数及说明
    • x:相对于视口的水平坐标。
    • y:相对于视口的垂直坐标。
    • 返回值:包含所有重叠元素的数组,按 z-index 从高到低排列。

例子

document.addEventListener('mousemove', function(event) { let elements = document.elementsFromPoint(event.clientX, event.clientY); // 显示鼠标下方的所有元素 let tagNames = elements.map(el => el.tagName).join(' → '); console.log('鼠标下方元素层级:', tagNames); // 调试:高亮所有元素 elements.forEach((el, index) => { el.style.outline = index === 0 ? '2px solid red' : '1px dashed blue'; }); }); // 检查某个位置是否有特定元素 function hasElementAtPoint(x, y, selector) { let elements = document.elementsFromPoint(x, y); return elements.some(el => el.matches(selector)); }

29、document.getClientRects()

  • 含义:返回元素在页面上占据的所有矩形区域(通常用于获取内联元素的换行信息)。
  • 词源:Get(获取)+ Client(客户端)+ Rects(矩形)。
  • 语法let rectCollection = element.getClientRects();
  • 参数及说明
    • 这个方法通常在具体的元素上调用,而不是 document
    • 返回值:DOMRectList 对象,包含一个或多个 DOMRect 对象。

例子

// 注意:这个方法属于 Element,但这里列出是因为你提到了 let textSpan = document.getElementById('multi-line-text'); // 获取内联元素的所有矩形(例如换行后会有多个矩形) let rects = textSpan.getClientRects(); console.log('这个元素占据', rects.length, '个矩形区域'); for (let i = 0; i < rects.length; i++) { let rect = rects[i]; console.log(`矩形 ${i + 1}:`, { left: rect.left, top: rect.top, right: rect.right, bottom: rect.bottom, width: rect.width, height: rect.height }); } // 判断文本是否换行 if (rects.length > 1) { console.log('文本换行了'); }

30、document.createRange()

  • 含义:创建一个新的 Range 对象,表示文档中的一个连续区域。
  • 词源:Create(创建)+ Range(范围)。
  • 语法let range = document.createRange();
  • 参数及说明:无参数。返回一个初始化的空 Range 对象。

例子

// 创建范围 let range = document.createRange(); // 设置范围的起点和终点 let startNode = document.getElementById('start'); let endNode = document.getElementById('end'); // 从 startNode 的第 2 个子节点开始,偏移量为 0 range.setStart(startNode, 2); // 到 endNode 的第 1 个子节点结束,偏移量为 3 range.setEnd(endNode, 1); // 获取范围内的内容 let fragment = range.cloneContents(); // 克隆内容 let selectedText = range.toString(); // 获取纯文本 console.log('选中文本:', selectedText); // 高亮选中的范围 let highlightSpan = document.createElement('span'); highlightSpan.style.backgroundColor = 'yellow'; range.surroundContents(highlightSpan); // 用 span 包裹范围内容 // 更简单的用法:选中整个元素内容 let element = document.getElementById('article'); range.selectNodeContents(element); let content = range.toString();

31、document.caretPositionFromPoint()

  • 含义:返回指定坐标处的光标位置信息(用于文本编辑)。
  • 词源:Caret(光标)+ Position(位置)+ From(从)+ Point(点)。
  • 语法let caretPosition = document.caretPositionFromPoint(x, y);
  • 参数及说明
    • x:相对于视口的水平坐标(像素)。
    • y:相对于视口的垂直坐标(像素)。
    • 返回值:一个 CaretPosition 对象,包含 offsetNode(节点)和 offset(偏移量),如果坐标处没有文本则返回 null
    • 注意:这是一个较新的 API,现代浏览器支持良好。

例子

// 在可编辑区域中点击时获取光标位置 let editor = document.getElementById('editor'); editor.addEventListener('click', function(event) { let caretPos = document.caretPositionFromPoint(event.clientX, event.clientY); if (caretPos) { let node = caretPos.offsetNode; let offset = caretPos.offset; console.log('点击的文本节点:', node); console.log('字符偏移量:', offset); // 如果是文本节点,可以获取附近的文本 if (node.nodeType === Node.TEXT_NODE) { let text = node.textContent; let before = text.substring(0, offset); let after = text.substring(offset); console.log('光标前:', before); console.log('光标后:', after); } } }); // 实现自定义的文本插入 function insertTextAtCursor(text) { let selection = document.getSelection(); if (selection.rangeCount > 0) { let range = selection.getRangeAt(0); range.deleteContents(); // 删除选中的内容 range.insertNode(document.createTextNode(text)); // 插入新文本 } } // 获取鼠标位置最近的单词 document.addEventListener('mouseup', function(event) { let caretPos = document.caretPositionFromPoint(event.clientX, event.clientY); if (caretPos && caretPos.offsetNode.nodeType === Node.TEXT_NODE) { let text = caretPos.offsetNode.textContent; let pos = caretPos.offset; // 简单实现:找到光标所在的单词 let words = text.split(/\s+/); let charCount = 0; for (let word of words) { if (pos >= charCount && pos <= charCount + word.length) { console.log('点击的单词:', word); break; } charCount += word.length + 1; // +1 空格 } } });

32、 document.evaluate()

  • 含义:评估 XPath 表达式,返回匹配的结果。
  • 词源:Evaluate(评估)。
  • 语法let xpathResult = document.evaluate(xpathExpression, contextNode, namespaceResolver, resultType, result);
  • 参数及说明
    • xpathExpression:XPath 表达式字符串。
    • contextNode:上下文节点(通常是 document)。
    • namespaceResolver:命名空间解析函数(通常为 null)。
    • resultType:返回结果的类型。
    • result:可重用的结果对象(通常为 null)。

例子

// 查找所有 class 为 "item" 的 div let result = document.evaluate( '//div[@class="item"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null ); for (let i = 0; i < result.snapshotLength; i++) { console.log(result.snapshotItem(i)); // 输出匹配的元素 } // 查找第一个 h1 标题 let h1 = document.evaluate( '//h1', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue; console.log('第一个h1:', h1);

第六部分:创建方法(6个)

33、document.createAttribute()

  • 含义:创建一个新的属性节点(通常不推荐使用,建议用 setAttribute)。
  • 词源:Create(创建)+ Attribute(属性)。
  • 语法let attrNode = document.createAttribute(name);
  • 参数及说明
    • name:属性的名称。
    • 返回值:新创建的 Attr 节点,包含 name 和 value 属性。

例子

// 创建属性节点 let classAttr = document.createAttribute('class'); classAttr.value = 'highlight bold'; let dataAttr = document.createAttribute('data-id'); dataAttr.value = '12345'; // 将属性应用到元素 let div = document.getElementById('myDiv'); div.setAttributeNode(classAttr); div.setAttributeNode(dataAttr); console.log(div.outerHTML); // <div></div> // 更简单的方式(推荐) // div.setAttribute('class', 'highlight bold'); // div.setAttribute('data-id', '12345');

34、document.createComment()

  • 含义:创建一个新的注释节点。
  • 词源:Create(创建)+ Comment(注释)。
  • 语法let commentNode = document.createComment(data);
  • 参数及说明
    • data:注释的内容字符串。
    • 返回值:新创建的 Comment 节点。

例子

// 创建注释 let comment1 = document.createComment('这是动态生成的注释'); let comment2 = document.createComment('创建时间:' + new Date().toLocaleString()); // 添加到页面 document.body.appendChild(comment1); document.getElementById('footer').appendChild(comment2); // 在 HTML 源码中会看到: // <!--这是动态生成的注释--> // <!--创建时间:2024/1/15 14:30:00--> // 也可以用于调试标记 function addDebugComment(element, message) { let comment = document.createComment(`DEBUG: ${message}`); element.parentNode.insertBefore(comment, element); }

35、document.createDocumentFragment()

  • 含义:创建一个空的文档片段(轻量级的文档容器,用于批量操作)。
  • 词源:Create(创建)+ Document(文档)+ Fragment(片段)。
  • 语法let fragment = document.createDocumentFragment();
  • 参数及说明:无参数。返回一个空的 DocumentFragment 对象。

例子

// 创建片段 let fragment = document.createDocumentFragment(); // 批量创建元素(只触发一次重绘) for (let i = 0; i < 1000; i++) { let li = document.createElement('li'); li.textContent = `列表项 ${i + 1}`; li.className = i % 2 === 0 ? 'even' : 'odd'; fragment.appendChild(li); // 先添加到片段,不会触发重绘 } // 一次性添加到 DOM(只触发一次重绘) let list = document.getElementById('big-list'); list.appendChild(fragment); console.log('1000 个项目已高效添加'); // 另一个例子:构建复杂结构 function buildCard(title, content) { let fragment = document.createDocumentFragment(); let header = document.createElement('h3'); header.textContent = title; let body = document.createElement('p'); body.textContent = content; let footer = document.createElement('div'); footer.className = 'card-footer'; fragment.appendChild(header); fragment.appendChild(body); fragment.appendChild(footer); return fragment; }

36、document.createEvent()

  • 含义:创建一个新的事件对象(旧式方法,推荐使用 new Event() 构造函数)。
  • 词源:Create(创建)+ Event(事件)。
  • 语法let event = document.createEvent(type);
  • 参数及说明
    • type:事件类型字符串,如:
      • 'MouseEvents':鼠标事件
      • 'HTMLEvents':HTML 事件
      • 'UIEvents':UI 事件
      • 'KeyboardEvents':键盘事件
    • 返回值:创建的事件对象,需要进一步初始化。

例子

// 旧式方法(不推荐,仅为了解) // 创建鼠标事件 let clickEvent = document.createEvent('MouseEvents'); clickEvent.initMouseEvent( 'click', // 事件类型 true, // 是否冒泡 true, // 是否可取消 window, // 视图 0, // 点击次数 100, 100, // 屏幕坐标 50, 50, // 客户区坐标 false, false, false, false, // Ctrl, Alt, Shift, Meta 0, // 鼠标按钮(0=左键) null // 相关目标 ); // 派发事件 let button = document.getElementById('myButton'); button.dispatchEvent(clickEvent); // 现代推荐写法 // let clickEvent = new MouseEvent('click', { // bubbles: true, // clientX: 50, // clientY: 50 // });

37、document.createElement()

  • 含义:创建一个新的 HTML 元素节点。
  • 词源:Create(创建)+ Element(元素)。
  • 语法let element = document.createElement(tagName, options);
  • 参数及说明
    • tagName:要创建的元素的标签名(如 'div''span''custom-element')。
    • options(可选):一个对象,可以包含 is 属性来指定自定义元素。
    • 返回值:新创建的 Element 对象。

例子

// 基本用法 let div = document.createElement('div'); div.id = 'new-div'; div.className = 'box'; div.textContent = '我是新创建的 Div'; // 设置样式 div.style.padding = '10px'; div.style.backgroundColor = 'lightblue'; // 创建自定义元素(如果已注册) // let myElement = document.createElement('custom-element', { is: 'my-button' }); // 添加到页面 document.body.appendChild(div); // 创建带命名空间的元素(如 SVG) let svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg'); let circle = document.createElementNS('http://www.w3.org/2000/svg', 'circle'); svg.appendChild(circle);

38、document.createTextNode()

  • 含义:创建一个新的文本节点。
  • 词源:Create(创建)+ Text(文本)+ Node(节点)。
  • 语法let textNode = document.createTextNode(data);
  • 参数及说明
    • data:一个字符串,是要放入文本节点的内容。
    • 返回值:新创建的 Text 节点。

例子

// 创建文本节点 let text1 = document.createTextNode('这是一段普通文本'); let text2 = document.createTextNode('另一段文本'); // 创建元素并添加文本 let paragraph = document.createElement('p'); paragraph.appendChild(text1); // 在文本后追加更多文本 paragraph.appendChild(document.createTextNode(' - 追加的内容')); // 修改文本内容 text1.nodeValue = '修改后的文本'; // 注意:createTextNode 会转义 HTML 标签 let safeText = document.createTextNode('<script>alert("xss")</script>'); // 页面会显示原文,不会执行脚本 document.body.appendChild(safeText);

第七部分:比较与命名空间方法(7个)

39、document.compareDocumentPosition()

  • 含义:比较当前文档和另一个节点的位置关系。
  • 词源:Compare(比较)+ Document(文档)+ Position(位置)。
  • 语法let relationship = document.compareDocumentPosition(otherNode);
  • 参数及说明
    • otherNode:要比较的另一个节点。
    • 返回值:一个位掩码(整数),表示两个节点的关系。可能的值:
      • 0:两个节点相同
      • 1:节点不在同一文档中
      • 2:otherNode 在当前节点之前
      • 4:otherNode 在当前节点之后
      • 8:otherNode 包含当前节点
      • 16:otherNode 被当前节点包含
      • 32:浏览器的私有使用

例子

let head = document.head; let body = document.body; // 比较 head 和 body 的位置 let result = head.compareDocumentPosition(body); // 使用位运算检查关系 if (result & Node.DOCUMENT_POSITION_FOLLOWING) { console.log('head 在 body 之前'); // 通常会输出这个 } if (result & Node.DOCUMENT_POSITION_PRECEDING) { console.log('head 在 body 之后'); } // 检查元素是否包含另一个元素 let parent = document.getElementById('parent'); let child = document.getElementById('child'); if (parent.compareDocumentPosition(child) & Node.DOCUMENT_POSITION_CONTAINED_BY) { console.log('child 被 parent 包含'); } // 常量定义(便于阅读) const POSITION = { DISCONNECTED: 1, PRECEDING: 2, FOLLOWING: 4, CONTAINS: 8, CONTAINED_BY: 16 };

40、document.contains()

  • 含义:检查一个节点是否是文档的后代节点。
  • 词源:Contains(包含)。
  • 语法let isDescendant = document.contains(otherNode);
  • 参数及说明
    • otherNode:要检查的节点。
    • 返回值:布尔值,如果节点是文档的一部分返回 true,否则返回 false

例子

let div = document.getElementById('myDiv'); console.log(document.contains(div)); // true(div 在页面中) // 检查新创建的节点 let newDiv = document.createElement('div'); console.log(document.contains(newDiv)); // false(还没添加到页面) // 添加到页面后 document.body.appendChild(newDiv); console.log(document.contains(newDiv)); // true // 检查 null 或 undefined console.log(document.contains(null)); // false // 检查文档自身 console.log(document.contains(document)); // true // 实用场景:检查元素是否还在 DOM 中 function isInDOM(element) { return document.contains(element); } // 定期检查元素是否存在 let element = document.getElementById('temp'); setInterval(() => { if (!document.contains(element)) { console.log('元素已被移除'); element = null; } }, 1000);

41、document.isDefaultNamespace()

  • 含义:检查指定的命名空间 URI 是否为文档的默认命名空间。
  • 词源:Is(是)+ Default(默认)+ Namespace(命名空间)。
  • 语法let bool = document.isDefaultNamespace(namespaceURI);
  • 参数及说明
    • namespaceURI:要检查的命名空间 URI 字符串。
    • 返回值:布尔值,如果是默认命名空间返回 true,否则返回 false

例子

// 检查 HTML 命名空间 let isHTML = document.isDefaultNamespace('http://www.w3.org/1999/xhtml'); console.log('是 HTML 默认命名空间?', isHTML); // true // 检查 SVG 命名空间 let isSVG = document.isDefaultNamespace('http://www.w3.org/2000/svg'); console.log('是 SVG 默认命名空间?', isSVG); // false // 在 XML 文档中使用 if (document.isDefaultNamespace('http://www.w3.org/1999/xhtml')) { console.log('当前是 HTML 文档'); }

42、document.isEqualNode()

  • 含义:检查两个节点是否相等(具有相同的类型、属性、子节点等,但不一定是同一个引用)。
  • 词源:Is(是)+ Equal(相等)+ Node(节点)。
  • 语法let isEqual = document.isEqualNode(otherNode);
  • 参数及说明
    • otherNode:要比较的另一个节点。
    • 返回值:布尔值,如果两个节点完全相等返回 true

例子

// 创建两个结构相同的元素 let div1 = document.createElement('div'); div1.id = 'test'; div1.className = 'box'; div1.textContent = '内容'; let div2 = document.createElement('div'); div2.id = 'test'; div2.className = 'box'; div2.textContent = '内容'; // 检查是否相等(结构相同) console.log(div1.isEqualNode(div2)); // true // 检查是否是同一个节点(引用相同) console.log(div1 === div2); // false // 稍微修改一点 div2.textContent = '不同内容'; console.log(div1.isEqualNode(div2)); // false // 比较文档片段 let frag1 = document.createDocumentFragment(); let frag2 = document.createDocumentFragment(); console.log(frag1.isEqualNode(frag2)); // true(都是空片段) // 实用场景:检查两个元素是否相同(不考虑引用) function areElementsIdentical(el1, el2) { return el1.isEqualNode(el2); }

43、document.isSameNode()

  • 含义:检查两个节点是否是同一个节点(引用相同)。
  • 词源:Is(是)+ Same(相同)+ Node(节点)。
  • 语法let isSame = document.isSameNode(otherNode);
  • 参数及说明
    • otherNode:要比较的另一个节点。
    • 返回值:布尔值,如果两个节点是同一个对象返回 true

例子

let div1 = document.getElementById('myDiv'); let div2 = document.getElementById('myDiv'); // 检查是否是同一个节点 console.log(div1.isSameNode(div2)); // true // 等价于 console.log(div1 === div2); // true // 复制后的节点不是同一个 let div3 = div1.cloneNode(true); console.log(div1.isSameNode(div3)); // false // 实用场景:避免重复处理 function processElement(element) { if (processedElement && processedElement.isSameNode(element)) { console.log('已经处理过这个元素了'); return; } // 处理元素 processedElement = element; }

44、document.lookupNamespaceURI()

  • 含义:返回给定前缀对应的命名空间 URI。
  • 词源:Lookup(查找)+ Namespace(命名空间)+ URI。
  • 语法let namespaceURI = document.lookupNamespaceURI(prefix);
  • 参数及说明
    • prefix:要查找的前缀字符串(如 'svg''xhtml')。传入 null 返回默认命名空间。
    • 返回值:对应的命名空间 URI 字符串,如果没有则返回 null

例子

// 查找默认命名空间 let defaultNS = document.lookupNamespaceURI(null); console.log('默认命名空间:', defaultNS); // 'http://www.w3.org/1999/xhtml' // 查找特定前缀的命名空间 let svgNS = document.lookupNamespaceURI('svg'); console.log('SVG 命名空间:', svgNS); // 'http://www.w3.org/2000/svg' let xlinkNS = document.lookupNamespaceURI('xlink'); console.log('XLink 命名空间:', xlinkNS); // 'http://www.w3.org/1999/xlink' // 在 XML 文档中使用 function getNamespaceInfo() { return { default: document.lookupNamespaceURI(null), html: document.lookupNamespaceURI('html'), svg: document.lookupNamespaceURI('svg'), math: document.lookupNamespaceURI('math') }; }

45、document.lookupPrefix()

  • 含义:返回给定命名空间 URI 对应的前缀。
  • 词源:Lookup(查找)+ Prefix(前缀)。
  • 语法let prefix = document.lookupPrefix(namespaceURI);
  • 参数及说明
    • namespaceURI:要查找的命名空间 URI 字符串。
    • 返回值:对应的前缀字符串,如果没有则返回 null

例子

// 查找 HTML 命名空间的前缀 let htmlPrefix = document.lookupPrefix('http://www.w3.org/1999/xhtml'); console.log('HTML 前缀:', htmlPrefix); // null(HTML 是默认命名空间,无前缀) // 查找 SVG 命名空间的前缀 let svgPrefix = document.lookupPrefix('http://www.w3.org/2000/svg'); console.log('SVG 前缀:', svgPrefix); // 'svg'(如果有定义) // 查找 XLink 命名空间的前缀 let xlinkPrefix = document.lookupPrefix('http://www.w3.org/1999/xlink'); console.log('XLink 前缀:', xlinkPrefix); // 'xlink' // 实用场景:根据 URI 获取前缀 function getPrefixForURI(uri) { let prefix = document.lookupPrefix(uri); return prefix || '(默认命名空间)'; }

第八部分:文档写入方法(4个)

46、document.open()

  • 含义:打开一个文档流,准备写入内容。会清空当前文档。
  • 词源:Open(打开)。
  • 语法document.open();
  • 参数及说明
    • 可以接受可选的 MIME 类型和替换参数,但通常不传参。
    • 调用后会清空当前文档的所有内容。
    • 危险操作:会清除当前页面。

例子

// 基本用法(极度危险!) // document.open(); // document.write('<h1>新页面</h1>'); // document.close(); // 在新窗口中使用 function openInNewWindow() { let newWindow = window.open(); newWindow.document.open(); newWindow.document.write(` <!DOCTYPE html> <html> <head><title>新窗口</title></head> <body> <h1>动态生成的内容</h1> <p>当前时间:${new Date()}</p> </body> </html> `); newWindow.document.close(); } // 安全用法:仅在需要完全重写文档时使用 function resetDocument() { if (confirm('确定要清空页面吗?')) { document.open(); document.write('<h1>页面已重置</h1>'); document.close(); } }

47、document.close()

  • 含义:关闭由 open() 打开的文档流,并完成文档写入。
  • 词源:Close(关闭)。
  • 语法document.close();
  • 参数及说明:无参数。必须在 write() 操作完成后调用。

例子

// 配合 open 和 write 使用 function generatePDFView() { document.open(); document.write('<h1>PDF 查看器</h1>'); document.write('<embed src="doc.pdf" type="application/pdf">'); document.close(); // 完成写入 } // 错误示范:忘记 close 可能导致内容不显示 function badExample() { document.open(); document.write('这段文字可能不会显示'); // 忘记 document.close() }

48、document.write()

  • 含义:向文档中写入 HTML 或 JavaScript 代码。
  • 词源:Write(写入)。
  • 语法document.write(markup);
  • 参数及说明
    • markup:要写入的 HTML 字符串。
    • 重要警告
      • 如果在页面加载完成后调用,会覆盖整个文档。
      • 在 XHTML 文档中无效。
      • 现代开发中极少使用,推荐使用 DOM 操作方法。

例子

// 在文档加载期间使用(传统用法) // <script> // document.write('<p>当前时间:' + new Date() + '</p>'); // </script> // 危险用法:页面加载完成后调用会覆盖页面 document.getElementById('btn').addEventListener('click', function() { // document.write('新内容'); // 这样会清空整个页面! }); // 用于加载备用资源 if (!document.querySelector('script[src="jquery.js"]')) { document.write('<script src="jquery.js"><\/script>'); } // 现代替代方案 // 使用 innerHTML 或 DOM 方法 let p = document.createElement('p'); p.textContent = '当前时间:' + new Date(); document.body.appendChild(p);

49、document.writeln()

  • 含义:和 write() 类似,但在末尾添加一个换行符。
  • 词源:Write(写入)+ Line(行)。
  • 语法document.writeln(markup);
  • 参数及说明
    • markup:要写入的 HTML 字符串。
    • 在 HTML 中换行符通常不可见,但在 <pre> 标签内或文本节点中有效。

例子

// 在 <pre> 标签中使用有效 document.write('<pre>'); document.writeln('第一行文本'); document.writeln('第二行文本'); document.writeln('第三行文本'); document.write('</pre>'); // 查看源码时会看到换行 // 第一行文本\n // 第二行文本\n // 第三行文本 // 生成文本文件内容 function generateTextFile() { let; document.write('<pre>'); document.writeln('姓名,年龄,城市'); document.writeln('张三,25,北京'); document.writeln('李四,30,上海'); document.write('</pre>'); }

第九部分:高级方法(2个)

50、document.getAnimations()

  • 含义:返回当前文档中所有有效的动画对象(包括 CSS 动画和过渡)。
  • 词源:Get(获取)+ Animations(动画)。
  • 语法let animations = document.getAnimations();
  • 参数及说明:无参数。
  • 返回值:一个 Array 数组,包含所有正在运行的 Animation 对象。

例子

// 获取所有动画 let allAnimations = document.getAnimations(); console.log('页面中有 ' + allAnimations.length + ' 个动画'); // 暂停所有动画 function pauseAllAnimations() { document.getAnimations().forEach(animation => { animation.pause(); }); console.log('所有动画已暂停'); } // 恢复所有动画 function playAllAnimations() { document.getAnimations().forEach(animation => { animation.play(); }); } // 获取特定元素的动画 function getElementAnimations(element) { return document.getAnimations().filter(animation => animation.effect && animation.effect.target === element ); } // 当页面隐藏时暂停动画(性能优化) document.addEventListener('visibilitychange', () => { if (document.hidden) { document.getAnimations().forEach(anim => anim.pause()); } else { document.getAnimations().forEach(anim => anim.play()); } }); // 动画完成时的 Promise async function waitForAllAnimations() { let animations = document.getAnimations(); await Promise.all(animations.map(anim => anim.finished)); console.log('所有动画完成'); }

51、document.getBoxQuads()(实验性 API)

  • 含义:返回元素的盒子四边形的信息(实验性 API,支持度有限)。
  • 词源:Get(获取)+ Box(盒子)+ Quads(四边形)。
  • 语法let quads = document.getBoxQuads(options);
  • 参数及说明
    • options(可选):配置对象。
      • box:指定哪个 CSS 盒子,可选值:'content''padding''border''margin'
      • relativeTo:相对于哪个元素计算坐标。
    • 返回值:一个 DOMQuad 数组,表示元素的几何信息。

例子

// 注意:这是一个实验性 API,当前浏览器支持有限 // 获取元素的内容盒子的四边形 let element = document.getElementById('myElement'); if (element.getBoxQuads) { let quads = element.getBoxQuads({ box: 'border' }); quads.forEach((quad, index) => { console.log(`四边形 ${index + 1}:`, { p1: { x: quad.p1.x, y: quad.p1.y }, p2: { x: quad.p2.x, y: quad.p2.y }, p3: { x: quad.p3.x, y: quad.p3.y }, p4: { x: quad.p4.x, y: quad.p4.y } }); // 获取边界矩形 let bounds = quad.getBounds(); console.log('边界:', bounds); }); } // 相对于视口获取位置 if (element.getBoxQuads) { let quads = element.getBoxQuads({ box: 'margin', relativeTo: document.querySelector('#container') }); } // 检查元素是否变形(实验性) function isElementTransformed(element) { if (!element.getBoxQuads) return false; let quads = element.getBoxQuads({ box: 'border' }); if (quads.length === 0) return false; let quad = quads[0]; // 检查是否是矩形(简单判断) let isRect = Math.abs(quad.p1.x - quad.p2.x) > 0.1 && Math.abs(quad.p2.y - quad.p3.y) > 0.1 && Math.abs(quad.p3.x - quad.p4.x) > 0.1 && Math.abs(quad.p4.y - quad.p1.y) > 0.1; return !isRect; }

总 结 列 表

        下面对上面讲解的JavaScript 的document 对象 51 个常见的方法进行总结列表。

第一部分:事件处理方法(4个)

方法含义词源语法参数及说明
1document.addEventListener()向文档添加事件监听器。"add"(添加)+ "EventListener"(事件监听器)document.addEventListener(type, listener, options);type: 事件类型字符串(如"click")。listener: 事件触发时要调用的函数或对象。options: 可选,配置对象(captureoncepassive)或布尔值(表示是否在捕获阶段触发)。
2document.removeEventListener()从文档移除事件监听器。"remove"(移除)+ "EventListener"(事件监听器)document.removeEventListener(type, listener, options);type: 要移除的事件类型。listener: 要移除的事件处理函数。options: 可选,与添加时相同的配置选项或布尔值,必须与添加时匹配才能移除。
3document.dispatchEvent()向文档派发一个自定义事件。"dispatch"(派遣、发送)+ "Event"(事件)let result = document.dispatchEvent(event);event: 要派发的 Event 对象(通常用 new Event() 或 new CustomEvent() 创建)。返回值是一个布尔值,表示是否有事件处理程序调用了 preventDefault()
4document.execCommand()在可编辑内容区域执行一个命令。"exec"(执行)+ "Command"(命令)document.execCommand(commandId, showUI, value);commandId: 命令名称字符串(如"bold"、"copy")。showUI: 布尔值,是否显示用户界面(通常设为 false)。value: 可选,某些命令需要的额外参数(如插入链接时的 URL)。已废弃,不建议使用。

第二部分:节点导入与采用方法(2个)

方法含义词源语法参数及说明
5document.adoptNode()从其他文档中采纳一个节点,使其归属到当前文档。"adopt"(采纳、收养)let adoptedNode = document.adoptNode(node);node: 要从其他文档中采纳的节点。采纳后,原文档中的该节点会被移除。返回值是被采纳的节点。
6document.importNode()从其他文档中导入一个节点,但保留原文档中的节点。"import"(导入)let importedNode = document.importNode(node, deep);node: 要从其他文档中导入的节点。deep: 布尔值,是否深拷贝(导入节点及其所有子节点)。返回值是导入的节点副本。

第三部分:节点操作方法(10个)

方法含义词源语法参数及说明
7document.appendChild()向文档末尾添加一个子节点。"append"(追加)+ "Child"(子节点)document.appendChild(node);node: 要添加的节点。注意:document 通常不允许直接添加子节点(根元素唯一),实际使用中更多用于元素节点。
8document.cloneNode()克隆文档节点。"clone"(克隆)let clonedNode = document.cloneNode(deep);deep: 可选布尔值,true 表示深克隆(克隆节点及其所有子节点),false 表示浅克隆(只克隆节点本身)。
9document.insertBefore()在参考节点之前插入一个子节点。"insert"(插入)+ "Before"(在...之前)document.insertBefore(newNode, referenceNode);newNode: 要插入的节点。referenceNode: 参考节点(在此节点之前插入)。如果为 null,则插入到末尾。
10document.replaceChild()替换文档中的一个子节点。"replace"(替换)+ "Child"(子节点)let replacedNode = document.replaceChild(newChild, oldChild);newChild: 新节点。oldChild: 要被替换的旧节点。返回值是被替换的旧节点。
11document.removeChild()从文档中移除一个子节点。"remove"(移除)+ "Child"(子节点)let removedNode = document.removeChild(node);node: 要移除的子节点。返回值是被移除的节点。
12document.hasChildNodes()检查文档是否有子节点。"has"(有)+ "Child"(子)+ "Nodes"(节点们)let hasChildren = document.hasChildNodes();无参数。返回值是布尔值,true 表示有子节点,false 表示没有。
13document.normalize()合并文档中相邻的文本节点并移除空文本节点。"normalize"(规范化)document.normalize();无参数。用于清理文档树中的文本节点。
14document.prepend()在文档的第一个子节点之前插入一组节点或字符串。"prepend"(在前面附加)document.prepend(...nodesOrStrings);接受一个或多个参数,可以是 Node 对象或字符串(字符串会自动转换为文本节点)。
15document.append()在文档的最后一个子节点之后插入一组节点或字符串。"append"(追加)document.append(...nodesOrStrings);接受一个或多个参数,可以是 Node 对象或字符串(字符串会自动转换为文本节点)。
16document.replaceChildren()替换文档的所有子节点。"replace"(替换)+ "Children"(子节点们)document.replaceChildren(...nodesOrStrings);接受一个或多个参数,可以是 Node 对象或字符串。如果没有提供参数,则清空所有子节点。

第四部分:文档状态与交互方法(10个)

方法含义词源语法参数及说明
17document.hasFocus()检查文档或文档内的任何元素是否获得焦点。"has"(有)+ "Focus"(焦点)let focused = document.hasFocus();无参数。返回值是布尔值,true 表示文档获得焦点。
18document.getElementById()通过 id 属性获取元素。"get"(获取)+ "Element"(元素)+ "ById"(通过Id)let element = document.getElementById(id);id: 字符串,要查找的元素 id 属性值。返回值是匹配的 Element 对象,如果没有则返回 null。
19document.getElementsByClassName()通过类名获取元素集合。"get"(获取)+ "Elements"(元素们)+ "ByClassName"(通过类名)let elements = document.getElementsByClassName(names);names: 字符串,包含一个或多个类名的空格分隔列表。返回值为动态更新的 HTMLCollection。
20document.getElementsByName()通过 name 属性获取元素集合。"get"(获取)+ "Elements"(元素们)+ "ByName"(通过名字)let elements = document.getElementsByName(name);name: 字符串,元素的 name 属性值。返回值为 NodeList。
21document.getElementsByTagName()通过标签名获取元素集合。"get"(获取)+ "Elements"(元素们)+ "ByTagName"(通过标签名)let elements = document.getElementsByTagName(tagName);tagName: 字符串,标签名(如"div")。可使用"*"匹配所有元素。返回值为动态更新的 HTMLCollection。
22document.getElementsByTagNameNS()通过命名空间和标签名获取元素集合。"get"(获取)+ "Elements"(元素们)+ "ByTagNameNS"(通过标签名+命名空间)let elements = document.getElementsByTagNameNS(namespace, tagName);namespace: 字符串,元素的命名空间 URI。tagName: 字符串,标签名。返回值为 NodeList。
23document.querySelector()返回匹配指定 CSS 选择器的第一个元素。"query"(查询)+ "Selector"(选择器)let element = document.querySelector(selectors);selectors: 字符串,CSS 选择器。返回值是匹配的第一个 Element 对象,如果没有则返回 null。
24document.querySelectorAll()返回匹配指定 CSS 选择器的所有元素的静态 NodeList。"query"(查询)+ "Selector"(选择器)+ "All"(所有)let elementList = document.querySelectorAll(selectors);selectors: 字符串,CSS 选择器。返回值为静态的(非动态)NodeList。
25document.getSelection()返回用户当前选中的文本范围。"get"(获取)+ "Selection"(选择区域)let selection = document.getSelection();无参数。返回值是一个 Selection 对象,包含选中的文本信息。
26document.exitFullscreen()退出全屏模式。"exit"(退出)+ "Fullscreen"(全屏)document.exitFullscreen();无参数。返回一个 Promise,在全屏退出后兑现。

第五部分:坐标与范围方法(6个)

方法含义词源语法参数及说明
27document.elementFromPoint()返回视口中指定坐标点最上层的元素。"element"(元素)+ "from"(从)+ "point"(点)let element = document.elementFromPoint(x, y);x: 相对于视口左边界的水平坐标。y: 相对于视口上边界的垂直坐标。返回值是位于该点的最上层 Element。
28document.elementsFromPoint()返回视口中指定坐标点的所有元素的数组。"elements"(元素们)+ "from"(从)+ "point"(点)let elements = document.elementsFromPoint(x, y);x: 相对于视口左边界的水平坐标。y: 相对于视口上边界的垂直坐标。返回值是一个包含所有覆盖该点的元素的数组。
29document.getClientRects()返回文档中文本矩形集合。"get"(获取)+ "ClientRects"(客户端矩形区域)let rectCollection = document.getClientRects();无参数。通常用于文本节点,返回一个 DOMRectList 集合。
30document.createRange()创建一个新的 Range 对象。"create"(创建)+ "Range"(范围)let range = document.createRange();无参数。返回一个空的 Range 对象,可用于选取文档的一部分。
31document.caretPositionFromPoint()返回指定坐标点的插入符号位置。"caret"(光标)+ "position"(位置)+ "from"(从)+ "point"(点)let caretPos = document.caretPositionFromPoint(x, y);x: 水平坐标。y: 垂直坐标。返回一个 CaretPosition 对象,包含节点和偏移量。
32document.evaluate()执行 XPath 表达式并返回结果。"evaluate"(评估、计算)let result = document.evaluate(xpathExpression, contextNode, namespaceResolver, resultType, result);xpathExpression: XPath 表达式字符串。contextNode: 上下文节点。namespaceResolver: 命名空间解析函数。resultType: 返回结果类型常量。result: 可重用的 XPathResult 对象。

第六部分:创建方法(6个)

方法含义词源语法参数及说明
33document.createAttribute()创建一个新的属性节点。"create"(创建)+ "Attribute"(属性)let attr = document.createAttribute(name);name: 字符串,属性的名称。返回值是一个 Attr 节点。已废弃,推荐使用 setAttribute()
34document.createComment()创建一个新的注释节点。"create"(创建)+ "Comment"(注释)let comment = document.createComment(data);data: 字符串,注释内容。返回值是一个 Comment 节点。
35document.createDocumentFragment()创建一个空的文档片段。"create"(创建)+ "DocumentFragment"(文档片段)let fragment = document.createDocumentFragment();无参数。返回一个空的 DocumentFragment 节点,可用于批量操作 DOM。
36document.createEvent()创建一个新的事件对象。"create"(创建)+ "Event"(事件)let event = document.createEvent(eventType);eventType: 字符串,事件类型(如"MouseEvent")。已废弃,推荐使用 new Event() 构造函数。
37document.createElement()创建一个指定标签名的元素节点。"create"(创建)+ "Element"(元素)let element = document.createElement(tagName, options);tagName: 字符串,要创建的元素的标签名。options: 可选配置对象(如 { is: "custom-element" })。返回新的 Element 对象。
38document.createTextNode()创建一个新的文本节点。"create"(创建)+ "TextNode"(文本节点)let textNode = document.createTextNode(data);data: 字符串,文本节点的内容。返回值是一个 Text 节点。

第七部分:比较与命名空间方法(7个)

方法含义词源语法参数及说明
39document.compareDocumentPosition()比较当前文档节点与另一个节点的位置关系。"compare"(比较)+ "DocumentPosition"(文档位置)let position = document.compareDocumentPosition(otherNode);otherNode: 要比较的另一个节点。返回值是表示位置关系的位掩码(如 Node.DOCUMENT_POSITION_FOLLOWING)。
40document.contains()检查一个节点是否是当前文档节点的后代。"contains"(包含)let isContained = document.contains(otherNode);otherNode: 要检查的节点。返回值是布尔值,true 表示该节点是后代。
41document.isDefaultNamespace()检查指定的命名空间 URI 是否是当前文档的默认命名空间。"is"(是)+ "DefaultNamespace"(默认命名空间)let isDefault = document.isDefaultNamespace(namespaceURI);namespaceURI: 要检查的命名空间 URI 字符串。返回值是布尔值。
42document.isEqualNode()检查两个节点是否相等(类型、属性、子节点相同)。"is"(是)+ "Equal"(相等)+ "Node"(节点)let isEqual = document.isEqualNode(otherNode);otherNode: 要比较的另一个节点。返回值是布尔值。
43document.isSameNode()检查两个节点是否为同一个节点引用。"is"(是)+ "Same"(相同)+ "Node"(节点)let isSame = document.isSameNode(otherNode);otherNode: 要比较的另一个节点。返回值是布尔值。
44document.lookupNamespaceURI()返回与给定前缀关联的命名空间 URI。"lookup"(查找)+ "NamespaceURI"(命名空间URI)let uri = document.lookupNamespaceURI(prefix);prefix: 要查找的前缀字符串。返回值是对应的命名空间 URI 或 null。
45document.lookupPrefix()返回与给定命名空间 URI 关联的前缀。"lookup"(查找)+ "Prefix"(前缀)let prefix = document.lookupPrefix(namespaceURI);namespaceURI: 要查找的命名空间 URI 字符串。返回值是对应的前缀或 null。

第八部分:文档写入方法(4个)

方法含义词源语法参数及说明
46document.open()打开一个文档流用于写入。"open"(打开)document.open();无参数。打开文档流,清除当前文档内容。通常在调用 document.write() 前使用。
47document.close()关闭文档输出流。"close"(关闭)document.close();无参数。完成文档写入后关闭输出流,显示所有写入的内容。
48document.write()向文档写入 HTML 表达式或 JavaScript 代码。"write"(写入)document.write(markup);markup: 字符串,要写入的 HTML 内容。如果在页面加载完成后调用,会覆盖整个页面。
49document.writeln()向文档写入 HTML 内容并附加一个换行符。"write"(写入)+ "ln"(line,行)document.writeln(markup);markup: 字符串,要写入的 HTML 内容。与 write() 类似,但会添加换行符。

第九部分:高级方法(2个)

方法含义词源语法参数及说明
50document.getAnimations()返回当前文档中所有激活的 Animation 对象的数组。"get"(获取)+ "Animations"(动画们)let animations = document.getAnimations();无参数。返回一个包含所有尚未自动移除的 Animation 对象的数组。
51document.getBoxQuads()(实验性 API)返回元素在文档中的 CSS 盒子四边形的几何信息。"get"(获取)+ "BoxQuads"(盒子四边形)let quads = document.getBoxQuads(options);options: 可选配置对象。这是一个实验性 API,不建议在生产环境中使用。

Read more

JavaScript 中 var、let、const 的核心区别与实战应用

JavaScript 中 var、let、const 的核心区别与实战应用

要理解 const、var、let 的区别,我们可以从 作用域、变量提升、可重复声明、可修改性 这几个核心维度展开,这些也是新手最容易混淆的点。 一、核心概念铺垫 首先明确两个基础概念,能帮你更好理解区别: * 函数作用域:变量只在声明它的函数内部可访问(var 是函数作用域)。 * 块级作用域:变量只在声明它的 {} 内部可访问(let/const 是块级作用域,{} 包括 if/for/while/ 普通代码块)。 * 变量提升:JS 引擎在执行代码前,会把变量声明 “提升” 到当前作用域顶部(但赋值不会提升)。 二、逐个拆解 + 对比 1. var(ES5 语法) var 是 ES5 中声明变量的方式,特性如下:

By Ne0inhk
Java 注解与反射实战:自定义注解从入门到精通

Java 注解与反射实战:自定义注解从入门到精通

前言:注解到底是什么?         你是否经常在 Java 代码中看到@Override、@Deprecated这样的标记?这些就是注解 —— 一种给代码 "贴标签" 的机制。注解本身不直接影响代码执行,但能通过工具(如编译器)或框架(如 Spring)赋予代码额外含义。         自定义注解则是让我们根据业务需求创建专属 "标签",结合反射机制能实现强大的动态逻辑(比如日志记录、权限校验、ORM 映射等)。本文将从基础到实战,带你掌握自定义注解的定义、元注解的作用,以及如何通过反射让注解 "生效"。 一、自定义注解基础:@interface 关键字         自定义注解使用 @interface 关键字定义,本质上是一种特殊的接口(编译后会生成继承 java.lang.annotation.Annotation 的接口)

By Ne0inhk
深度解析网络编程套接字:从 Socket 底层原理到 Java 高性能实战

深度解析网络编程套接字:从 Socket 底层原理到 Java 高性能实战

【深度长文】攻克网络编程套接字:从底层协议原理到 Java 高性能实战 我的主页:寻星探路个人专栏:《JAVA(SE)----如此简单!!! 》《从青铜到王者,就差这讲数据结构!!!》 《数据库那些事!!!》《JavaEE 初阶启程记:跟我走不踩坑》 《JavaEE 进阶:从架构到落地实战 》《测试开发漫谈》 《测开视角・力扣算法通关》《从 0 到 1 刷力扣:算法 + 代码双提升》 没有人天生就会编程,但我生来倔强!!! 寻星探路的个人简介: 一、 引言:网络编程的时代意义 在数字化浪潮中,我们不仅是信息的消费者,更是信息的传输者。从简单的网页浏览到支撑亿级并发的分布式系统,其底层基石都是网络编程。网络编程的本质,是跨越物理空间的限制,实现不同计算机上进程间的通信。 网络编程打破了单机系统的局限,使得我们可以利用全球范围内的计算资源。本文将基于 Socket 套接字的核心技术,深入剖析传输层两大核心协议 TCP

By Ne0inhk
java官网下载jdk25的详细教程(下载、安装、配置环境变量)

java官网下载jdk25的详细教程(下载、安装、配置环境变量)

一、jdk(Java Development Kit)的下载与安装: 安装包下载:     链接:https://pan.baidu.com/s/1vOHtgborWy7uPgede5hstQ?pwd=nu6r 提取码: nu6r 官网下载:   www.oracle.com jdk8、jdk11、jdk17、jdk21、jdk25是LTS版本(长期支持版本),其他为普通版本(注:安装路径不要有中文、空格及其他特殊符号) 下载完成后安装,注意安装路径点击下一步 验证安装是否成功:   win+r 召唤运行窗口,输入cmd: 输入java+空格+version+回车: 二、jdk配置环境变量: 步骤一:找到java.exe的路径复制(D:\Javastudy\

By Ne0inhk