【前端基础篇】JavaScript之DOM介绍

news2024/11/15 19:35:07

文章目录

  • WebAPI背景知识
    • 什么是WebAPI
    • 什么是API
    • API参考文档
  • DOM基本概念
    • 什么是DOM
    • DOM树
    • 查找HTML元素
      • 方法概览
        • 1. `document.getElementById(id)`
        • 2.`document.getElementsByTagName(name)`
        • 3. `document.getElementsByClassName(name)`
        • 4. `document.querySelector(CSS选择器)`
        • 5. `document.querySelectorAll(CSS选择器)`
    • 获取HTML的值
      • 方法概览
        • 1. 元素节点.innerText
        • 2. 元素节点.innerHTML
        • 3. 元素节点.属性
        • 4. 元素节点.getAttribute(attribute)
        • 5. 元素节点.style.样式
    • 改变HTML的值
    • 修改HTML元素
      • 方法概览
        • 1. `document.createElement(element)`
        • 2. `document.createAttribute(attribute)`
        • 3. `document.createTextNode(text)`
        • 4. `元素节点.removeChild(element)`
        • 5. `元素节点.appendChild(element)`
        • 6. `元素节点.replaceChild(element)`
        • 7. `元素节点.insertBefore(element)`
    • 查找HTML父子
      • 方法概览
  • 事件概述
    • 什么是事件
    • JavaScript中的常见DOM文档事件
      • 1. `DOMContentLoaded`
      • 2. `click`
      • 3. `keyup` 和 `keydown`
      • 4. `mouseover` 和 `mouseout`
      • 5. `submit`
      • 6. `resize`
      • 7. `focus` 和 `blur`
      • 8. `change`
      • 9. `scroll`
    • 结论

WebAPI背景知识

什么是WebAPI

前面学习的 JS 分成三个大的部分

  • ECMAScript: 基础语法部分
  • DOM API: 操作页面结构
  • BOM API: 操作浏览器

WebAPI 就包含了 DOM + BOM. 这个是 W3C 组织规定的. (和制定 ECMAScript 标准的大佬们不是一伙人).

前面学的 JS 基础语法主要学的是 ECMAScript, 这让我们建立基本的编程思维. 相当于练武需要先扎马步. 但是真正来写一个更加复杂的有交互式的页面, 还需要 WebAPI 的支持. 相当于各种招式.


什么是API

API是一个更广义的概念,念. 而 WebAPI 是一个更具体的概念, 特指 DOM+BOM

所谓的 API 本质上就是一些现成的函数/对象, 让程序猿拿来就用, 方便开发.

相当于一个工具箱. 只不过程序猿用的工具箱数目繁多, 功能复杂.

API参考文档

Web API | MDN (mozilla.org)

可以在搜索引擎中按照 “MDN + API 关键字” 的方式搜索, 也能快速找到需要的 API 文档.


DOM基本概念

什么是DOM

什么是 DOM DOM 全称为 Document Object Model.

W3C 标准给我们提供了一系列的函数, 让我们可以操作:

  • 网页内容
  • 网页结构
  • 网页样式

DOM树

一个页面的结构是一个树形结构, 称为 DOM 树.

页面结构形如:
在这里插入图片描述

DOM树形结构形如:

在这里插入图片描述

重要概念:

  • 文档: 一个页面就是一个 文档, 使用 document 表示.

  • 元素: 页面中所有的标签都称为元素. 使用 element 表示.

  • 节点: 网页中所有的内容都可以称为节点(标签节点, 注释节点, 文本节点, 属性节点等). 使用 node 表示.

这些文档等概念在 JS 代码中就对应一个个的对象.

所以才叫 “文档对象模型” .


查找HTML元素

下面我们将介绍几种常见的DOM元素选择方法。

方法概览

方法描述
document.getElementById(id)通过元素 id 来查找元素。
document.getElementsByTagName(name)通过标签名来查找元素。
document.getElementsByClassName(name)通过类名来查找元素。
document.querySelector(CSS选择器)通过CSS选择器选择一个元素。
document.querySelectorAll(CSS选择器)通过CSS选择器选择多个元素。
1. document.getElementById(id)

getElementById 方法用于通过元素的 id 来查找并返回单个元素。这是最常用的方法之一,因为ID通常是唯一的。

示例代码

<!DOCTYPE html>
<html>
<head>
    <title>getElementById 示例</title>
</head>
<body>
    <div id="myDiv">这是一个 div 元素。</div>

    <script>
        var element = document.getElementById("myDiv");
        console.log(element.innerText);  // 输出: 这是一个 div 元素。
    </script>
</body>
</html>

getElementsByTagName 方法返回具有指定标签名的所有元素的集合(HTMLCollection)。该方法返回的是一个动态集合,意味着如果DOM发生变化,该集合也会更新。

2.document.getElementsByTagName(name)

示例代码

<!DOCTYPE html>
<html>
<head>
    <title>getElementsByTagName 示例</title>
</head>
<body>
    <p>这是第一个段落。</p>
    <p>这是第二个段落。</p>

    <script>
        var elements = document.getElementsByTagName("p");
        console.log(elements.length);  // 输出: 2
        console.log(elements[0].innerText);  // 输出: 这是第一个段落。
    </script>
</body>
</html>
3. document.getElementsByClassName(name)

getElementsByClassName 方法返回具有指定类名的所有元素的集合(HTMLCollection)。与 getElementsByTagName 类似,它返回的是一个动态集合。

示例代码

<!DOCTYPE html>
<html>
<head>
    <title>getElementsByClassName 示例</title>
</head>
<body>
    <div class="myClass">这是第一个 div 元素。</div>
    <div class="myClass">这是第二个 div 元素。</div>

    <script>
        var elements = document.getElementsByClassName("myClass");
        console.log(elements.length);  // 输出: 2
        console.log(elements[1].innerText);  // 输出: 这是第二个 div 元素。
    </script>
</body>
</html>
4. document.querySelector(CSS选择器)

querySelector 方法返回匹配指定CSS选择器的第一个元素。如果有多个匹配的元素,只返回第一个。

示例代码

<!DOCTYPE html>
<html>
<head>
    <title>querySelector 示例</title>
</head>
<body>
    <div class="container">
        <p>这是一个段落。</p>
        <p>这是另一个段落。</p>
    </div>

    <script>
        var element = document.querySelector(".container p");
        console.log(element.innerText);  // 输出: 这是一个段落。
    </script>
</body>
</html>
5. document.querySelectorAll(CSS选择器)

querySelectorAll 方法返回匹配指定CSS选择器的所有元素的静态集合(NodeList)。与 querySelector 不同,它返回所有匹配的元素。

示例代码

<!DOCTYPE html>
<html>
<head>
    <title>querySelectorAll 示例</title>
</head>
<body>
    <div class="container">
        <p>这是第一个段落。</p>
        <p>这是第二个段落。</p>
    </div>

    <script>
        var elements = document.querySelectorAll(".container p");
        console.log(elements.length);  // 输出: 2
        console.log(elements[1].innerText);  // 输出: 这是第二个段落。
    </script>
</body>
</html>

获取HTML的值

方法概览

方法描述
元素节点.innerText获取 HTML 元素的 inner Text。
元素节点.innerHTML获取 HTML 元素的 inner HTML。
元素节点.属性获取 HTML 元素的属性值。
元素节点.getAttribute(attribute)获取 HTML 元素的属性值。
元素节点.style.样式获取 HTML 元素的行内样式值。
1. 元素节点.innerText

innerText 属性用于获取或设置HTML元素的文本内容。它返回元素及其所有子元素的"可见"文本内容。

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>InnerText 示例</title>
</head>
<body>
    <div id="example">Hello, <span>World</span>!</div>
    <script>
        const element = document.getElementById("example");
        console.log(element.innerText);  // 输出: "Hello, World!"
        element.innerText = "Hello, JavaScript!";
    </script>
</body>
</html>

在上面的示例中,innerText 获取了div元素及其子元素span的可见文本,并将其输出到控制台。

2. 元素节点.innerHTML

innerHTML 属性用于获取或设置HTML元素的内容,包括HTML标记。与innerText不同,innerHTML会解析标签并返回元素的所有内容。

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>InnerHTML 示例</title>
</head>
<body>
    <div id="example">Hello, <span>World</span>!</div>
    <script>
        const element = document.getElementById("example");
        console.log(element.innerHTML);  // 输出: "Hello, <span>World</span>!"
        element.innerHTML = "Hello, <strong>JavaScript</strong>!";
    </script>
</body>
</html>

innerHTML 不仅可以获取元素的内容,还可以通过设置innerHTML属性来更新元素的内容,包括嵌套的HTML标签。

3. 元素节点.属性

通过直接访问元素的属性,可以获取或设置元素的属性值。例如,element.idelement.className

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>属性访问示例</title>
</head>
<body>
    <div id="example" class="demo">示例内容</div>
    <script>
        const element = document.getElementById("example");
        console.log(element.id);  // 输出: "example"
        console.log(element.className);  // 输出: "demo"
        element.id = "newID";
        element.className = "newClass";
    </script>
</body>
</html>

在上面的示例中,element.idelement.className 分别用于获取和设置元素的idclass属性。

4. 元素节点.getAttribute(attribute)

getAttribute 方法用于获取元素上指定的属性值。

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>getAttribute 示例</title>
</head>
<body>
    <div id="example" data-custom="value">示例内容</div>
    <script>
        const element = document.getElementById("example");
        console.log(element.getAttribute("id"));  // 输出: "example"
        console.log(element.getAttribute("data-custom"));  // 输出: "value"
    </script>
</body>
</html>

getAttribute 是一个通用方法,可以用于获取任何存在于元素上的属性值,不仅限于标准属性。

5. 元素节点.style.样式

style 属性用于访问元素的内联样式,可以用来获取或设置内联样式值。

示例代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>样式访问示例</title>
</head>
<body>
    <div id="example" style="color: red;">示例内容</div>
    <script>
        const element = document.getElementById("example");
        console.log(element.style.color);  // 输出: "red"
        element.style.color = "blue";
    </script>
</body>
</html>

通过style属性,可以直接操作元素的内联样式。例如,在上面的代码中,style.color 用于获取和设置文本颜色。


改变HTML的值

方法描述
元素节点.innerText = new text content改变元素的 inner Text。
元素节点.innerHTML = new html content改变元素的 inner HTML。
元素节点.属性 = new value改变 HTML 元素的属性值。
元素节点.setAttribute(attribute, value)改变 HTML 元素的属性值。
元素节点.style.样式 = new style改变 HTML 元素的行内样式值。

这个比上面查找的就多了一个赋值,改变HTML的值,此处不再赘述

修改HTML元素

方法概览

方法描述
document.createElement(element)创建 HTML 元素节点。
document.createAttribute(attribute)创建 HTML 属性节点。
document.createTextNode(text)创建 HTML 文本节点。
元素节点.removeChild(element)删除 HTML 元素。
元素节点.appendChild(element)添加 HTML 元素。
元素节点.replaceChild(element)替换 HTML 元素。
元素节点.insertBefore(element)在指定的子节点前面插入新的子节点。
1. document.createElement(element)

功能: 创建一个新的 HTML 元素节点。
示例:

let newDiv = document.createElement("div");

说明: 该方法创建了一个新的 div 元素,但此时它还没有被添加到页面中,需要使用其他方法将其插入到 DOM 中。

2. document.createAttribute(attribute)

功能: 创建一个新的 HTML 属性节点。
示例:

let newAttr = document.createAttribute("class");
newAttr.value = "new-class";

说明: 此方法创建了一个新的属性(如 class),但该属性还没有应用到任何元素,需要手动将其附加到元素上。

3. document.createTextNode(text)

功能: 创建一个文本节点,用于包含纯文本内容。
示例:

let textNode = document.createTextNode("Hello, World!");

说明: 创建了一个包含文本 “Hello, World!” 的文本节点,可以将它插入到一个元素中显示在页面上。

4. 元素节点.removeChild(element)

功能: 从 DOM 中删除子元素。
示例:

let parentElement = document.getElementById("parent");
let childElement = document.getElementById("child");
parentElement.removeChild(childElement);

说明: 此方法从父节点中移除了指定的子节点 childElement

5. 元素节点.appendChild(element)

功能: 将一个新的子节点添加到指定的父节点中。
示例:

let parentElement = document.getElementById("parent");
let newDiv = document.createElement("div");
parentElement.appendChild(newDiv);

说明: 该方法将创建的 newDiv 元素添加到父元素 parentElement 的子节点列表末尾。

6. 元素节点.replaceChild(element)

功能: 替换当前子节点。
示例:

let parentElement = document.getElementById("parent");
let oldChild = document.getElementById("oldChild");
let newDiv = document.createElement("div");
parentElement.replaceChild(newDiv, oldChild);

说明: 此方法用 newDiv 替换了 oldChild 节点。

7. 元素节点.insertBefore(element)

功能: 在指定的子节点前面插入新的子节点。
示例:

let parentElement = document.getElementById("parent");
let newDiv = document.createElement("div");
let referenceNode = document.getElementById("referenceNode");
parentElement.insertBefore(newDiv, referenceNode);

说明: 此方法将 newDiv 插入到 referenceNode 节点之前。

查找HTML父子

方法概览

方法描述
元素节点.parentNode返回元素的父节点。
元素节点.parentElement返回元素的父元素。
元素节点.childNodes返回元素的一个子节点的数组(包含空白文本Text节点)。
元素节点.children返回元素的一个子元素的集合(不包含空白文本Text节点)。
元素节点.firstChild返回元素的第一个子节点(包含空白文本Text节点)。
元素节点.firstElementChild返回元素的第一个子元素(不包含空白文本Text节点)。
元素节点.lastChild返回元素的最后一个子节点(包含空白文本Text节点)。
元素节点.lastElementChild返回元素的最后一个子元素(不包含空白文本Text节点)。
元素节点.previousSibling返回某个元素紧接之前的兄弟节点(包含空白文本Text节点)。
元素节点.previousElementSibling返回指定元素的前一个兄弟元素(相同节点树层中的前一个元素节点)。
元素节点.nextSibling返回某个元素紧接之后的兄弟节点(包含空白文本Text节点)。
元素节点.nextElementSibling返回指定元素的后一个兄弟元素(相同节点树层中的下一个元素节点)。

事件概述

什么是事件

JS 要构建动态页面, 就需要感知到用户的行为. 用户对于页面的一些操作(点击, 选择, 修改等) 操作都会在浏览器中产生一个个事件, 被 JS 获取到, 从而进行更复杂的交互操作.

浏览器就是一个哨兵, 在侦查敌情(用户行为). 一旦用户有反应(触发具体动作), 哨兵就会点燃烽火台的狼烟(事件), 后方就可以根据狼烟来决定下一步的对敌策略.

JavaScript中的常见DOM文档事件


1. DOMContentLoaded


DOMContentLoaded事件在初始HTML文档被完全加载和解析后触发,不等待样式表、图片和子框架的加载。

document.addEventListener("DOMContentLoaded", function() {
    console.log("DOM完全加载并解析完成");
});

解释: 当你想在文档完全加载后执行某些JavaScript代码,并确保可以安全地操作DOM时,此事件非常有用。

addEventListener 方法

addEventListener 是绑定事件的标准方法,推荐在大多数情况下使用。它可以为一个 DOM
元素添加一个或多个事件监听器,当事件触发时,执行指定的回调函数。

示例:

// 获取 DOM 元素
const button = document.querySelector('button');

// 为按钮添加点击事件监听器
button.addEventListener('click', function() {
    alert('按钮被点击了!');
});

优点: 可以为同一元素绑定多个相同或不同类型的事件,不会互相覆盖。 支持事件捕获和事件冒泡机制,可以通过传递第三个参数来设置。
缺点:
在某些老旧浏览器(如 IE8 及更早版本)中不支持。


2. click

click事件发生在用户点击一个元素(例如按钮、链接或图片)时。此事件通常用于触发特定动作。

document.getElementById("myButton").addEventListener("click", function() {
    alert("按钮被点击了!");
});

解释: 当点击ID为 myButton 的按钮时,触发一个弹出框,显示“按钮被点击了!”。


3. keyupkeydown

keyupkeydown 事件在用户按下键盘上的按键时触发。keydown 发生在按下按键时,keyup 发生在按键释放时。

document.addEventListener("keydown", function(event) {
    console.log("按下的键是: " + event.key);
});

解释: 当任意按键被按下时,按键的对应值将会记录在控制台中。


4. mouseovermouseout

mouseover 事件发生在用户将鼠标移到一个元素上时,而 mouseout 事件则是在鼠标移出元素时触发。

document.getElementById("hoverElement").addEventListener("mouseover", function() {
    console.log("鼠标移到了元素上!");
});

解释: 当用户将鼠标悬停在ID为 hoverElement 的元素上时,控制台将打印一条消息。


5. submit

submit 事件在表单提交时触发。通常用于在表单提交之前验证表单数据。

document.getElementById("myForm").addEventListener("submit", function(event) {
    event.preventDefault();
    console.log("表单已提交!");
});

解释: 表单的默认提交行为被 event.preventDefault() 阻止,而是打印了一条消息。


6. resize

resize 事件在浏览器窗口被调整大小时触发。它在创建响应式布局或处理窗口变化时非常有用。

window.addEventListener("resize", function() {
    console.log("窗口大小已调整为: " + window.innerWidth + "x" + window.innerHeight);
});

解释: 每当窗口大小发生变化时,新的窗口尺寸将会打印在控制台中。


7. focusblur

focus 事件在元素获得焦点时触发,而 blur 事件在元素失去焦点时触发。这些事件常用于表单字段的验证或提示。

let inputField = document.getElementById("username");

inputField.addEventListener("focus", function() {
    console.log("输入框获得焦点");
});

inputField.addEventListener("blur", function() {
    console.log("输入框失去焦点");
});

解释: 当用户点击输入框时,触发 focus 事件;当用户点击其他地方离开输入框时,触发 blur 事件。


8. change

change 事件在用户改变输入元素的值后触发,常用于 inputselecttextarea 等表单元素。

document.getElementById("mySelect").addEventListener("change", function() {
    console.log("选择的值发生了变化");
});

解释: 当用户在下拉框中选择不同的选项时,触发 change 事件。


9. scroll

scroll 事件在用户滚动页面或元素时触发,适用于具有滚动条的元素或整个窗口的滚动。

window.addEventListener("scroll", function() {
    console.log("页面正在滚动");
});

解释: 每当用户滚动页面时,控制台将打印消息。


结论

理解和处理常见的DOM文档事件对于创建互动性和动态的网页至关重要。上面讨论的事件涵盖了许多常见的用户交互场景,掌握它们可以极大地增强构建响应式用户界面的能力,并改善网站的用户体验。


以上就是关于【前端基础篇】JavaScript之DOM介绍的内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!❤️

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2071984.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实习手记(8):增删改查

上周又偷懒了没有按时写博客&#xff08;扣大分啊啊&#xff01;&#xff09;但是好像也没有人看呢~其实最开始也只是想着记录一下实习历程&#xff0c;怕自己之后回过头想关于实习的都想不起来了&#xff0c;个人还是喜欢记录有关自己的学习生活的&#xff0c;就算没啥人看但回…

RabbitMQ 基础总结

一、前言 我们一般的项目过程都是同步通信&#xff0c;及一个服务结束后在执行另一个服务这会让总体时间变得很长&#xff0c;尤其是在高并发的时候用户体验感很不好&#xff0c;且在调用一个服务期间cup内存等都处于空闲状态造成资源浪费 。如果调用其中某一个服务时…

LVS+Keepalived集群(主、备)

1、Keepalived及其工作原理 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用&#xff08;HA&#xff09;方案&#xff0c;可以解决静态路由出现的单点故障问题。 keepalived 高可用之间是通过VRRP进行通信&#xff0c;VRRP是通过竞选的来确定主备&#xff0c;主优先级高…

学习之appium的简单使用

使用之前需要先安装一下依赖 1、安装jdk&#xff1a;暂时为整理笔记以后补充 2、安装nodejs:https://blog.csdn.net/qq_42792477/article/details/141363957?spm1001.2014.3001.5501 3、安装SDk&#xff08;安卓篇&#xff09;&#xff1a;https://blog.csdn.net/qq_42792477…

<数据集>Visdrone数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;8629张 标注数量(xml文件个数)&#xff1a;8629 标注数量(txt文件个数)&#xff1a;8629 标注类别数&#xff1a;10 标注类别名称&#xff1a;[pedestrian,people,bicycle,car,van,truck,tricycle,awning-tricycle…

HubSpot 自动化营销平台助力出海企业精准获客与转化 | 自动化营销

HubSpot 提供了多个开源 cms 和一体化且全面的解决方案&#xff0c;可帮助出海企业优化内容营销策略 HubSpot 自动化营销加速国际化 随着全球化的推进&#xff0c;越来越多的企业开始寻求拓展国际市场&#xff0c;而在这个过程中&#xff0c;有效的客户关系管理和营销自动化成…

ActiveMQ指南

入门 官网&#xff1a; http://activemq.apache.org/ ActiveMQ 是Apache出品&#xff0c;最流行的&#xff0c;能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现。 JMS JMS即Java消息服务&#xff08;Java Message Service&#xf…

Linux自旋锁和读写锁

在前面的文章中我们已经介绍了有关互斥锁的概念与使用&#xff0c;本篇将开始介绍在 Linux 中的自旋锁和读写锁。这三种锁分别用于在不同的应用场景之中&#xff0c;其中互斥锁最为常用&#xff0c;但是我们需要了解一下其他的锁。 对于自旋锁和读写锁都介绍了其原理以及接口使…

【信创】麒麟KylinOS V10打开root登录桌面权限

原文链接&#xff1a;【信创】麒麟KylinOS V10打开root登录桌面权限 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在麒麟KYLINOS V10上如何打开root用户登录桌面的文章。在大多数Linux发行版中&#xff0c;出于安全考虑&#xff0c;root用户默认情况下是禁止直…

KRTS网络模块:TCP服务端、客户端实例

KRTS网络模块:TCP服务端、客户端实例 目录 KRTS网络模块:TCP服务端、客户端实例TCP简介KRST服务端简介核心特性界面设计核心代码 KRTS客户端简介核心特性界面设置核心代码 运行实例 Socket模块基于Packet模块&#xff0c;实时提供更高的协议&#xff0c;如RAW-IP、TCP 和 UDP(参…

【求助帖】用PyTorch搭建MLP网络时遇到奇怪的问题

求助&#xff1a;我在测试自己搭建的通用MLP网络时&#xff0c;发现它与等价的参数写死的MLP网络相比效果奇差无比&#xff0c;不知道是哪里出了问题&#xff0c;请大佬们帮忙看下。 我写的通用MLP网络&#xff1a; class MLP(nn.Module):def __init__(self, feature_num, cl…

3、Unity【基础】Resources资源场景动态加载

文章目录 一、Resources资源动态加载1、Unity中特殊文件夹1、工程路径获取2、Resources资源文件夹3、StreamingAssets流动资源文件夹4、persistentDataPath持久数据文件夹5、Plugins插件文件夹6、Editor编辑器文件夹7、默认资源文件夹StandardAssets 2、Resources同步加载1、Re…

Auto-Editor

文章目录 一、关于 Auto-Editor安装系统兼容性版权 二、切割自动切割的方法看看自动编辑器删掉了什么 三、导出到编辑器命名时间线按 Clip 分割 四、手工编辑五、更多的选择 一、关于 Auto-Editor github : https://github.com/WyattBlue/auto-editor (2.8k star – 2408)主页…

ubuntu 20.04系统安装pytorch

1.1 安装gcc 安装cuda之前&#xff0c;首先应该安装gcc&#xff0c;安装cuda需要用到gcc&#xff0c;否则报错。可以先使用下方指令在终端查看是否已经安装gcc。 gcc --version 如果终端打印如下则说明已经安装。 如果显示“找不到命令 “gcc”......”使用下方指令安装 su…

阅读笔记5:董超底层视觉之美|时空的交错与融合——论视频超分辨率

原文链接&#xff1a;https://mp.weixin.qq.com/s/pmJ56Y0-dbIlYbHbJyrfAA 1. 多帧超分和时空超分 视频超分的本质就是多帧超分&#xff0c;多帧超分的历史远早于视频超分。 在早期&#xff0c;Super Resolution专指多帧超分&#xff0c;因为只有多帧超分才能补充进入真实的信…

Golang | Leetcode Golang题解之第368题最大整除子集

题目&#xff1a; 题解&#xff1a; func largestDivisibleSubset(nums []int) (res []int) {sort.Ints(nums)// 第 1 步&#xff1a;动态规划找出最大子集的个数、最大子集中的最大整数n : len(nums)dp : make([]int, n)for i : range dp {dp[i] 1}maxSize, maxVal : 1, 1fo…

对讲模块升级的重要性-OTA空中升级与串口升级

在现代通信设备的设计中&#xff0c;灵活的升级能力已成为评估模块性能的重要标准。无论是在开发过程中&#xff0c;还是在产品的生命周期内&#xff0c;支持OTA和串口升级的模块可以极大地提高设备的可维护性和适应性。 SA618F30&#xff0c;作为一款高性价比、高集成度的大功…

SSRF 302跳转攻击redis写入ssh公钥实现远程登录

目录 SSRF漏洞 SSRF攻击Redis 302跳转 漏洞复现&#xff1a; index.html: index.php: 攻击步骤&#xff1a; 1.生成ssh公钥数据&#xff1a; 2.用SSH公钥数据伪造Redis数据&#xff1a; 3.在自己的服务器上写302跳转&#xff1a; 4.最后尝试在.ssh目录下登录&#…

Golang | Leetcode Golang题解之第371题两整数之和

题目&#xff1a; 题解&#xff1a; func getSum(a, b int) int {for b ! 0 {carry : uint(a&b) << 1a ^ bb int(carry)}return a }

MySQL主从复制之GTID模式

目录 1 MySQL 主从复制 GTID 模式介绍 2 传统复制模式与GTID复制模式的区别 3 GTID模式核心参数 4 GTID 实现自动复制原理 4.1 GTID基本概念 4.2 GTID复制流程 5 GTID 实现自动定位 5.1 配置 my.cnf 5.2 配置 SLAVE 实现自动定位 5.3 测试 6 GTID 模式 故障转移的方法流程 6.1…