十四、文档对象模型

原文:The Document Object Model

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

部分参考了《JavaScript 编程精解(第 2 版)》

Too bad! Same old story! Once you’ve finished building your house you notice you’ve accidentally learned something that you really should have known—before you started.

Friedrich Nietzsche,《Beyond Good and Evil》

当你在浏览器中打开网页时,浏览器会接收网页的 HTML 文本并进行解析,其解析方式与第 11 章中介绍的解析器非常相似。浏览器构建文档结构的模型,并使用该模型在屏幕上绘制页面。

JavaScript 在其沙箱中提供了将文本转换成文档对象模型的功能。它是你可以读取或者修改的数据结构。模型是一个所见即所得的数据结构,改变模型会使得屏幕上的页面产生相应变化。

文档结构

你可以将 HTML 文件想象成一系列嵌套的箱子。诸如<body></body>之类的标签会将其他标签包围起来,而包含在内部的标签也可以包含其他的标签和文本。这里给出上一章中已经介绍过的示例文件。

<!doctype html>
<html><head><title>My home page</title></head><body><h1>My home page</h1><p>Hello, I am Marijn and this is my home page.</p><p>I also wrote a book! Read it<a href="http://eloquentjavascript.net">here</a>.</p></body>
</html>

该页面结构如下所示。

浏览器使用与该形状对应的数据结构来表示文档。每个盒子都是一个对象,我们可以和这些对象交互,找出其中包含的盒子与文本。我们将这种表示方式称为文档对象模型(Document Object Model),或简称 DOM。

我们可以通过全局绑定document来访问这些对象。该对象的documentElement属性引用了<html>标签对象。由于每个 HTML 文档都有一个头部和一个主体,它还具有headbody属性,指向这些元素。

回想一下第 12 章中提到的语法树。其结构与浏览器文档的结构极为相似。每个节点使用children引用其他节点,而每个子节点又有各自的children。其形状是一种典型的嵌套结构,每个元素可以包含与其自身相似的子元素。

如果一个数据结构有分支结构,而且没有任何环路(一个节点不能直接或间接包含自身),并且有一个单一、定义明确的“根节点”,那么我们将这种数据结构称之为树。就 DOM 来讲,document.documentElement就是其根节点。

在计算机科学中,树的应用极为广泛。除了表现诸如 HTML 文档或程序之类的递归结构,树还可以用于维持数据的有序集合,因为在树中寻找或插入一个节点往往比在数组中更高效。

一棵典型的树有不同类型的节点。Egg 语言的语法树有标识符、值和应用节点。应用节点常常包含子节点,而标识符、值则是叶子节点,也就是没有子节点的节点。

DOM中也是一样。元素(表示 HTML 标签)的节点用于确定文档结构。这些节点可以包含子节点。这类节点中的一个例子是document.body。其中一些子节点可以是叶子节点,比如文本片段或注释。

每个 DOM 节点对象都包含nodeType属性,该属性包含一个标识节点类型的代码(数字)。元素的值为 1,DOM 也将该值定义成一个常量属性document.ELEMENT_NODE。文本节点(表示文档中的一段文本)代码为 3(document.TEXT_NODE)。注释的代码为 8(document.COMMENT_NODE)。

因此我们可以使用另一种方法来表示文档树:

叶子节点是文本节点,而箭头则指出了节点之间的父子关系。

标准

并非只有 JavaScript 会使用数字代码来表示节点类型。本章随后将会展示其他的 DOM 接口,你可能会觉得这些接口有些奇怪。这是因为 DOM 并不是为 JavaScript 而设计的,它尝试成为一组语言中立的接口,确保也可用于其他系统中,不只是 HTML,还有 XML。XML 是一种通用数据格式,语法与 HTML 相近。

这就比较糟糕了。一般情况下标准都是非常易于使用的。但在这里其优势(跨语言的一致性)并不明显。相较于为不同语言提供类似的接口,如果能够将接口与开发者使用的语言进行适当集成,可以为开发者节省大量时间。

我们举例来说明一下集成问题。比如 DOM 中每个元素都有childNodes属性。该属性是一个类数组对象,有length属性,也可以使用数字标签访问对应的子节点。但该属性是NodeList类型的实例,而不是真正的数组,因此该类型没有诸如slicemap之类的方法。

有些问题是由不好的设计导致的。例如,我们无法在创建新的节点的同时立即为其添加子节点和属性。相反,你首先需要创建节点,然后使用副作用,将子节点和属性逐个添加到节点中。大量使用 DOM 的代码通常较长、重复和丑陋。

但这些问题并非无法改善。因为 JavaScript 允许我们构建自己的抽象,可以设计改进方式来表达你正在执行的操作。 许多用于浏览器编程的库都附带这些工具。

沿着树移动

DOM 节点包含了许多指向相邻节点的链接。下面的图表展示了这一点。

尽管图表中每种类型的节点只显示出一条链接,但每个节点都有parentNode属性,指向一个节点,它是这个节点的一部分。类似的,每个元素节点(节点类型为 1)均包含childNodes属性,该属性指向一个类数组对象,用于保存其子节点。

理论上,你可以通过父子之间的链接移动到树中的任何地方。但 JavaScript 也提供了一些更加方便的额外链接。firstChild属性和lastChild属性分别指向第一个子节点和最后一个子节点,若没有子节点则值为null。类似的,previousSiblingnextSibling指向相邻节点,分别指向拥有相同父亲的前一个节点和后一个节点。对于第一个子节点,previousSiblingnull,而最后一个子节点的nextSibling则是null

也存在children属性,它就像childNodes,但只包含元素(类型为 1)子节点,而不包含其他类型的子节点。 当你对文本节点不感兴趣时,这可能很有用。

处理像这样的嵌套数据结构时,递归函数通常很有用。 以下函数在文档中扫描包含给定字符串的文本节点,并在找到一个时返回true

function talksAbout(node, string) {if (node.nodeType == document.ELEMENT_NODE) {for (let i = 0; i < node.childNodes.length; i++) {if (talksAbout(node.childNodes[i], string)) {return true;}}return false;} else if (node.nodeType == document.TEXT_NODE) {return node.nodeValue.indexOf(string) > -1;}
}console.log(talksAbout(document.body, "book"));
// → true

因为childNodes不是真正的数组,所以我们不能用for/of来遍历它,并且必须使用普通的for循环遍历索引范围。

文本节点的nodeValue属性保存它所表示的文本字符串。

查找元素

使用父节点、子节点和兄弟节点之间的连接遍历节点确实非常实用。但是如果我们只想查找文档中的特定节点,那么从document.body开始盲目沿着硬编码的链接路径查找节点并非良策。如果程序通过树结构定位节点,就需要依赖于文档的具体结构,而文档结构随后可能发生变化。另一个复杂的因素是 DOM 会为不同节点之间的空白字符创建对应的文本节点。例如示例文档中的body标签不止包含 3 个子节点(<h1>和两个<p>元素),其实包含 7 个子节点:这三个节点、三个节点前后的空格、以及元素之间的空格。

因此,如果你想获取文档中某个链接的href属性,最好不要去获取文档body元素中第六个子节点的第二个子节点,而最好直接获取文档中的第一个链接,而且这样的操作确实可以实现。

let link = document.body.getElementsByTagName("a")[0];
console.log(link.href);

所有元素节点都包含getElementsByTagName方法,用于从所有后代节点中(直接或间接子节点)搜索包含给定标签名的节点,并返回一个类数组的对象。

你也可以使用document.getElementById来寻找包含特定id属性的某个节点。

<p>My ostrich Gertrude:</p>
<p><img id="gertrude" src="https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/master/img/ostrich.png"></p><script>let ostrich = document.getElementById("gertrude");console.log(ostrich.src);
</script>

第三个类似的方法是getElementsByClassName,它与getElementsByTagName类似,会搜索元素节点的内容并获取所有包含特定class属性的元素。

修改文档

几乎所有 DOM 数据结构中的元素都可以被修改。文档树的形状可以通过改变父子关系来修改。 节点的remove方法将它们从当前父节点中移除。appendChild方法可以添加子节点,并将其放置在子节点列表末尾,而insertBefore则将第一个参数表示的节点插入到第二个参数表示的节点前面。

<p>One</p>
<p>Two</p>
<p>Three</p><script>let paragraphs = document.body.getElementsByTagName("p");document.body.insertBefore(paragraphs[2], paragraphs[0]);
</script>

每个节点只能存在于文档中的某一个位置。因此,如果将段落Three插入到段落One前,会将该节点从文档末尾移除并插入到文档前面,最后结果为Three/One/Two。所有将节点插入到某处的方法都有这种副作用——会将其从当前位置移除(如果存在的话)。

replaceChild方法用于将一个子节点替换为另一个子节点。该方法接受两个参数,第一个参数是新节点,第二个参数是待替换的节点。待替换的节点必须是该方法调用者的子节点。这里需要注意,replaceChildinsertBefore都将新节点作为第一个参数。

创建节点

假设我们要编写一个脚本,将文档中的所有图像(<img>标签)替换为其alt属性中的文本,该文本指定了图像的文字替代表示。

这不仅涉及删除图像,还涉及添加新的文本节点,并替换原有图像节点。为此我们使用document.createTextNode方法。

<p>The <img src="https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/master/img/cat.png" alt="Cat"> in the<img src="https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/master/img/hat.png" alt="Hat">.</p><p><button onclick="replaceImages()">Replace</button></p><script>function replaceImages() {let images = document.body.getElementsByTagName("img");for (let i = images.length - 1; i >= 0; i--) {let image = images[i];var image = images[i];if (image.alt) {let text = document.createTextNode(image.alt);image.parentNode.replaceChild(text, image);}}}
</script>

给定一个字符串,createTextNode为我们提供了一个文本节点,我们可以将它插入到文档中,来使其显示在屏幕上。

该循环从列表末尾开始遍历图像。我们必须这样反向遍历列表,因为getElementsByTagName之类的方法返回的节点列表是动态变化的。该列表会随着文档改变还改变。若我们从列表头开始遍历,移除掉第一个图像会导致列表丢失其第一个元素,第二次循环时,因为集合的长度此时为 1,而i也为 1,所以循环会停止。

如果你想要获得一个固定的节点集合,可以使用数组的Array.from方法将其转换成实际数组。

let arrayish = {0: "one", 1: "two", length: 2};
let array = Array.from(arrayish);
console.log(array.map(s => s.toUpperCase()));
// → ["ONE", "TWO"]

你可以使用document.createElement方法创建一个元素节点。该方法接受一个标签名,返回一个新的空节点,节点类型由标签名指定。

下面的示例定义了一个elt工具,用于创建一个新的元素节点,并将其剩余参数当作该节点的子节点。接着使用该函数为引用添加来源信息。

<blockquote id="quote">No book can ever be finished. While working on it we learnjust enough to find it immature the moment we turn awayfrom it.
</blockquote><script>function elt(type, ...children) {let node = document.createElement(type);for (let child of children) {if (typeof child != "string") node.appendChild(child);else node.appendChild(document.createTextNode(child));}return node;}document.getElementById("quote").appendChild(elt("footer", "—",elt("strong", "Karl Popper"),", preface to the second editon of ",elt("em", "The Open Society and Its Enemies"),", 1950"));
</script>

属性

我们可以通过元素的 DOM 对象的同名属性去访问元素的某些属性,比如链接的href属性。这仅限于最常用的标准属性。

HTML 允许你在节点上设定任何属性。这一特性非常有用,因为这样你就可以在文档中存储额外信息。你自己创建的属性不会出现在元素节点的属性中。你必须使用getAttributesetAttribute方法来访问这些属性。

<p data-classified="secret">The launch code is 00000000.</p>
<p data-classified="unclassified">I have two feet.</p><script>let paras = document.body.getElementsByTagName("p");for (let para of Array.from(paras)) {if (para.getAttribute("data-classified") == "secret") {para.remove();}}
</script>

建议为这些组合属性的名称添加data-前缀,来确保它们不与任何其他属性发生冲突。

这里有一个常用的属性:class。该属性是 JavaScript 中的保留字。因为某些历史原因(某些旧版本的 JavaScript 实现无法处理和关键字或保留字同名的属性),访问class的属性名为className。你也可以使用getAttributesetAttribute方法,使用其实际名称class来访问该属性。

布局

你可能已经注意到不同类型的元素有不同的布局。某些元素,比如段落(<p>)和标题(<h1>)会占据整个文档的宽度,并且在独立的一行中渲染。这些元素被称为块(Block)元素。其他的元素,比如链接(<a><strong>元素则与周围文本在同一行中渲染。这类元素我们称之为内联(Inline)元素。

对于任意特定文档,浏览器可以根据每个元素的类型和内容计算其尺寸与位置等布局信息。接着使用布局来绘制文档。

JavaScript 中可以访问元素的尺寸与位置。

属性offsetWidthoffsetHeight给出元素的起始位置(单位是像素)。像素是浏览器中的基本测量单元。它通常对应于屏幕可以绘制的最小的点,但是在现代显示器上,可以绘制非常小的点,这可能不再适用了,并且浏览器像素可能跨越多个显示点。

同样,clientWidthclientHeight向你提供元素内的空间大小,忽略边框宽度。

<p style="border: 3px solid red">I'm boxed in
</p><script>let para = document.body.getElementsByTagName("p")[0];console.log("clientHeight:", para.clientHeight);console.log("offsetHeight:", para.offsetHeight);
</script>

getBoundingClientRect方法是获取屏幕中某个元素精确位置的最有效方法。该方法返回一个对象,包含topbottomleftright四个属性,表示元素相对于屏幕左上角的位置(单位是像素)。若你想要知道其相对于整个文档的位置,必须加上其滚动位置,你可以在pageXOffsetpageYOffset绑定中找到。

我们还需要花些力气才能完成文档的排版工作。为了加快速度,每次你改变它时,浏览器引擎不会立即重新绘制整个文档,而是尽可能等待并推迟重绘操作。当一个修改文档的 JavaScript 程序结束时,浏览器会计算新的布局,并在屏幕上显示修改过的文档。若程序通过读取offsetHeightgetBoundingClientRect这类属性获取某些元素的位置或尺寸时,为了提供正确的信息,浏览器也需要计算布局。

如果程序反复读取 DOM 布局信息或修改 DOM,会强制引发大量布局计算,导致运行非常缓慢。下面的代码展示了一个示例。该示例包含两个不同的程序,使用X字符构建一条线,其长度是 2000 像素,并计算每个任务的时间。

<p><span id="one"></span></p>
<p><span id="two"></span></p><script>function time(name, action) {let start = Date.now(); // Current time in millisecondsaction();console.log(name, "took", Date.now() - start, "ms");}time("naive", () => {let target = document.getElementById("one");while (target.offsetWidth < 2000) {target.appendChild(document.createTextNode("X"));}});// → naive took 32 mstime("clever", function() {let target = document.getElementById("two");target.appendChild(document.createTextNode("XXXXX"));let total = Math.ceil(2000 / (target.offsetWidth / 5));target.firstChild.nodeValue = "X".repeat(total);});// → clever took 1 ms
</script>

样式

我们看到了不同的 HTML 元素的绘制是不同的。一些元素显示为块,一些则是以内联方式显示。我们还可以添加一些样式,比如使用<strong>加粗内容,或使用<a>使内容变成蓝色,并添加下划线。

<img>标签显示图片的方式或点击标签<a>时跳转的链接都和元素类型紧密相关。但元素的默认样式,比如文本的颜色、是否有下划线,都是可以改变的。这里给出使用style属性的示例。

<p><a href=".">Normal link</a></p>
<p><a href="." style="color: green">Green link</a></p>

样式属性可以包含一个或多个声明,格式为属性(比如color)后跟着一个冒号和一个值(比如green)。当包含更多声明时,不同属性之间必须使用分号分隔,比如color:red;border:none

文档的很多方面会受到样式的影响。例如,display属性控制一个元素是否显示为块元素或内联元素。

This text is displayed <strong>inline</strong>,
<strong style="display: block">as a block</strong>, and
<strong style="display: none">not at all</strong>.

block标签会结束其所在的那一行,因为块元素是不会和周围文本内联显示的。最后一个标签完全不会显示出来,因为display:none会阻止一个元素呈现在屏幕上。这是隐藏元素的一种方式。更好的方式是将其从文档中完全移除,因为稍后将其放回去是一件很简单的事情。

JavaScript 代码可以通过元素的style属性操作元素的样式。该属性保存了一个对象,对象中存储了所有可能的样式属性,这些属性的值是字符串,我们可以把字符串写入属性,修改某些方面的元素样式。

<p id="para" style="color: purple">Nice text
</p><script>let para = document.getElementById("para");console.log(para.style.color);para.style.color = "magenta";
</script>

一些样式属性名包含破折号,比如font-family。由于这些属性的命名不适合在 JavaScript 中使用(你必须写成style["font-family"]),因此在 JavaScript 中,样式对象中的属性名都移除了破折号,并将破折号之后的字母大写(style.fontFamily)。

层叠样式

我们把 HTML 的样式化系统称为 CSS,即层叠样式表(Cascading Style Sheets)。样式表是一系列规则,指出如何为文档中元素添加样式。可以在<style>标签中写入 CSS。

<style>strong {font-style: italic;color: gray;}
</style>
<p>Now <strong>strong text</strong> is italic and gray.</p>

所谓层叠指的是将多条规则组合起来产生元素的最终样式。在示例中,<strong>标签的默认样式font-weight:bold,会被<style>标签中的规则覆盖,并为<strong>标签样式添加font-stylecolor属性。

当多条规则重复定义同一属性时,最近的规则会拥有最高的优先级。因此如果<style>标签中的规则包含font-weight:normal,违背了默认的font-weight规则,那么文本将会显示为普通样式,而非粗体。属性style中的样式会直接作用于节点,而且往往拥有最高优先级。

我们可以在 CSS 规则中使用标签名来定位标签。规则.abc指的是所有class属性中包含abc的元素。规则#xyz作用于id属性为xyz(应当在文档中唯一存在)的元素。

.subtle {color: gray;font-size: 80%;
}
#header {background: blue;color: white;
}
/* p elements with id main and with classes a and b */
p#main.a.b {margin-bottom: 20px;
}

优先级规则偏向于最近定义的规则,仅在规则特殊性相同时适用。规则的特殊性用于衡量该规则描述匹配元素时的准确性。特殊性取决于规则中的元素数量和类型(tagclassid)。例如,目标规则p.a比目标规则p.a更具体,因此有更高优先级。

p>a这种写法将样式作用于<p>标签的直系子节点。类似的,p a应用于所有的<p>标签中的<a>标签,无论是否是直系子节点。

查询选择器

本书不会使用太多样式表。尽管理解样式表对浏览器程序设计至关重要,想要正确解释所有浏览器支持的属性及其使用方式,可能需要两到三本书才行。

我介绍选择器语法(用在样式表中,确定样式作用的元素)的主要原因是这种微型语言同时也是一种高效的 DOM 元素查找方式。

document对象和元素节点中都定义了querySelectorAll方法,该方法接受一个选择器字符串并返回类数组对象,返回的对象中包含所有匹配的元素。

<p>And if you go chasing<span class="animal">rabbits</span></p>
<p>And you know you're going to fall</p>
<p>Tell 'em a <span class="character">hookah smoking<span class="animal">caterpillar</span></span></p>
<p>Has given you the call</p><script>function count(selector) {return document.querySelectorAll(selector).length;}console.log(count("p"));           // All <p> elements// → 4console.log(count(".animal"));     // Class animal// → 2console.log(count("p .animal"));   // Animal inside of <p>// → 2console.log(count("p > .animal")); // Direct child of <p>// → 1
</script>

getElementsByTagName这类方法不同,由querySelectorAll返回的对象不是动态变更的。修改文档时其内容不会被修改。但它仍然不是一个真正的数组,所以如果你打算将其看做真的数组,你仍然需要调用Array.from

querySelector方法(没有All)与querySelectorAll作用相似。如果只想寻找某一个特殊元素,该方法非常有用。该方法只返回第一个匹配的元素,如果没有匹配的元素则返回null

位置与动画

position样式属性是一种强大的布局方法。默认情况下,该属性值为static,表示元素处于文档中的默认位置。若该属性设置为relative,该元素在文档中依然占据空间,但此时其topleft样式属性则是相对于常规位置的偏移。若position设置为absolute,会将元素从默认文档流中移除,该元素将不再占据空间,而会与其他元素重叠。其topleft属性则是相对其最近的闭合元素的偏移,其中position属性的值不是static。如果没有任何闭合元素存在,则是相对于整个文档的偏移。

我们可以使用该属性创建一个动画。下面的文档用于显示一幅猫的图片,该图片会沿着椭圆轨迹移动。

<p style="text-align: center"><img src="https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/master/img/cat.png" style="position: relative">
</p>
<script>let cat = document.querySelector("img");let angle = Math.PI / 2;function animate(time, lastTime) {if (lastTime != null) {angle += (time - lastTime) * 0.001;}lastTime = time;cat.style.top = (Math.sin(angle) * 20) + "px";cat.style.left = (Math.cos(angle) * 200) + "px";requestAnimationFrame(newTime => animate(newTime, time));}requestAnimationFrame(animate);
</script>

我们的图像在页面中央,positionrelative。为了移动这只猫,我们需要不断更新图像的topleft样式。

脚本使用requestAnimationFrame在每次浏览器准备重绘屏幕时调用animate函数。animate函数再次调用requestAnimationFrame以准备下一次更新。当浏览器窗口(或标签)激活时,更新频率大概为 60 次每秒,这种频率可以生成美观的动画。

若我们只是在循环中更新 DOM,页面会静止不动,页面上也不会显示任何东西。浏览器不会在执行 JavaScript 程序时刷新显示内容,也不允许页面上的任何交互。这就是我们需要requestAnimationFrame的原因,该函数用于告知浏览器 JavaScript 程序目前已经完成工作,因此浏览器可以继续执行其他任务,比如刷新屏幕,响应用户动作。

我们将动画生成函数作为参数传递给requestAnimationFrame。为了确保每一毫秒猫的移动是稳定的,而且动画是圆滑的,它基于一个速度,角度以这个速度改变这一次与上一次函数运行的差。如果仅仅每次走几步,猫的动作可能略显迟钝,例如,另一个在相同电脑上的繁重任务可能使得该函数零点几秒之后才会运行一次。

我们使用三角函数Math.cosMath.sin来使猫沿着圆弧移动。你可能不太熟悉这些计算,我在这里简要介绍它们,因为你会在这本书中偶尔遇到。

Math.cosMath.sin非常实用,我们可以利用一个 1 个弧度,计算出以点(0,0为圆心的圆上特定点的位置。两个函数都将参数解释为圆上的一个位置,0 表示圆上最右侧那个点,一直逆时针递增到(大概是 6.28),正好走过整个圆。Math.cos可以计算出圆上某一点对应的x坐标,而Math.sin则计算出y坐标。超过或小于 0 的位置(或角度)都是合法的。因为弧度是循环重复的,a+2πa的角度相同。

用于测量角度的单位称为弧度 - 一个完整的圆弧是个弧度,类似于以角度度量时的 360 度。 常量π在 JavaScript 中为Math.PI

猫的动画代码保存了一个名为angle的计数器,该绑定记录猫在圆上的角度,而且每当调用animate函数时,增加该计数器的值。我们接着使用这个角度来计算图像元素的当前位置。top样式是Math.sin的结果乘以 20,表示圆中的垂直弧度。left样式是 Math.cos 的结果乘以200,因此圆的宽度大于其高度,导致最后猫会沿着椭圆轨迹移动。

这里需要注意的是样式的值一般需要指定单位。本例中,我们在数字后添加px来告知浏览器以像素为计算单位(而非厘米,ems,或其他单位)。我们很容易遗漏这个单位。如果我们没有为样式中的数字加上单位,浏览器最后会忽略掉该样式,除非数字是 0,在这种情况下使用什么单位,其结果都是一样的。

本章小结

JavaScript 程序可以通过名为 DOM 的数据结构,查看并修改浏览器中显示的文档。该数据结构描述了浏览器文档模型,而 JavaScript 程序可以通过修改该数据结构来修改浏览器展示的文档。

DOM 的组织就像树一样,DOM 根据文档结构来层次化地排布元素。描述元素的对象包含很多属性,比如parentNodechildNodes这两个属性可以用来遍历 DOM 树。

我们可以通过样式来改变文档的显示方式,可以直接在节点上附上样式,也可以编写匹配节点的规则。样式包含许多不同的属性,比如colordisplay。JavaScript 代码可以直接通过节点的style属性操作元素的样式。

习题

创建一张表

HTML 表格使用以下标签结构构建:

<table><tr><th>name</th><th>height</th><th>place</th></tr><tr><td>Kilimanjaro</td><td>5895</td><td>Tanzania</td></tr>
</table>

<table>标签中,每一行包含一个<tr>标签。<tr>标签内部则是单元格元素,分为表头(<th>)和常规单元格(<td>)。

给定一个山的数据集,一个包含nameheightplace属性的对象数组,为枚举对象的表格生成 DOM 结构。 每个键应该有一列,每个对象有一行,外加一个顶部带有<th>元素的标题行,列出列名。

编写这个程序,以便通过获取数据中第一个对象的属性名称,从对象自动产生列。

将所得表格添加到id属性为"mountains"的元素,以便它在文档中可见。

当你完成后,将元素的style.textAlign属性设置为right,将包含数值的单元格右对齐。

<h1>Mountains</h1><div id="mountains"></div><script>const MOUNTAINS = [{name: "Kilimanjaro", height: 5895, place: "Tanzania"},{name: "Everest", height: 8848, place: "Nepal"},{name: "Mount Fuji", height: 3776, place: "Japan"},{name: "Vaalserberg", height: 323, place: "Netherlands"},{name: "Denali", height: 6168, place: "United States"},{name: "Popocatepetl", height: 5465, place: "Mexico"},{name: "Mont Blanc", height: 4808, place: "Italy/France"}];// Your code here
</script>

通过标签名获取元素

document.getElementsByTagName方法返回带有特定标签名称的所有子元素。实现该函数,这里注意是函数不是方法。该函数的参数是一个节点和字符串(标签名称),并返回一个数组,该数组包含所有带有特定标签名称的所有后代元素节点。

你可以使用nodeName属性从 DOM 元素中获取标签名称。但这里需要注意,使用tagName获取的标签名称是全大写形式。可以使用字符串的toLowerCasetoUpperCase来解决这个问题。

<h1>Heading with a <span>span</span> element.</h1>
<p>A paragraph with <span>one</span>, <span>two</span>spans.</p><script>function byTagName(node, tagName) {// Your code here.}console.log(byTagName(document.body, "h1").length);// → 1console.log(byTagName(document.body, "span").length);// → 3let para = document.querySelector("p");console.log(byTagName(para, "span").length);// → 2
</script>

猫的帽子

扩展一下之前定义的用来绘制猫的动画函数,让猫和它的帽子沿着椭圆形轨道边(帽子永远在猫的对面)移动。

你也可以尝试让帽子环绕着猫移动,或修改成其他有趣的动画。

为了便于定位多个对象,一个比较好的方法是使用绝对(absolute)定位。这就意味着topleft属性是相对于文档左上角的坐标。你可以简单地在坐标上加上一个固定数字,以避免出现负的坐标,它会使图像移出可见页面。

<style>body { min-height: 200px }</style>
<img src="https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/master/img/cat.png" id="cat" style="position: absolute">
<img src="https://raw.githubusercontent.com/wizardforcel/eloquent-js-3e-zh/master/img/hat.png" id="hat" style="position: absolute"><script>let cat = document.querySelector("#cat");let hat = document.querySelector("#hat");let angle = 0;let lastTime = null;function animate(time) {if (lastTime != null) angle += (time - lastTime) * 0.001;lastTime = time;cat.style.top = (Math.sin(angle) * 40 + 40) + "px";cat.style.left = (Math.cos(angle) * 200 + 230) + "px";// Your extensions here.requestAnimationFrame(animate);}requestAnimationFrame(animate);
</script>
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. Tomcat配置Maven

    1.配置Tomcat用户打开 tomcat 安装目录,进入 conf 文件夹下,找到对应的 tomcat-users.xml 文件; 将文件中所有内容删除,加入以下内容并保存;<?xml version=1.0 encoding=utf-8?> <tomcat-users> <role rolename="manager-gui"/> <role …...

    2024/4/17 18:23:11
  2. VS Code 成主宰、Vue 备受热捧!2019 前端开发趋势必读

    前端在生产和开发中占据着越来越重要的地位,PC 端、手机端、桌面端、智能手表端等等设备都离不开前端的身影。本文将围绕框架、编程语言、工具、React、Vue 等方面,全面回顾 2019 年前端与 Web 开发的大事。作者 | Trey Huffine译者 | 弯月,责编 | 郭芮出品 | CSDN(ID:CSD…...

    2024/4/20 9:06:45
  3. ANSYS SIWave SI仿真

    ANSYS SIwave: Electrothermal Analyses of a PCB - Part Ihttps://www.youtube.com/watch?v=0-7uRuuFwiY&list=PL0lZXwHtV6OlX1zLLASBnXoW6TZ8W5FrJANSYS How To Videos7,710次观看 次观看2016年5月9日发布DescriptionFor more info: http://bit.ly/2erY0iM This ANSYS v…...

    2024/4/25 7:10:14
  4. 优秀的计算机编程类博客和文章整理(github转载)

    介绍优秀的计算机编程类博客是一些关于计算机方面的优秀博客。欢迎大家将经常看的优秀博客或博客文章共享出来,您可以:使用 Issues 以及 Pull Request目录优秀博客 语言无关类 语言相关类 C/C++ CSS/HTML Dart Java JavaScript iOS Android Python Ruby Go 读书笔记及其它 优…...

    2024/4/19 12:39:41
  5. tomcat 配置访问路径 server.xml配置去掉项目名称 .

    转自:http://blog.csdn.net/thunder0709/article/details/8090458一般默认访问路径为 http://localhost:8080/项目名 , 如果要改成: http://localhost/ 直接到项目首页 修改tomcat/conf/server.xml 在<Host/>标签中加入: <Context path="" docBase=&quo…...

    2024/4/18 19:03:17
  6. 上传视频至本地文件夹(文件也可以上传)java代码

    视频上传 Controller:private final static String UPLOADDIR = "/new_resource/video"; //上传文件存放路径 private List<File> file; //上传文件集合 private List<String> fileFileName; //上传文件名集合 private List<String> …...

    2024/4/17 18:21:10
  7. Uni2D 入门

    开始 Uni2D增加了一些新的便利的特性给Unity,它们用于推动你2D工作流程和生产力。最有用的一个特性是sprite的创建:使用Uni2D,你能通过从项目窗口拖动texture来闪电创建sprite或者物理sprite。这个部分将向你展示怎样设置Uni2D以及插件主要特性与原理。什么是sprite? 一个s…...

    2024/4/20 7:10:09
  8. 网游虚拟交易 大学生当跑币人

    “游戏跑币人”是个新职业,专门指在网络游戏中靠各种任务获得游戏中的虚拟钱币,然后卖给其他玩家,赚取现金的人。一个偶然的机会,记者在汉中路上的一家网吧里认识了这样一位“跑币人”,他叫李博,有名牌大学的毕业证,却干着这么一份靠网络游戏跑币的工作……一个多月没下…...

    2024/4/11 19:54:55
  9. 修改tomcat配置实现日志按天输出

    背景:前两天公司一个大佬离职了,所以领导让我接管离职大佬的手下的一个项目,正好此时业务部门反映一个情况,只能通过去看日志是什么问题,结果,我登上服务器看到日志居然有5个G,我尼玛,我楞尼玛,什么鬼,5个G的catalina.out, 当时心里十万个草泥马奔腾,也是无奈,虽然…...

    2024/4/17 18:22:46
  10. Java常见的面试题笔记整理(带网盘视频资料)

    刷题只是捷径,平时需大量学习积累!(百度云,永久)————————————————————————————————————————————————————整理笔试题下载地址:点击打开面试题笔记链接 密码:hiwh视频下载地址: 点击打开链接 密码:vw9c--视频也…...

    2024/4/12 22:02:15
  11. AnsysEM Ansys电磁仿真 二次开发环境搭建

    目录AnsysEM二次开发使用IronPython进行二次开发注意事项Demo与脚本运行 AnsysEM二次开发 AnsysEM 18/19 的API接口为COM接口,因此只要语言支持调用COM接口即可。使用IronPython进行二次开发 IronPython是基于C#的python语言解释器,AnsysEM中有Python的命令行窗口,调试脚本较…...

    2024/4/19 19:56:18
  12. 【《Real-Time Rendering 3rd》 提炼总结】(十) 第十一章 · 非真实感渲染(NPR)相关技术总结

    本文由@浅墨_毛星云 出品,转载请注明出处。 文章链接: http://blog.csdn.net/poem_qianmo/article/details/78574734与传统的追求照片真实感的真实感渲染不同,非真实感渲染(Non-Photorealistic Rendering,NPR)旨在模拟艺术式的绘制风格,常用来对绘画风格和自然媒体(…...

    2024/4/19 2:45:57
  13. 前端开发入门心得

    原文链接:http://tangqiaoboy.blog.163.com/blog/static/1161142582011389042375 从上个月郭老大找我谈转去做前端开发,到现在真正开始和pw一起做前端开发,已经整整有一个月了。 这一个月的前端学习比较仓促。基本上只花了一个多星期看了一下相关的书就开始写了。 还好春节前…...

    2024/4/17 18:22:40
  14. JAVA webRtc的实现视频会议系统

    这里实现的是1对1视频。多人博主也已经实现。我最初期的样式代码。webRtc整体结构是这样的。 发起端(sname) 向服务器发送 offer和icedata 服务器接收到 offer和icedata 向目标端(dname) 发送 (sname)的信息 目标端(dname)接收到发起端(sname)的offer和icedata 将其…...

    2024/4/17 18:23:23
  15. 2018-2019-2 20189201 《网络攻防实践》第二周作业

    任务一、国内外著名的黑客 1、袁仁广 别名:大兔子(datuzi),人称袁哥 提起袁任广,知道的人或许并不多。但如果提起袁哥或者大兔子,在国内安全业界称得上尽人皆知。在国内,他的windows系统方面的造诣可谓首屈一指,早在1999年就曾提出过windows的共享漏洞。而现在袁仁广领衔…...

    2024/4/17 18:22:16
  16. cas + tomcat 配置步骤详细笔记(一)

    首先需要准备资源如下:cas-server-4.0.0-release.zip,cas-client-2.0.11.zip,apache-tomcat-6.0.29下面操作在dos下操作(“开始 -> 运行",输入“cmd”),部署cas服务器端的ssl生成1、生成服务端库文件(您的名字与姓氏是什么?这里需填写你的计算机名,我的计算机…...

    2024/4/19 16:42:59
  17. ADS使用:layout后联合仿真的基本设置

    (1)画出原理图(2)生成版图:点击layout-Generate/update layout;后就生成版图(3)设置EM仿真:EM-Simulation Setup,进入设置界面(4)本例中需要的设置:(①设置铺铜的参数)(②设置介质板材的参数,如果有新的板材可以点击。。。进行编辑添加)(③设置仿真频率范围…...

    2024/4/11 19:54:43
  18. 【《Real-Time Rendering 3rd》 提炼总结】(二) 第二章 · 图形渲染管线 The Graphics Rendering Pipeline

    本文由@浅墨_毛星云 出品,转载请注明出处。 文章链接: http://blog.csdn.net/poem_qianmo/article/details/70544201这篇文章是解析计算机图形学界“九阴真经总纲”一般存在的《Real-Time Rendering 3rd》系列文章的第二篇。将带来RTR3第二章内容“Chapter 2 The Graphics…...

    2024/4/19 20:15:26
  19. 前端混合开发总结

    名称React NativeWeexFlutteruni-app支持FacebookAlibabaGoogleDcloud编写方式需针对iOS、Android编写2份代码(需要会Java,oc)只需要编写一份代码,即可运行在Web、iOS、Android上只需要编写一份代码,即可运行在iOS、Android上vue 框架开发即可编译出安卓 ,ios,H5,小程…...

    2024/4/17 18:23:45
  20. iOS开发牛人博客收集

    现在国内技术博客网站有很多,如CSDN,CNBlog,ITEye等,论坛的话主要是要cocachina。这里是我收集的iOS开发个人独立博客,文章用搜索引擎比较难搜到,都是牛人: M了个J (李明杰) 简介:国内顶尖级ios开发导师OneV‘s Den 简介:一个在日本工作的清华哥哥,写的文章有深…...

    2024/4/18 15:20:56

最新文章

  1. Linux基础 -- 跨平台原子操作:ARM 汇编与 C 语言集成

    1. 汇编语言实现 首先&#xff0c;你需要用 ARM 汇编语言编写比较并交换的功能。这里以 ARMv8 架构为例&#xff0c;因为它直接支持 64 位操作&#xff0c;并且可以较容易地适配 32 位。 // cas.S // 实现 32 位和 64 位的比较并交换函数 .text .global cas32 .global cas64/…...

    2024/5/1 22:33:58
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. JVM学习笔记

    文章目录 一、内存模型1. 程序计数器2. 栈3. 本地方法栈4. 堆5. 方法区方法区位置字符串常量池位置 6. 直接内存 二、虚拟机参数设置三、类的生命周期1. 加载2. 连接1&#xff09;验证2&#xff09;准备3&#xff09;解析 3. 初始化4. 卸载 四、类加载器1. 启动类加载器2. 扩展…...

    2024/5/1 13:33:02
  4. 校园局域网钓鱼实例

    Hello &#xff01; 我是"我是小恒不会java" 本文仅作为针对普通同学眼中的网络安全&#xff0c;设计的钓鱼案例也是怎么简陋怎么来 注&#xff1a;本文不会外传代码&#xff0c;后端已停止使用&#xff0c;仅作为学习使用 基本原理 内网主机扫描DNS劫持前端模拟后端…...

    2024/5/1 14:18:37
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57