【JavaScript 漫游】【020】DOM 常用知识点总结

img
文章简介

DOM 是 JavaScript 操作网页的接口,全称为文档对象模型(Document Object Model)。DOM 操作是 JavaScript 最常见的任务,离开了 DOM,JavaScript 就无法操作网页。

本篇文章为【JavaScript 漫游】专栏的第 020 篇文章,对 DOM 规范的常用知识点进行了总结。

由于 DOM 规范的知识内容比较庞大,有不少知识点在日常开发工作中用得非常少,哪怕是在找工作的笔试题和面试题中都很少出现,所以这篇博客就只记录常用的知识点。

文章的内容顺序如下:

  • DOM 概述,介绍 DOM、节点和节点树三者的基本概念,从而对 DOM 规范有初步的了解
  • 接口总结,DOM 规范中定义了 Node、NodeList、HTMLCollection、ParentNode、ChildNode 这五大接口,这些接口提供的属性和方法有助于 JavaScript 操作 DOM 树,这里介绍每个接口的基本概念、常用属性和常用方法
  • 节点总结,DOM 规范中还定义了 Document、Element、Text 和 DocumentFragment 这四种节点,它们提供的属性和方法同样有利于 JavaScript 操作 DOM 树,这里介绍 Document 和 Element 节点的基本概念、常用属性和常用方法(Text 和 DocumentFragment 节点不常用)。
  • 属性操作总结,介绍 JavaScript 如何操作元素节点的属性。
  • CSS操作简述,简单介绍 JavaScript 如何操作 CSS 的基本方法。
  • Mutation Observer API 基本介绍,该 API 用于监视 DOM 的变动

DOM 概述

DOM 介绍

DOM 是 JavaScript 操作网页的接口,全称为文档对象模型(Document Object Model)。它的作用是将网页转为一个 JavaScript 对象,从而可以用脚本进行各种操作(比如增删查改)。

DOM 是一种接口规范,基于规范定义的 DOM 模型,能将结构化文档(比如 HTML)解析成一系列的节点,再由节点组成节点树(称为 DOMTree)。所有的节点和最终的树状结构,都有规范的对外接口。任何一种编程语言,只要它实现了这种接口规范,它就具备能够对结构化文档的内容进行增删查改等操作的能力。JavaScript 正是实现了 DOM 规范,从而具备了在浏览器上操作 HTML 文档内容的能力。

节点和节点树

DOM 的最小组成单位叫做节点(node)。各种不同类型的节点,可以组成节点树。

节点的类型有七种。

  • Document:整个文档树的顶层节点
  • DocumentTypedoctype 标签
  • Element:网页的各种 HTML 标签(比如 <body>
  • Attr:网页元素的属性(比如 class="right"
  • Text:标签之间或标签包含的文本
  • Comment:注释
  • DocumentFragment:文档的片段

这些节点都具备公共或独有的属性和方法,以供 JavaScript 使用。

DOM 树的存在,主要是提供一种上下文,JavaScript 可以先拿到某一个节点,再去找它的祖父节点、兄弟节点和子孙节点等,这样就可以对整个文档的所有节点都进行操作。

DOM 接口总结

Node 接口

所有 DOM 节点对象都继承了 Node 接口,拥有一些共同的属性和方法。这是 DOM 操作的基础。

它的实例属性中常用的有:

  • textContent
  • baseURI
  • previousSibling
  • parentNode
  • parentElement
  • firstChildlastChild
  • childNodes

常用的实例方法有:

  • appendChild()
  • insertBefore()
  • removeChild()
  • replaceChild()

textContent

需要获取当前节点和它的所有后代节点的文本内容时,就用这个属性。它会自动忽略当前节点内部的 HTML 标签,返回所有文本内容。

// HTML 代码为
// <div id="divA">This is <span>some</span> text</div>document.getElementById('divA').textContent;
// This is some text

这个属性是可读写的,通过设置属性的值,新的文本节点就会替换原来的所有子节点。它还有一个用处,就是用于对 HTML 标签转义。

document.getElementById('foo').textContent = '<p>GoodBye!</p>';

上面代码在插入文本时,会将 <p> 标签解释为文本,而不会当作标签去处理。

baseURI

要获取当前网页的绝对路径时,就用这个属性。记住它是只读的。

// 当前网页的网址为
// http://www.example.com/index.html
document.baseURI
// "http://www.example.com/index.html"

如果读不到,就返回 null

属性值一般是当前网址的 URL 决定,但是可以使用 HTML 的 <base> 标签来改变它的值。

// <base href="http://www.example.com/page.html">
document.baseURI
// "http://www.example.com/page.html"

nextSiblingpreviousSibling

通过前者可以获取当前节点毗邻的下一个兄弟节点,后者则可以获取到当前节点毗邻的前一个兄弟节点。

要注意的是,属性值包括了文本节点和注释节点,如果当前节点前后有空格,那么它们的属性值就是空格对应的文本节点。

// HTML 代码如下
// <div id="d1">hello</div><div id="d2">world</div>
var d1 = document.getElementById('d1');
var d2 = document.getElementById('d2');d1.nextSibling === d2 // true
d2.previousSibling === d1 // true

parentNodeparentElement

前者拿到父节点,后者拿到父元素,区别就在于拿到的父节点可以为三种节点类型:元素节点(element)、文档节点(document)和文档片段节点(documentfragment)。后者相当于把文档节点和文档片段节点都排除掉了。

if (node.parentNode) {node.parentNode.removeChild(node);
}if (node.parentElement) {node.parentElement.style.color = 'red';
}

firstChildlastChild

前者获取第一个子节点,后者获取最后一个子节点。

// HTML 代码如下
// <p id="p1"><span>First span</span></p>
var p1 = document.getElementById('p1');
p1.firstChild.nodeName // "SPAN"

childNodes

要获取当前节点的所有子节点时,就用这个属性。它会返回一个类数组对象,NodeList 集合,成员包含当前节点的所有子节点。

var div = document.getElementById('div1');
var children = div.childNodes;for (var i = 0; i < children.length; i++) {// ...
}

注意 NodeList 对象是一个动态集合,一旦子节点发生变化,立刻会反映在返回结果之中。

appendChild()

给当前节点增加一个子节点,位置在末尾。参数是一个节点对象,返回值也是它。

var p = document.createElement('p');
document.body.appendChild(p);

如果参数节点是 DOM 中已经存在的节点,方法会将其从原来的位置,移动到新位置。

var div = document.getElementById('myDiv');
document.body.appendChild(div);

还有,如果参数是 DocumentFragment 节点,那么插入的是 DocumentFragment 的所有子节点,而不是 DocumentFragment 节点本身。返回值是一个空的 DocumentFragment 节点。

insertBefore()

需要将某个节点插入到父节点内部的指定位置时,就需要用到这个方法。语法如下:

var insertedNode = parentNode.insertBefore(newNode, referenceNode);
  • newNode :要插入的节点
  • referenceNode:父节点内部的一个子节点

插入的节点就被插入到该内部子节点的前面。

如果要插入的节点是当前 DOM 现有的节点,则该节点将从原有的位置移除,插入新的位置。

接口规范中不存在 insertAfter(),要实现类似的功能,可以将 insertBefore()nextSibling 结合使用

removeChild()

需要移除子节点时,就用这个方法。

var divA = document.getElementById('A');
divA.parentNode.removeChild(divA);

replaceChild()

需要用新节点,替换某个子节点时,就用这个方法。语法如下:

var replacedNode = parentNode.replaceChild(newChild, oldChild);
  • newChild:新的子节点
  • oldChild:要替换的子节点
var divA = document.getElementById('divA');
var newSpan = document.createElement('span');
newSpan.textContent = 'Hello World!';
divA.parentNode.replaceChild(newSpan, divA);

NodeList 接口和 HTMLCollection 接口

节点都是单个对象,有时需要一种数据结构,能够容纳多个节点。DOM 提供两种节点集合,用于容纳多个节点:NodeListHTMLCollection。它们的主要区别是,前者包含了元素节点、文本节点和注释节点,而后者只包含元素节点。

许多 DOM 属性和方法,返回的结果是 NodeList 实例或 HTMLCollection 实例。通过以下方法可以获得 NodeList 实例。

  • Node.childNodes
  • document.querySelectorAll() 等节点搜索方法

而返回 HTMLCollection 实例的,主要是一些 Document 对象的集合属性。比如 document.linksdocument.formsdocument.images 等。

NodeList 接口概述

NodeList 实例很像数组,可以使用 length 属性和 forEach 方法,但它不是数组,不能使用 poppush 等数组特有的方法。

var children = document.body.childNodes;Array.isArray(children); // falsechildren.length; // 34
children.forEach(console.log);

如果 NodeList 实例要使用数组方法,可以将其转为真正的数组。

var children = document.body.childNodes;
var nodeArr = Array.prototype.slice.call(children);

除了使用 forEach 方法遍历 NodeList 实例,还可以使用 for 循环。。

var children = document.body.childNodes;for (var i = 0; i < children.length; i++) {var item = children[i];
}

要注意的是,NodeList 实例可能是动态集合,也可能是静态集合。所谓动态集合就是一个活的集合,DOM 删除或新增一个相关节点,都会立刻反映在 NodeList 实例。目前,只有 Node.childNodes 返回的是一个动态集合,其他的 NodeList 都是静态集合。

var children = document.body.childNodes;
children.length // 18
document.body.appendChild(document.createElement('p'));
children.length // 19

NodeList.prototype.forEach()

用法与数组实例的 forEach() 完全一致。

var children = document.body.childNodes;
children.forEach(function f(item, i, list) {// ...
}, this);
  • item,当前成员
  • i,位置
  • list,当前 NodeList 实例

NodeList.prototype.keys()NodeList.prototype.values()NodeList.prototype.entries() 实例方法

这三个方法都返回一个 ES6 的遍历器对象,可以通过 for...of 循环遍历获取每一个成员的信息。区别在于,keys() 返回键名的遍历器,values() 返回键值的遍历器,entries() 返回的遍历器同时包含键名和键值的信息。

var children = document.body.childNodes;for (var key of children.keys()) {console.log(key);
}
// 0
// 1
// 2
// ...for (var value of children.values()) {console.log(value);
}
// #text
// <script>
// ...for (var entry of children.entries()) {console.log(entry);
}
// Array [ 0, #text ]
// Array [ 1, <script> ]
// ...

HTMLCollection 接口概述

HTMLCollection 是一个节点对象的集合,只能包含元素节点。它的返回值是一个类似数组的对象,但是与 NodeList 接口不同,HTMLCollection 没有 forEach(),只能使用 for 循环遍历。并且此接口的实例都是动态集合,节点的变化会实时反映在集合中。

// HTML 代码如下
// <img id="pic" src="http://example.com/foo.jpg">var pic = document.getElementById('pic');
document.images.pic === pic // true

HTMLCollection.prototype.length

返回 HTMLCollection 实例包含的成员数量。

HTMLCollection 实例方法都不常用,所以这里就不记录

ParentNode 接口和 ChildNode 接口

节点对象除了继承 Node 接口以外,还拥有其他接口。ParentNode 接口表示当前节点是一个父节点,提供一些处理子节点的方法。ChildNode 接口表示当前节点是一个子节点,提供一些相关方法。

ParentNoode 接口简述

如果当前节点是父节点,就会混入了(mixin)ParentNode 接口。由于只有元素节点(element)、文档节点(document)和文档片段节点(documentFragment)拥有子节点,所以也只有这三类接口会拥有 ParentNode 接口。

ParentNode.children

返回 HTMLCollection 实例。

ParentNode.firstElementChildParentNode.lastElementChild

分别返回当前节点的第一个元素子节点和最后一个元素子节点。

ParentNode.append()ParentNode.prepend()

两者都为当前节点追加一个或多个子节点,区别在于前者追加在末尾,后者追加在前面。

var parent = document.body;// 添加元素子节点
var p = document.createElement('p');
parent.append(p);// 添加文本子节点
parent.append('Hello');// 添加多个元素子节点
var p1 = document.createElement('p');
var p2 = document.createElement('p');
parent.append(p1, p2);// 添加元素子节点和文本子节点
var p = document.createElement('p');
parent.append('Hello', p);

ChildNode.remove()

用于从父节点移除当前节点。

ChildNode.before()ChildNode.after()

分别用于在当前节点的前面和后面插入一个或多个同级节点。

var p = document.createElement('p');
var p1 = document.createElement('p');// 插入元素节点
el.before(p);// 插入文本节点
el.before('Hello');// 插入多个元素节点
el.before(p, p1);// 插入元素节点和文本节点
el.before(p, 'Hello');

ChildNode.replaceWith()

使用参数节点替换当前节点。

var span = document.createElement('span');
el.replaceWith(span);

DOM 节点总结

Document 节点

document 节点对象代表整个文档,每张网页都有自己的 document 对象。只要浏览器开始载入 HTML 文档,该对象就存在了,可以直接使用。

document 对象有不同的方法可以获取。

  • 正常的网页,直接使用 documentwindow.document
  • iframe 框架里面的网页,使用 iframe 节点的 contentDocument 属性
  • Ajax 操作返回的文档,使用 XMLHttpRequest 对象的 responseXML 属性
  • 内部节点的 ownerDocument 属性

document 对象继承了 EventTarget 接口和 Node 接口,并且混入(mixin)了 ParentNode 接口。这意味着,这些接口的方法都可以在 document 对象上调用。除此之外,document 对象还有很多自己的属性和方法。

这里要介绍的常用属性有如下:

  • document.documentURIdocument.URL
  • document.domain
  • document.location
  • document.lastModified
  • document.cookie

常用方法有如下:

  • document.querySelector()document.querySelectorAll()
  • document.getElementsByTagName()
  • document.getElementsByClassName()
  • document.getElementsByName()
  • document.getElementById()
  • document.createElement()
  • document.createAttribute()
  • document.createEvent()
  • document.addEventListener()document.removeEventListener()document.dispatchEvent()

documentURIURL

它们都返回一个字符串,表示当前文档的网址。不同之处是它们继承自不同的接口,documentURI 继承自 Document 接口,可用于所有文档;URL 继承自 HTMLDocument 接口,只能用于 HTML 文档。

document.URL
// http://www.example.com/aboutdocument.documentURI === document.URL
// true

domain

获取当前文档的域名,不包含协议和端口。

location

获取浏览器提供的原生对象 Location,提供 URL 相关的信息和操作方法。

lastModified

获取当前文档的最后修改时间。

cookie

用来操作浏览器 Cookie。

querySelector()querySelectorAll()

它们都接受一个 CSS 选择器作为参数,前者返回匹配该选择器的元素节点,后者返回包含所有匹配该选择器的节点的 NodeList 对象。

var el1 = document.querySelector('.myclass');
var el2 = document.querySelector('#myParent > [ng-click]');var matches = document.querySelectorAll('div.note, div.alert');

注意,它们不支持 CSS 伪元素选择器和伪类选择器。

getElementsByTagName()

通过标签名来获取相应的元素集合,返回值是 HTMLCollection 实例。

var paras = document.getElementsByTagName('p');
paras instanceof HTMLCollection // true

getElementsByClassName()

通过 class 名来获取相应的元素集合,返回值是 HTMLCollection 实例。

var elements = document.getElementsByClassName('foo bar');

getElementsByName()

获取拥有 name 属性的 HTML 元素,比如 <form><radio><img> 等,返回值是 NodeList 实例。

// 表单为 <form name="x"></form>
var forms = document.getElementsByName('x');
forms[0].tagName // "FORM"

getElementById()

获取匹配指定 id 的元素节点。

var elem = document.getElementById('para1');

createElement()

生成元素节点,并返回该节点。

var newDiv = document.createElement('div');

createAttribute()

生成属性节点,并返回该节点。

var node = document.getElementById('div1');var a = document.createAttribute('my_attrib');
a.value = 'newVal';node.setAttributeNode(a);
// 或者
node.setAttribute('my_attrib', 'newVal');

document.createEvent()

生成一个可以被 dispatchEvent() 调用并触发的事件对象。

var event = document.createEvent(type);

参数 type 是事件类型,比如 UIEventsMouseEventsMutationEventsHTMLEvents

var event = document.createEvent('Event');
event.initEvent('build', true, true);
document.addEventListener('build', function (e) {console.log(e.type); // "build"
}, false);
document.dispatchEvent(event);

addEventListener()removeEventListener()dispatchEvent()

这三个方法用于处理 document 节点的事件。它们都继承自 EventTarget 接口。

// 添加事件监听函数
document.addEventListener('click', listener, false);// 移除事件监听函数
document.removeEventListener('click', listener, false);// 触发事件
var event = new Event('click');
document.dispatchEvent(event);

Element 节点

Element 节点对象对应网页的 HTML 元素。每一个 HTML 元素,在 DOM 树上都会转化成一个 Element 节点对象。

Element 对象继承了 Node 接口,因此 Node 接口的属性和方法在 Element 对象上都存在。此外,它还有自己的属性和方法。

下面要介绍的常用属性有:

  • Element.draggable
  • Element.innerHTML
  • Element.scrollLeftElement.scrollTop
  • Element.children
  • Element.firstElementChildElement.lastElementChild
  • Element.nextElementSiblingElement.previousElementSibling

常用方法有:

  • Element.querySelector()Element.querySelectorAll()
  • Element.getElementsByClassName()
  • Element.getElementsByTagName()
  • Element.addEventListener()Element.removeEventListener()Element.dispatchEvent()
  • Element.remove()
  • Element.focus()Element.blur()
  • Element.click()

其中与 Document 对象上同名的方法,它们的用法和含义都是一致的,所以后面就不作赘述。

draggable

返回布尔值,表示当前元素是否可拖拽,可读写。

innerHTML

获取元素包含的所有 HTML 代码,可读写。

scrollLeftscrollTop

前者表示当前元素的水平滚动条向右侧滚动的像素数量,后者表示当前元素的垂直滚动条向下滚动的像素数量。对于那些没有滚动条的网页元素,这两个属性总是等于0。

如果要查看整张网页的水平的和垂直的滚动距离,要从 document.documentElement 元素上读取。

document.documentElement.scrollLeft;
document.documentElement.scrollTop;

这两个属性都可读写,设置该属性的值,会导致浏览器将当前元素自动滚动到相应的位置。

children

获取包含元素节点的所有子元素节点的 HTMLCollection 实例。

if (para.children.length) {var children = para.children;for (var i = 0; i < children.length; i++) {// ...}
}

firstElementChildlastElementChild

分别获取第一个子元素和最后一个子元素。

nextElementSiblingpreviousElementSibling

分别获取后面一个毗邻的同级元素节点和前一个毗邻的同级元素节点。

remove()

将当前节点从它的父节点移除。

var el = document.getElementById('mydiv');
el.remove();

focus()blur()

前者用于将当前页面的焦点,转移到指定元素上。

document.getElementById('my-span').focus();

后者用于将焦点从当前元素移除。

click()

用于在当前元素上模拟一次鼠标点击,相当于触发了 click 事件。

属性操作总结

属性本身是一个 Attr 对象,但是实际上,这个对象极少使用。一般都是通过元素节点对象(HTMLElement 对象)来操作属性。

这里介绍如何操作这些属性。

Element.attributes

元素对象有一个 attributes 属性,返回一个类似数组的动态对象,成员是该元素标签的所有属性节点对象,属性的实时变化都会反映在这个节点对象上。

单个属性可以通过序号引用,也可以通过属性名引用。

// HTML 代码如下
// <body bgcolor="yellow" οnlοad="">
document.body.attributes[0]
document.body.attributes.bgcolor
document.body.attributes['ONLOAD']

属性节点对象有 namevalue 属性,对应属性名和属性值。

// HTML代码为
// <div id="mydiv">
var n = document.getElementById('mydiv');n.attributes[0].name // "id"
n.attributes[0].nodeName // "id"n.attributes[0].value // "mydiv"
n.attributes[0].nodeValue // "mydiv"

Element.getAttribute()

返回当前元素节点的指定属性。如果指定属性不存在,则返回 null

// HTML 代码为
// <div id="div1" align="left">
var div = document.getElementById('div1');
div.getAttribute('align') // "left"

Element.getAttributeNames()

返回包含当前元素的所有属性的名字的数组。它与 Element.attributes 的区别在于,后者返回的是类数组对象。

var mydiv = document.getElementById('mydiv');mydiv.getAttributeNames().forEach(function (key) {var value = mydiv.getAttribute(key);console.log(key, value);
})

Element.setAttribute()

用于为当前节点新增属性。如果同名属性已存在,则相当于编辑已存在的属性。方法没有返回值。

// HTML 代码为
// <button>Hello World</button>
var b = document.querySelector('button');
b.setAttribute('name', 'myButton');
b.setAttribute('disabled', true);

Element.hasAttribute()

当前元素节点是否包含指定属性。

var d = document.getElementById('div1');if (d.hasAttribute('align')) {d.setAttribute('align', 'center');
}

Element.hasAttributes()

当前元素是否有属性,如果没有任何属性,就返回 false,否则返回 true

var foo = document.getElementById('foo');
foo.hasAttributes() // true

Element.removeAttribute()

移除指定属性。方法没有返回值。

// HTML 代码为
// <div id="div1" align="left" width="200px">
document.getElementById('div1').removeAttribute('align');
// 现在的HTML代码为
// <div id="div1" width="200px">

CSS 操作简述

CSS 与 JavaScript 是两个有着明确分工的领域,前者负责页面的视觉效果,后者负责与用户的行为互动。但是,它们毕竟同属网页开发的前端,因此不可避免有着交叉和互相配合。

操作 CSS 样式最简单的方式,就是使用网页元素节点的 getAttribute()setAttribute()removeAttribute(),直接读写或删除网页元素的 style 属性。

div.setAttribute('style','background-color:red;' + 'border:1px solid black;'
);

style 不仅可以使用字符串读写,它本身还是一个对象,部署了 CSSStyleDeclaration 接口,可以直接读写个别属性。

e.style.fontSize = '18px';
e.style.color = 'black';

Mutation Observer API 基本介绍

Mutation Observer API 用来监视 DOM 变动。DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动,这个 API 都可以得到通知。

概念上,它很接近事件,可以理解为 DOM 发生变动就会触发 Mutation Observer 事件。但是,它与事件有一个本质不同:事件是同步触发,也就是说,DOM 的变动立刻会触发相应的事件;Mutation Observer 则是异步触发,DOM 的变动并不会马上触发,而是要等到当前所有 DOM 操作都结束才触发。

这样设计是为了应付 DOM 变动频繁的特点。举例来说,如果文档中连续插入1000个 <p> 元素,就会连续触发1000个插入事件,执行每个事件的回调函数,这很可能造成浏览器的卡顿;而 Mutation Observer 完全不同,只在1000个段落都插入结束后才会触发,而且只触发一次。

Mutation Observer 有以下特点。

  • 它等待所有脚本任务完成后,才会运行(即异步触发方式)。
  • 它把 DOM 变动记录封装成一个数组进行处理,而不是一条条个别处理 DOM 变动。
  • 它既可以观察 DOM 的所有类型变动,也可以指定只观察某一类变动。

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

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

相关文章

Mybatis总结--传参二

#叫做占位符 Mybatis是封装的JDBC 增强版 内部还是用的jdbc 每遇到一个#号 这里就会变为&#xff1f;占位符 一个#{}就是对应一个问号 一个占位符 用这个对象执行sql语句没有sql注入的风险 八、多个参数-使用Param 当 Dao 接口方法有多个参数&#xff0c;需要通过名称使…

Gemini 模型将被引入Performance Max

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

迅为LS2K0500开发板龙芯自主指令系统应用于互联网应用、打印终端、BMC 医疗、数控、通讯、交通等

CPU 迅为LS2K0500开发板采用龙芯2K0500处理器&#xff0c;基于龙芯自主指令系统 (LoongArch) 架构&#xff0c;片内集成64位LA264处理器核。实现ACPI、DVFS/DPM动态电源功耗管理等低功耗技术&#xff0c;支持多种电源级别和唤醒方式&#xff0c;可根据具体应用场景对芯片部分功…

Linux内核网络

文章目录 前言网络协议栈图解功能 发送Linux内核网络数据包图解流程 接收Linux内核网络数据包图解流程 最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;因为Linux内核涉及的内容极多&#xff0c;我们初学者如果一上来就开始深挖细节&#xff0c;很有可能会在Linux内核代码…

时序预测 | Matlab实现基于GRNN广义回归神经网络的光伏功率预测模型

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 1.时序预测 | Matlab实现基于GRNN广义回归神经网络的光伏功率预测模型 2.单变量时间序列预测; 3.多指标评价,评价指标包括:R2、MAE、MBE等,代码质量极高; 4.excel数据,方便替换,运行环境2020及以上。 广义回…

抖音短视频:表情包账号的魅力与运营之道以及制作与工具

在短视频的浪潮中&#xff0c;抖音以其独特的创意和趣味性成为了年轻人的最爱。其中&#xff0c;表情包账号更是凭借其生动、形象的表现方式&#xff0c;赢得了众多用户的青睐。本文将深入探讨抖音短视频表情包账号的魅力所在以及如何有效运营。 一、表情包账号的独特魅力 情…

Go的CSP并发模型实现M, P, G简介

GMP概念简介 G: goroutine&#xff08;协程&#xff0c;也叫用户态线程&#xff09; M: 工作线程(内核态线程) P: 上下文(也可以认为是cpu&#xff0c;逻辑cpu数量&#xff0c;可以在程序启动的时候设置这个数量&#xff0c;gomaxprocs函数设置) GMP 模型 在 Go 中&#xff…

深度神经网络中的计算和内存带宽

深度神经网络中的计算和内存带宽 文章目录 深度神经网络中的计算和内存带宽来源原理介绍分析1&#xff1a;线性层分析2&#xff1a;卷积层分析3&#xff1a;循环层总结 来源 相关知识来源于这里。 原理介绍 Memory bandwidth and data re-use in deep neural network computat…

Temu、亚马逊店铺如何快速得到好评?自养号测评下单的秘籍及必备条件。

Temu、亚马逊店铺如何快速得到好评?在这个竞争激烈的电商平台上&#xff0c;好评是店铺吸引顾客、建立良好声誉的关键。快速积累好评不仅能够提高商品的曝光度&#xff0c;也有助于吸引更多潜在顾客的关注。 然而&#xff0c;亚马逊不同于国内电商&#xff0c;对于操纵评论、…

动态规划的时间复杂度优化

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 优化动态规划的时间复杂度&#xff0c;主要有如下几种&#xff1a; 一&#xff0c;不同的状态表示。 比如&#xff1a;n个人&#xff0c;m顶帽子。 第一种方式&#xff1a;dp[i][mask] ,i表示前i个人已经选择帽子&…

Python in Excel的一些使用心得

获得Python in Excel的preview之后, 就在任意的Excel单元格里可以敲py(来写Python代码了。不过Python in Excel并没有什么专门的文档, 只有一些_Get Started_教程, 比如link 1, link 2, 剩下的就是pandas, matplotlib, seaborn等lib的文章&#xff0c;和Python in Excel并没有什…

linux---安使用nginx

目录 一、编译安装Nginx 1、关闭防火墙&#xff0c;将安装nginx所需要软件包传到/opt目录下 ​编辑2、安装依赖包 3、创建运行用户、组 4、编译安装nginx 5、创建软链接后直接nginx启动 ​编辑 6、创建nginx自启动文件 ​编辑6.1 重新加载配置、设置开机自启并开启服务…

了解Node.js事件循环和事件驱动模型

在前端开发中&#xff0c;Node.js 是一个极其强大的工具&#xff0c;其事件驱动和非阻塞 I/O 的特性使其成为一个热门选择。但要充分发挥 Node.js 的优势&#xff0c;我们必须深入了解其事件循环和事件驱动模型。本文将深入探讨 Node.js 的事件循环机制以及事件驱动模型&#x…

【mysql】linux系统上进行安装操作(记录)

一、卸载自带的mariadb rpm -qa|grep mariadb #查看版本 yum -y remove mariadb版本号 #如mariadb-libs-5.5.52-1.el7.x86_64 删除目录rm -rf /var/lib/mysql/ 二、mysql安装 2.1 Mysql下载 https://dev.mysql.com/downloads/mysql/5.6.html#downloads 安装参考网址https…

为什么要学习PMP知识,PMP培训哪家好?

IT行业项目管理一枚&#xff0c;曾在做技术的时候对自己的职业发展越来越迷茫&#xff0c;不想干到35岁就参与到失业潮中&#xff0c;一直在想着办法提升自己的能力和竞争力&#xff0c;直到在领导嘴里了解到了PMP认证。也就是它对我的职业发展带来了不少的影响&#xff0c;这其…

美联储突然降息无望

作者&#xff1a;秦晋 我们知道&#xff0c;影响比特币未来1-2年市场走向的重要三因素是比特币ETF、比特币减半以及美联储降息。 如果说前两者是影响比特币市场比较紧密的微观因素。那么美联储降息就是影响比特币市场的重要宏观因素。如何看懂宏观因素&#xff1f;尽量倾听和观…

【openGL教程08】基于C++的着色器(02)

LearnOpenGL - Shaders 一、说明 着色器是openGL渲染的重要内容&#xff0c;客户如果想自我实现渲染灵活性&#xff0c;可以用着色器进行编程&#xff0c;这种程序小脚本被传送到GPU的显卡内部&#xff0c;起到动态灵活的着色作用。 二、着色器简述 正如“Hello Triangle”一章…

CSS3移动端(介绍、Chrome DevTools、视口、倍图、backgroud-size、开发方案、CSS初始化、特殊样式)

目录 1. 介绍2. Chrome DevTools移动端调试3. 视口3.1 布局视口layout viewport3.2 视觉视口visual viewport3.3 理想视口ideal viewport 4. 倍图4.1 图片的倍图使用4.2 背景图通过backgroud-size使用倍图4.3 精灵图作为背景图注意事项 5. 开发方案6. CSS初始化7. 特殊样式 1. …

【暖心驿站】壹起来|“会心驿小”——“灯笼传情 团圆共享”职工关爱活动

2024年2月23日上午&#xff0c;由曹桥街道总工会指导&#xff0c;“会心驿小”暖心驿站在平湖市新时代文明实践基地、平湖市非织造两创产业园区开展“灯笼传情 团圆共享”元宵节职工关爱活动&#xff0c;旨在丰富职工子女文化生活&#xff0c;提升职工幸福感和满足感。 社工通过…

【Git】Git命令的学习与总结

本文实践于 Learn Git Branching 这个有趣的 Git 学习网站。在该网站&#xff0c;可以使用 show command 命令展示所有可用命令。你也可以直接访问网站的sandbox&#xff0c;自由发挥。 一、本地篇 基础篇 git commit git commit将暂存区&#xff08;staging area&#xff…