<h1 align="center">
<img width="100" height="100" src="logo.svg" alt=""><br>
jsdom
</h1>
jsdom is a pure-JavaScript implementation of many web standards, notably the WHATWG [DOM](https://dom.spec.whatwg.org/) and [HTML](https://html.spec.whatwg.org/multipage/) Standards, for use with Node.js. In general, the goal of the project is to emulate enough of a subset of a web browser to be useful for testing and scraping real-world web applications.
The latest versions of jsdom require Node.js v12 or newer. (Versions of jsdom below v17 still work with previous Node.js versions, but are unsupported.)
## Basic usage
```js
const jsdom = require("jsdom");
const { JSDOM } = jsdom;
```
To use jsdom, you will primarily use the `JSDOM` constructor, which is a named export of the jsdom main module. Pass the constructor a string. You will get back a `JSDOM` object, which has a number of useful properties, notably `window`:
```js
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
console.log(dom.window.document.querySelector("p").textContent); // "Hello world"
```
(Note that jsdom will parse the HTML you pass it just like a browser does, including implied `<html>`, `<head>`, and `<body>` tags.)
The resulting object is an instance of the `JSDOM` class, which contains a number of useful properties and methods besides `window`. In general, it can be used to act on the jsdom from the "outside," doing things that are not possible with the normal DOM APIs. For simple cases, where you don't need any of this functionality, we recommend a coding pattern like
```js
const { window } = new JSDOM(`...`);
// or even
const { document } = (new JSDOM(`...`)).window;
```
Full documentation on everything you can do with the `JSDOM` class is below, in the section "`JSDOM` Object API".
## Customizing jsdom
The `JSDOM` constructor accepts a second parameter which can be used to customize your jsdom in the following ways.
### Simple options
```js
const dom = new JSDOM(``, {
url: "https://example.org/",
referrer: "https://example.com/",
contentType: "text/html",
includeNodeLocations: true,
storageQuota: 10000000
});
```
- `url` sets the value returned by `window.location`, `document.URL`, and `document.documentURI`, and affects things like resolution of relative URLs within the document and the same-origin restrictions and referrer used while fetching subresources. It defaults to `"about:blank"`.
- `referrer` just affects the value read from `document.referrer`. It defaults to no referrer (which reflects as the empty string).
- `contentType` affects the value read from `document.contentType`, as well as how the document is parsed: as HTML or as XML. Values that are not a [HTML mime type](https://mimesniff.spec.whatwg.org/#html-mime-type) or an [XML mime type](https://mimesniff.spec.whatwg.org/#xml-mime-type) will throw. It defaults to `"text/html"`. If a `charset` parameter is present, it can affect [binary data processing](#encoding-sniffing).
- `includeNodeLocations` preserves the location info produced by the HTML parser, allowing you to retrieve it with the `nodeLocation()` method (described below). It also ensures that line numbers reported in exception stack traces for code running inside `<script>` elements are correct. It defaults to `false` to give the best performance, and cannot be used with an XML content type since our XML parser does not support location info.
- `storageQuota` is the maximum size in code units for the separate storage areas used by `localStorage` and `sessionStorage`. Attempts to store data larger than this limit will cause a `DOMException` to be thrown. By default, it is set to 5,000,000 code units per origin, as inspired by the HTML specification.
Note that both `url` and `referrer` are canonicalized before they're used, so e.g. if you pass in `"https:example.com"`, jsdom will interpret that as if you had given `"https://example.com/"`. If you pass an unparseable URL, the call will throw. (URLs are parsed and serialized according to the [URL Standard](https://url.spec.whatwg.org/).)
### Executing scripts
jsdom's most powerful ability is that it can execute scripts inside the jsdom. These scripts can modify the content of the page and access all the web platform APIs jsdom implements.
However, this is also highly dangerous when dealing with untrusted content. The jsdom sandbox is not foolproof, and code running inside the DOM's `<script>`s can, if it tries hard enough, get access to the Node.js environment, and thus to your machine. As such, the ability to execute scripts embedded in the HTML is disabled by default:
```js
const dom = new JSDOM(`<body>
<script>document.body.appendChild(document.createElement("hr"));</script>
</body>`);
// The script will not be executed, by default:
dom.window.document.body.children.length === 1;
```
To enable executing scripts inside the page, you can use the `runScripts: "dangerously"` option:
```js
const dom = new JSDOM(`<body>
<script>document.body.appendChild(document.createElement("hr"));</script>
</body>`, { runScripts: "dangerously" });
// The script will be executed and modify the DOM:
dom.window.document.body.children.length === 2;
```
Again we emphasize to only use this when feeding jsdom code you know is safe. If you use it on arbitrary user-supplied code, or code from the Internet, you are effectively running untrusted Node.js code, and your machine could be compromised.
If you want to execute _external_ scripts, included via `<script src="">`, you'll also need to ensure that they load them. To do this, add the option `resources: "usable"` [as described below](#loading-subresources). (You'll likely also want to set the `url` option, for the reasons discussed there.)
Event handler attributes, like `<div onclick="">`, are also governed by this setting; they will not function unless `runScripts` is set to `"dangerously"`. (However, event handler _properties_, like `div.onclick = ...`, will function regardless of `runScripts`.)
If you are simply trying to execute script "from the outside", instead of letting `<script>` elements and event handlers attributes run "from the inside", you can use the `runScripts: "outside-only"` option, which enables fresh copies of all the JavaScript spec-provided globals to be installed on `window`. This includes things like `window.Array`, `window.Promise`, etc. It also, notably, includes `window.eval`, which allows running scripts, but with the jsdom `window` as the global:
```js
const { window } = new JSDOM(``, { runScripts: "outside-only" });
window.eval(`document.body.innerHTML = "<p>Hello, world!</p>";`);
window.document.body.children.length === 1;
```
This is turned off by default for performance reasons, but is safe to enable.
(Note that in the default configuration, without setting `runScripts`, the values of `window.Array`, `window.eval`, etc. will be the same as those provided by the outer Node.js environment. That is, `window.eval === eval` will hold, so `window.eval` will not run scripts in a useful way.)
We strongly advise against trying to "execute scripts" by mashing together the jsdom and Node global environments (e.g. by doing `global.window = dom.window`), and then executing scripts or test code inside the Node global environment. Instead, you should treat jsdom like you would a browser, and run all scripts and tests that need access to a DOM inside the jsdom environment, using `window.eval` or `runScripts: "dangerously"`. This might require, for example, creating a browserify bundle to execute as a `<script>` element—just like you would in a browser.
Finally, for advanced use cases you can use the `dom.getInternalVMContext()` method, documented below.
### Pretending to be a visual browser
jsdom does not have the capability to render visual content, and will act like a headless browser by default. It provides hints to web pages through APIs such as `document.hidden` that their content is not visible.
没有合适的资源?快使用搜索试试~ 我知道了~
知乎x-zse-96.zip
共1106个文件
js:821个
md:77个
json:76个
需积分: 5 17 下载量 164 浏览量
2021-11-09
09:44:51
上传
评论
收藏 2.49MB ZIP 举报
温馨提示
除js外附带抓取源码、环境配置教程(小白开箱即用)
资源推荐
资源详情
资源评论
收起资源包目录
知乎x-zse-96.zip (1106个子文件)
acorn 62B
acorn 62B
acorn 18B
acorn 18B
README.md.bak 12KB
LICENSE.BSD 1KB
LICENSE.BSD 1KB
LICENSE.BSD 1KB
LICENSE.BSD 1KB
ChangeLog 10KB
.DS_Store 6KB
escodegen 29B
esgenerate 30B
esparse 25B
esvalidate 28B
iconv-lite.iml 458B
esprima.js 277KB
source-map.debug.js 266KB
acorn.js 210KB
acorn.js 195KB
psl.js 149KB
decimal.js 133KB
psl.min.js 125KB
Document.js 115KB
source-map.js 104KB
escodegen.js 94KB
index.js 91KB
index.js 78KB
HTMLElement.js 78KB
saxes.js 73KB
named-entity-data.js 72KB
xpath.js 69KB
SVGElement.js 68KB
regexes.js 65KB
nwsapi.js 65KB
HTMLInputElement.js 59KB
Element.js 57KB
properties.js 56KB
cookie.js 46KB
source-map-consumer.js 40KB
HTMLTextAreaElement.js 38KB
HTMLInputElement-impl.js 36KB
Node-impl.js 34KB
HTMLAnchorElement.js 32KB
XMLHttpRequest-impl.js 32KB
HTMLSelectElement.js 31KB
sbcs-data-generated.js 31KB
url-state-machine.js 30KB
HTMLObjectElement.js 30KB
code.js 29KB
websocket.js 29KB
SymbolTree.js 29KB
Window.js 29KB
HTMLMediaElement.js 28KB
Document-impl.js 28KB
HTMLBodyElement.js 28KB
HTMLImageElement.js 28KB
source-map.min.js 26KB
estraverse.js 26KB
Range-impl.js 26KB
Node.js 26KB
HTMLTableElement.js 25KB
HTMLAreaElement.js 25KB
SVGSVGElement.js 23KB
HTMLFrameSetElement.js 23KB
dbcs-codec.js 23KB
HTMLTableCellElement.js 22KB
Range.js 22KB
HTMLIFrameElement.js 22KB
CSSStyleDeclaration.test.js 21KB
XMLHttpRequest.js 21KB
parsers.js 19KB
Selection.js 18KB
index.js 18KB
HTMLMarqueeElement.js 18KB
DOMTokenList.js 17KB
HTMLLinkElement.js 17KB
NamedNodeMap.js 17KB
HTMLButtonElement.js 17KB
Element-impl.js 16KB
HTMLOptionsCollection.js 16KB
SVGStringList.js 16KB
HTMLFrameElement.js 16KB
URLSearchParams.js 16KB
HTMLFormElement.js 16KB
walk.js 16KB
tests.js 15KB
FormData.js 15KB
CharacterData.js 15KB
MouseEvent.js 15KB
WebSocket.js 15KB
List.js 15KB
HTMLScriptElement.js 15KB
FileReader.js 14KB
default-stylesheet.js 14KB
receiver.js 14KB
source-map-generator.js 14KB
permessage-deflate.js 14KB
Headers.js 14KB
xhr-utils.js 14KB
共 1106 条
- 1
- 2
- 3
- 4
- 5
- 6
- 12
资源评论
别None了
- 粉丝: 593
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功