gpt4 book ai didi

javascript - 为什么JSDOM改变了html结构?

转载 作者:行者123 更新时间:2023-12-03 02:48:26 24 4
gpt4 key购买 nike

这是代码

var fs = require('fs')
var htmlSource = fs.readFileSync("public/html/index.html", "utf8")
var jsdom = require('jsdom');
const {JSDOM} = jsdom;
const dom = new JSDOM(htmlSource);
htmlSource = dom.window.document.querySelector("html").outerHTML
console.log(htmlSource)
<!-- This is a public/html/index.html -->
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>
<head>
<title>Home Electricity Manager</title>
</head>
<body ng-app="myApp">
<h1 id="the-header">Wellcome to home electricity manager!</h1>
<div add-row ng-controller="myController" style="text-align: center; display: inline-block;">
<span style="white-space:pre;">Button text</span><br/>
<button id="first-button" ng-style="myStyle" ng-click="toggleRelay()" id="switch-cirquit-1">{{ButtonStatus}}</button>
</div>
<div add-row ng-controller="myController" style="text-align: center; display: inline-block;">
<span id="second-button" style="white-space:pre;">{{buttonOneText}}</span><br/>
<button ng-style="myStyle" ng-click="toggleRelay()" id="switch-cirquit-1">{{ButtonStatus}}</button>
</div>
<div ng-controller="postController" style="text-align: center; display: inline-block;">
<button ng-click="post()">{{buttonName}}</button>
</div>
</body>
</html>

<!-- src="js/directives/add-row.js" -->

结果来自 console.log(htmlSource) 行是:

<html><head><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<script type="text/javascript" src="js/main.js"></script>

<title>Home Electricity Manager</title>
</head>
<body ng-app="myApp">
<h1 id="the-header">Wellcome to home electricity manager!</h1>
<div add-row="" ng-controller="myController" style="text-align: center; display: inline-block;">
<span style="white-space:pre;">Button text</span><br>
<button id="first-button" ng-style="myStyle" ng-click="toggleRelay()">{{ButtonStatus}}</button>
</div>
<div add-row="" ng-controller="myController" style="text-align: center; display: inline-block;">
<span id="second-button" style="white-space:pre;">{{buttonOneText}}</span><br>
<button ng-style="myStyle" ng-click="toggleRelay()" id="switch-cirquit-1">{{ButtonStatus}}</button>
</div>
<div ng-controller="postController" style="text-align: center; display: inline-block;">
<button ng-click="post()">{{buttonName}}</button>
</div>



</body></html>

请注意script元素从 <html> 移动 children <head> children 。这是自动发生的。此外,一些新行似乎被添加到新创建的 dom 文件中。请查看两个 html 文件之间的区别。为什么会发生这样的变化?

最佳答案

一般来说,将 HTML 序列化转换为 DOM 树,并序列化生成的树并不能保证最终序列化与原始序列化相同。无论您的 HTML 是否符合规范,都是如此。

但是,在您的具体情况下,您的 HTML 不符合标准指定的结构。当符合标准的解析器遇到不符合标准的 HTML 时,它必须遵循一系列步骤来解决问题。这实际上是一种动态理解不合格 HTML 的尝试。在您的情况下,顺序是这样的:

  1. initial开始解析模式,
  2. 移至before html遇到DOCTYPE时的模式.
  3. 移至before head遇到<html>时的模式.
  4. 插入 head元素并移动到 in head当遇到script时.

上面列举的最后一步是浏览器修改文档结构以使其符合要求。如果您检查rules在规范中,您会看到遇到 script元素位于 before head 中mode 匹配“任何其他”规则,这会导致附加 head元素到 DOM 树并移动到 in head模式。 script然后在 in head 中重新处理元素模式并刚刚添加到新创建的 head 中元素。

当解析器遇到<head>时您放入 HTML 文件中的标签,该标签将被忽略,因为解析器已经在 in head 中模式,由于较早的script元素。

<小时/>

您获得的间距是通过应用规范中的规则而获得的。指出一些突出的案例:

  1. <head> 之前没有换行符因为 before head 中的任何空格模式被忽略。
  2. <head> 之后没有换行符要么因为解析器创建 head 时元素来修复您的 HTML,它没有插入换行符。 (这只是不属于规则的一部分。)
  3. 您之前看到的空行 <title>序列化中由 <head> 之前和之后出现的换行符组成在您的原始 HTML 中。解析器忽略了您的 <head>标签(如上所述),但它保留了它周围的间距。

关于javascript - 为什么JSDOM改变了html结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47997807/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com