banner
Jrenc

Jrenc

There’s a million things I haven’t done。
x
github
email
bilibili

JS如何作用于Html

document 和 window 的区别?#

就是简而言之,dom 是一个对象,win 也是一个对象。他们都是 Web API 里的一个不同角色。

window 对象#

  • window 对象
    window 就是窗口吗,它代表浏览器的一个窗口或标签页,并且是 JavaScript 中的全局对象。它提供了许多控制浏览器窗口的方法和属性。
    作用域:window 是最顶层的对象,在浏览器中的任何 JavaScript 代码中都可以直接访问 window 及其属性和方法,无需任何限定前缀。
    功能:window 对象包含了浏览器窗口的属性,如窗口的大小、位置等,同时也提供了一些方法来控制浏览器窗口的行为,如打开新窗口、定时器函数(setTimeout、setInterval)、浏览器历史控制等。此外,它还是所有全局变量和全局函数的宿主

document 对象#

  • document 对象
    定义:document 对象是 window 对象的一个属性,它代表了加载在窗口中的 HTML 文档,是 Document Object Model(DOM)的入口点。
    作用域:document 对象专门用于操作和访问文档的内容,比如 HTML 元素、CSS 样式等。
    功能:document 对象提供了许多方法来访问和修改文档内容,如获取和设置元素的内容、创建新的 HTML 元素、查询选择器等。通过 document 对象,可以实现对页面内容的动态修改和交互。

总的来说,window 对象代表了浏览器窗口本身,是所有全局 JavaScript 对象、函数和变量的父级对象,而 document 对象代表了窗口中加载的文档,是所有 HTML 文档元素的容器。在实际开发中,根据需要操作的是浏览器窗口本身还是窗口中的文档内容,来决定使用 window 还是 document。
就简单而言,dom 对象操控的是文档的内容,而 window 对象操控的是浏览器窗口的属性和方法。So, 如果你想开定时器,监控窗口的变化你需要用到的是 windows 对象,如果你想要改变文档的内容那你则需要使用 document 对象。
所以当时其实甘特图最主要的问题是,我不知道 windows API 和 document API 的区别。我不懂原生的 html,当这块知识缺失了自然是不会去设计这个逻辑的
所以本质上就是会用封装好的 API。

Dom 流 API 学习#

如何获取元素#

在 DOM 中获取元素主要涉及以下几个 API:

  1. getElementById()

    • 通过元素的 ID 获取单个元素。ID 在一个 HTML 文档中应该是唯一的。
    let element = document.getElementById('elementId'); // 通过ID获取元素
    
  2. getElementsByClassName()

    • 通过元素的类名获取一个元素集合。这个方法返回的是一个类数组对象,包含所有匹配指定类名的元素。
    let elements = document.getElementsByClassName('className'); // 通过类名获取元素集合
    
  3. getElementsByTagName()

    • 通过元素的标签名(如div, p, a等)获取元素集合。同样返回一个类数组对象,包含所有匹配指定标签名的元素。
    let elements = document.getElementsByTagName('tagName'); // 通过标签名获取元素集合
    
  4. querySelector()

    • 使用 CSS 选择器获取第一个匹配的元素。这是一个非常强大的方法,可以使用复杂的 CSS 选择器来定位元素。
    let element = document.querySelector('.className'); // 通过CSS选择器获取第一个匹配的元素
    
  5. querySelectorAll()

    • 使用 CSS 选择器获取所有匹配的元素集合。这个方法返回的是一个NodeList对象,包含所有匹配指定 CSS 选择器的元素
    let elements = document.querySelectorAll('.className'); // 通过CSS选择器获取所有匹配的元素
    
  6. closest()

    • 从元素本身开始,在其祖先元素中(包括自己),找到第一个匹配给定 CSS 选择器的元素。这个方法对于寻找元素的最近父级匹配非常有用。自下向上寻找。
    let closestElement = element.closest('.className'); // 在元素的祖先中找到最近的匹配给定选择器的元素
    
  7. children

    • 获取一个元素的子元素集合,不包括文本和注释节点。这是一个元素对象的属性,返回直接子元素的 HTML 集合。
    let childElements = parentElement.children; // 获取parentElement的所有直接子元素
    
  8. childNodes

    • 获取一个元素的所有子节点,包括元素节点、文本节点和注释节点。这同样是元素对象的一个属性,返回一个节点列表。
    let childNodes = parentElement.childNodes; // 获取parentElement的所有子节点,包括文本和注释
    
  9. parentElementparentNode

    • 通过一个元素获取其父元素。parentElement 返回父级元素节点,而 parentNode 可以返回任何类型的父节点,包括文本节点和注释节点。
    let parent = childElement.parentElement; // 获取childElement的父元素
    let parentNode = childElement.parentNode; // 获取childElement的父节点
    
  10. nextSiblingpreviousSibling

    • 分别获取元素的下一个和上一个同级节点。这两个属性返回的可以是任何类型的节点,包括元素节点、文本节点和注释节点。
    let nextNode = element.nextSibling; // 获取element的下一个同级节点
    let prevNode = element.previousSibling; // 获取element的上一个同级节点
    
  11. nextElementSiblingpreviousElementSibling

    • 类似于 nextSiblingpreviousSibling,但这两个属性只返回元素节点,忽略文本节点和注释节点。
    let nextElement = element.nextElementSibling; // 获取element的下一个同级元素
    let prevElement = element.previousElementSibling; // 获取element的上一个同级元素
    
  12. firstChildlastChild

    • 分别获取元素的第一个和最后一个子节点。这些子节点可以是任何类型的节点,包括元素节点、文本节点和注释节点。
    let first = parentElement.firstChild; // 获取parentElement的第一个子节点
    let last = parentElement.lastChild; // 获取parentElement的最后一个子节点
    
  13. firstElementChildlastElementChild

    • 类似于 firstChildlastChild,但这两个属性只返回元素节点,忽略文本节点和注释节点。
    let firstElement = parentElement.firstElementChild; // 获取parentElement的第一个子元素
    let lastElement = parentElement.lastElementChild; // 获取parentElement的最后一个子元素
    

通过综合运用这些 API,可以有效地遍历和操作 DOM 树,实现对页面结构的灵活控制。

通过这些 API,可以根据不同的条件和需求,在 DOM 树中灵活地获取单个或多个元素。


如何创建元素#

创建元素#

document.createElement('tag')

创建文本节点#

document.createTextNode('text')

什么是文本节点?
文本节点就是 html 中的文本,比如 p 标签中的文本,a 标签中的文本等等。
createTextNode 怎么使用?

var text = document.createTextNode('text')

这是什么效果?

<p>text</p>

text 在这里面是他文字的内容。


如何添加元素#

添加元素#

parent.appendChild(child)

什么效果?

<div>
  <p>text</p>
</div>

插入元素#

parent.insertBefore(newNode, referenceNode)

举个例子

var parent = document.getElementById('parent')
var newNode = document.createElement('p')
var referenceNode = document.getElementById('reference')
parent.insertBefore(newNode, referenceNode)

这个效果是什么?

<div id="parent">
  <p>newNode</p>
  <p id="reference">referenceNode</p>
</div>

referenceNode 起了什么作用?
referenceNode 是一个参考节点,他的作用是在参考节点之前插入新的节点。

如何删除元素#

删除元素#

parent.removeChild(child)

举个例子

var parent = document.getElementById('parent')
var child = document.getElementById('child')
parent.removeChild(child)

这个效果是什么?给出对比

<div id="parent">
  <p id="child">child</p>
</div>
<div id="parent">
</div>

如何修改元素内容?#

在 DOM(文档对象模型)中修改元素内容主要涉及以下几个常用的 API:

  1. innerTexttextContent
    这两个属性都可以用来获取或设置一个元素的文本内容。innerText 反映了元素及其子元素的 “渲染” 文本内容,即按照样式显示在页面上的内容,而 textContent 则获取或设置元素内所有子节点的内容,包括 <script><style> 标签内的文本。

    element.innerText = '新的文本内容'; // 设置元素的可见文本
    let content = element.innerText; // 获取元素的可见文本
    
    element.textContent = '新的全部文本内容'; // 设置元素的全部文本,包含所有子节点
    let fullContent = element.textContent; // 获取元素的全部文本,包含所有子节点
    
  2. innerHTML
    innerHTML 属性可以用来获取或设置元素内的 HTML 内容。与 innerTexttextContent 不同,innerHTML 会包含所有的 HTML 标签。

    element.innerHTML = '<strong>加粗的文本</strong>'; // 设置元素内的HTML内容
    let htmlContent = element.innerHTML; // 获取元素内的HTML内容
    
  3. outerHTML
    outerHTML 属性可以获取或设置包含元素本身及其所有子节点的 HTML。

    element.outerHTML = '<div><strong>新元素及其内容</strong></div>'; // 替换元素及其内容
    
  4. createElementappendChild / replaceChild
    这些方法用于创建新的 DOM 元素并将其插入到文档中。createElement 用于创建一个新的元素节点,appendChild 用于将创建的节点添加到父节点的子节点列表的末尾,replaceChild 用于替换父节点的一个子节点。

    let newElement = document.createElement('div'); // 创建一个新的div元素
    newElement.innerText = '这是新创建的元素'; // 设置新元素的文本内容
    parentElement.appendChild(newElement); // 将新元素添加为parentElement的子节点
    
    let anotherElement = document.createElement('span'); // 创建另一个元素
    parentElement.replaceChild(anotherElement, newElement); // 替换父元素中的子元素
    

通过这些 API,可以方便地在 DOM 中修改元素的内容和结构。
在 DOM 中修改元素的样式和属性主要涉及以下几个 API:

  1. 修改样式:style 属性

    • 每个 DOM 元素都有一个 style 属性,它允许你通过 JavaScript 直接修改元素的样式。可以通过设置元素的 style 属性中的 CSS 属性来改变样式。
    element.style.backgroundColor = 'red'; // 直接设置元素的背景颜色为红色
    element.style.fontSize = '20px'; // 设置元素的字体大小为20像素
    
  2. 修改类:classList 属性

    • classList 提供了一种简单的方法来操作元素的类名集合。常用的方法包括 add(), remove(), toggle()contains()
    element.classList.add('new-class'); // 添加一个新的类名
    element.classList.remove('old-class'); // 移除一个类名
    element.classList.toggle('active'); // 如果存在则删除该类名,不存在则添加
    
  3. 设置和获取属性:setAttribute()getAttribute()

    • 这两个方法分别用于设置和获取元素的属性。属性可以是标准的 HTML 属性,如 id, src, href 等,也可以是自定义属性。
    element.setAttribute('data-custom', 'value'); // 设置一个自定义属性
    let value = element.getAttribute('data-custom'); // 获取这个自定义属性的值
    
  4. 直接修改属性

    • 对于一些常用的 HTML 属性,如 id, src, href 等,可以直接通过元素对象来获取和设置。
    element.href = 'https://example.com'; // 直接设置元素的href属性
    let elementId = element.id; // 直接获取元素的id属性
    

通过这些 API,可以方便地在 JavaScript 中修改 DOM 元素的样式和属性,以实现动态的页面效果。

如何替换元素#

替换元素#

在 DOM 操作中,替换元素涉及以下几个常用的 API:

  1. replaceChild(newChild, oldChild)

    • 这是一个在父节点上调用的方法,用于将父节点中的一个旧子节点替换为一个新的子节点。newChild 是要插入的新节点,而 oldChild 是要被替换的旧节点。
    parentNode.replaceChild(newElement, oldElement); // 将parentNode中的oldElement替换为newElement
    
  2. replaceWith(...)

    • replaceWith() 方法允许你将一个 DOM 节点(或多个节点)替换为指定的节点或者一段 HTML 或文本字符串。这个方法是直接在要被替换的节点上调用的。
    oldElement.replaceWith(newElement); // 将oldElement替换为newElement
    
  3. 使用 insertBefore() 配合 removeChild()remove() 来实现替换

    • 虽然不是直接的替换方法,但可以通过先插入新节点到旧节点之前,然后移除旧节点,达到替换的效果。
    parentNode.insertBefore(newElement, oldElement); // 将newElement插入到oldElement之前
    parentNode.removeChild(oldElement); // 移除oldElement,实现替换效果
    // 或者使用更简洁的 oldElement.remove(),如果环境支持
    oldElement.remove();
    
  4. 使用 outerHTML

    • 通过设置元素的 outerHTML 属性,可以直接替换整个元素,包括元素本身及其内容。这种方法不需要先获取父节点。
    oldElement.outerHTML = '<div id="newElement">新内容</div>'; // 用新的HTML内容替换oldElement,包括元素本身
    

这些 API 提供了灵活的方式来替换 DOM 中的元素,可以根据不同的场景和需求选择合适的方法。

如何给元素添加事件#

在 DOM 中处理元素事件主要涉及以下几个 API:

  1. addEventListener(event, handler, [options])

    • 用于在指定元素上添加一个事件监听器。event 是要监听的事件类型(如 "click", "mouseover" 等),handler 是事件发生时调用的函数,options 是一个可选的参数,用于指定更详细的事件监听行为。
    element.addEventListener('click', function() {
      console.log('元素被点击了');
    });
    
  2. removeEventListener(event, handler, [options])

    • 用于移除之前通过 addEventListener 添加的事件监听器。需要注意的是,handler 必须与添加监听器时使用的是同一个函数引用。
    function handleClick() {
      console.log('元素被点击了');
    }
    
    element.addEventListener('click', handleClick);
    // 稍后移除监听器
    element.removeEventListener('click', handleClick);
    
  3. dispatchEvent(event)

    • 用于触发指定元素上的事件。event 是一个 Event 对象的实例,可以通过 new Event() 来创建。
    let event = new Event('customEvent');
    element.dispatchEvent(event); // 触发自定义事件
    
  4. 通过属性直接分配事件处理器

    • 可以直接将事件处理函数分配给元素的事件处理属性。例如,onclick 对应于点击事件。
    element.onclick = function() {
      console.log('元素被点击了');
    };
    
  5. 使用 on 前缀的属性来设置事件处理函数

    • 除了 onclick,还有许多其他的事件可以通过设置以 on 开头的属性来添加处理函数,例如 onmouseoveronkeydown 等。
    element.onmouseover = function() {
      console.log('鼠标悬停在元素上');
    };
    
  6. 使用 Event 对象

    • 事件处理函数中的 event 参数是一个 Event 对象的实例,它提供了关于事件的信息,如触发事件的元素、事件类型以及其他与特定事件相关的属性和方法。
    element.addEventListener('click', function(event) {
      console.log('点击发生在 ' + event.target.tagName + ' 元素上');
    });
    
  7. preventDefault()

    • 事件对象的 preventDefault() 方法用于阻止事件的默认行为。这在处理如点击链接时不希望页面跳转,或在提交表单时不希望页面重新加载等场景下非常有用。
    element.addEventListener('click', function(event) {
      event.preventDefault(); // 阻止链接默认的跳转行为
    });
    
  8. stopPropagation()

    • 用于阻止事件冒泡到父元素。事件冒泡是指事件从最深的节点开始,然后逐级向上传播到较为浅的节点的过程。
    element.addEventListener('click', function(event) {
      event.stopPropagation(); // 阻止事件继续冒泡
    });
    
  9. 事件委托

    • 利用事件冒泡的特性,可以将事件监听器设置在父元素上,而不是每个子元素上。当事件在子元素上触发并冒泡到父元素时,可以通过检查事件的 target 属性来确定是哪个子元素触发的事件。
    parentElement.addEventListener('click', function(event) {
      if (event.target && event.target.matches('button.child')) {
        console.log('子按钮被点击');
      }
    });
    
  10. capture 事件捕获

    • 在事件处理的第三个参数 options 中,可以设置 capturetrue 来指定事件处理器在捕获阶段而不是冒泡阶段执行。事件捕获是指事件从最外层开始,然后逐级向下传播到最深的节点的过程。
    element.addEventListener('click', function() {
      console.log('捕获阶段的事件处理');
    }, {capture: true});
    
  11. once 选项

    • addEventListener 的第三个参数中,设置 once: true 可以让事件处理器只执行一次,然后自动移除。
    element.addEventListener('click', function() {
      console.log('这个事件处理器只会执行一次');
    }, {once: true});
    

通过这些 API,可以灵活地为 DOM 元素添加、移除和触发事件,实现丰富的交互效果。

生命周期#

DOM(文档对象模型)和 Window 对象在 Web 页面的生命周期中扮演着重要的角色。下面介绍一些与 DOM 和 Window 生命周期相关的 API:

  1. Window 的生命周期事件:

    • load 事件

      • 当整个页面及所有依赖资源如样式表和图片都已完成加载时,window 对象会触发 load 事件。
      window.addEventListener('load', function() {
          console.log('页面完全加载完毕');
      });
      
    • DOMContentLoaded 事件

      • 当初始的 HTML 文档被完全加载和解析完成,不需要等待样式表、图片和子框架完成加载,document 对象会触发 DOMContentLoaded 事件。
      document.addEventListener('DOMContentLoaded', function() {
          console.log('DOM内容加载完毕');
      });
      
    • unload 事件

      • 当用户离开当前页面,window 对象会触发 unload 事件。这个事件可以用于清理工作,如关闭弹出窗口等。
      window.addEventListener('unload', function() {
          console.log('用户离开页面');
      });
      
    • beforeunload 事件

      • 在窗口、文档或其资源即将卸载时触发。可以用来询问用户是否确定离开当前页面,通常用于提示用户保存未保存的更改。
      window.addEventListener('beforeunload', function(event) {
          event.returnValue = '您有未保存的更改,确定要离开吗?';
      });
      
  2. 请求动画帧(Request Animation Frame):

    • requestAnimationFrame(callback)

      • 提供了一种在浏览器重绘之前调用特定代码的方法,用于执行动画或页面重绘等。这个方法比传统的 setInterval 更高效,可以更平滑地执行动画。
      function animate() {
          // 动画代码
          requestAnimationFrame(animate);
      }
      requestAnimationFrame(animate);
      
  3. 页面可见性 API(Page Visibility API):

    • 这个 API 提供了visibilitychange事件,以及document.hidden属性,用于检测页面是否对用户可见。这在优化页面性能和用户体验方面特别有用,比如可以在页面不可见时暂停视频播放或停止执行动画。
    document.addEventListener('visibilitychange', function() {
        if (document.hidden) {
            console.log('页面不可见');
        } else {
            console.log('页面可见');
        }
    });
    
  4. 性能监测 API(Performance API):

    • performance对象允许访问与当前页面相关的性能数据。例如,可以使用performance.timing来分析不同阶段的耗时,如页面加载、解析等。
    window.addEventListener('load', function() {
        setTimeout(function() {
            const timing = performance.timing;
            const loadTime = timing.loadEventEnd - timing.navigationStart;
            console.log('页面加载时间:' + loadTime);
        }, 0);
    });
    
  5. resize 事件:

    • 当浏览器窗口被调整大小时,window对象会触发resize事件。可以用来调整页面布局或执行其他响应窗口大小变化的操作。
    window.addEventListener('resize', function() {
        console.log('窗口大小变化了');
    });
    
  6. scroll 事件:

    • 当用户滚动页面时,会触发scroll事件。这可以用于实现 “懒加载”(延迟加载图片等内容),或者动态改变导航条的样式等。
    window.addEventListener('scroll', function() {
        console.log('页面被滚动了');
    });
    
  7. focusblur 事件:

    • 当页面或页面内的元素获得或失去焦点时,会触发focusblur事件。这可以用于改善表单输入的用户体验,或在应用中管理键盘快捷键。
    window.addEventListener('focus', function() {
        console.log('窗口获得了焦点');
    });
    
    window.addEventListener('blur', function() {
        console.log('窗口失去了焦点');
    });
    

通过结合使用这些 API,开发者可以更精细地控制和优化 Web 应用的行为和性能,提升用户的互动体验。

通过监听和处理这些生命周期事件,可以更好地控制 Web 页面的加载、渲染和卸载过程,提高用户体验。

Loading...
Ownership of this post data is guaranteed by blockchain and smart contracts to the creator alone.