DOM节点属性错误

jsdom是一个纯粹由 javascript 实现的一系列 web标准,特别是 WHATWG 组织制定的和 标准,用于在 nodejs 中使用。大致上来讲,该项目的目标是模拟足够的Web浏览器子集,以便用于测试和挖掘真实世界的Web应用程序。javascript

  • url 设置的值能够经过",jsdom会自动规范化解释为"/");这样作会致使虚拟控制台发出"jsdomError",说明此功能未实现,而且没有任何变化,也将不会有新的WindowDocument对象,而且现有/"

    若是URL有效且请求成功,则onFullfilled回调执行并返回JSDOM实例。任何URL重定向都将遵循其最终目的地。

    fromURL()提供的参数选项与提供给JSDOM构造函数的选项相似,但具备如下额外的限制和后果:

初始的请求并不能无限定制到像 npm 包同样的程度;fromURL()旨在为大多数状况提供便利的API。若是您须要更好地控制初始请求,您应该本身执行它,而后手动使用JSDOM构造函数。

若是能够打开给定的文件,则onFullfilled回调执行并返回JSDOM实例。和Node.js API同样,文件名是相对于当前工做目录的。

fromFile()提供的选项与提供给JSDOM构造函数的选项类似,但具备如下额外的默认值:

  • url选项将默认为给定文件名相对应的文件URL,而不是"about:blank"

对于最简单的状况,你可能不须要一个完整的JSDOM实例及其全部相关的功能。您甚至可能不须要WindowDocument!相反,你只须要解析一些HTML片断,并得到一个你能够操做的DOM对象。为此,咱们提供了fragment(),它能够从给定的字符串中建立一个DocumentFragment

fragDocumentFragment的实例对象,其内容是经过提供的字符串解析建立的。解析是经过使用<template>元素完成的,所以您能够在其中包含任何元素(包括具备奇怪解析规则的元素,如<td>)。

请注意,对DocumentFragments的序列化并不像使用JSDOM对象那样容易。若是你须要序列化你的DOM,你应该直接使用JSDOM构造函数。但对于包含单个元素的片断的特殊状况,经过常规方法就很容易作到。

jsdom支持使用或包来扩展任何使用canvas API的<canvas>元素。为了作到这一点,您须要将canvas做为依赖项加入到您的项目中,和

请注意,在许多状况下,提供字节这种方式可能比提供字符串更好。例如,若是您试图使用Node.js的buffer.toString('utf-8')API,则Node.js将不会去除任何前导BOM。若是您将此字符串提供给jsdom,它会逐字解释,从而使BOM保持不变。但jsdom的二进制数据解码代码将剥离前导的BOM,就像浏览器同样;在这种状况下,直接提供buffer将会获得想要的结果。

jsdom中定义的定时器(经过window.setTimeoutwindow.setInterval设置)将在window上下文中执行代码。因为进程在不活跃的状况下没法执行将来的定时器代码,因此卓越的jsdom定时器将保持您的Node.js进程处于活动状态。一样,对象不活跃的状况下也没有办法在对象的上下文中执行代码,卓越的jsdom定时器将阻止垃圾回收调度它们的window。

若是你想确保关闭jsdom窗口,使用window.close(),它将终止全部正在运行的定时器(而且还会删除 windowdocument上的任何事件监听器)。

使用模块,jsdom某些方面也支持在Web浏览器中运行。也就是说,在Web浏览器中,您可使用被browserify模块编译过的jsdom去建立彻底独立的普通JavaScript对象集,其外观和行为与浏览器的现有DOM对象很是类似,但彻底独立于它们,也就是"虚拟DOM"!

jsdom的主要目标对象仍然是Node.js,所以咱们使用仅存在于最新Node.js版本(即Node.js v6 +)中的语言特性功能。所以,在旧版浏览器可能没法正常工做。(即便编译也不会有多大帮助:咱们计划在jsdom v10.x的整个过程当中普遍使用Proxy。)

值得注意的是,jsdom在web worker中能很好的运行。项目的开发者使这一功能点成为可能,他发表了一篇关于他的,该论文就使用了这种能力。

在Web浏览器中运行jsdom时,并不是全部的工做都完美。有些状况下,这是因为基础的条件限制(好比没有文件系统访问),但有些状况下也是由于咱们没有花足够的时间去进行适当的小调整。欢迎你们来提BUG。

默认状况下,jsdom元素在控制台中被格式化为普通的旧JS对象。为了便于调试,可使用,它可让你像真正的DOM元素同样调试它们。

使用jsdom时,开发者在加载异步脚本时常常遇到麻烦。许多页面异步加载脚本,但没法分辨脚本何时完成,所以没法知道什么时候是运行代码并检查生成的DOM结构的好时机。这是一个基本的限制;咱们没法预测网页上的哪些脚本会作什么,所以没法告诉您脚本什么时候加载完毕。

这个问题能够经过几种方法来解决。若是您能控制页面逻辑,最好的方法是使用脚本加载器提供的机制来检测什么时候加载完成。例如,若是您使用像RequireJS这样的模块加载器,代码可能以下所示:

若是您不能控制该页面,则能够尝试其余解决方法,例如轮询检查特定元素是否存在。有关更多详细信息,请查看中的讨论,尤为是的。

目前,对于大多数Web平台API,jsdom在多个看似独立的jsdoms之间共享相同的类定义。这将意味着,可能会出现如下状况

这主要是出于性能和内存的缘由:若是在Web平台上每次建立jsdom时,建立全部类的单独副本,开销将会至关昂贵。

尽管如此,咱们仍然有兴趣在有一天提供一个选项配置来建立一个“独立”的jsdom,但要牺牲一些性能。

API相比,新API显然缺乏对资源加载的精细控制。先前版本的jsdom容许您设置request时使用的选项(既能够用于初始请求,也能够用于旧版本的JSDOM.fromURL()和子资源请求)。他们还容许您控制请求哪些子资源并将其应用于主文档,以便您能够下载样式表,但不下载脚本文件。最后,他们提供了一个可定制的资源加载器,能够拦截任何传出的请求并用彻底合成的response

以上这些功能还没有在新的jsdom API中实现,尽管咱们也但愿尽快将它们添加回来,但不幸的是,这须要至关大的幕后工做去实施。

同时,请随时使用旧的jsdom API来访问此功能。它一直处于支持和维护中,但它不会得到新功能。旧的文档位于中。

未实现的Web平台部分

目前jsdom中有不少缺失的API,尽管咱们也想要在jsdom中添加新的功能并保持最新的Web规范。请随时为缺失的任何内容提交issue,但咱们是一个很小而且忙碌的团队,所以你们一块儿来提交 pull request可能会更好。

除了咱们还没有拥有的功能以外,还有两个主要功能目前超出了jsdom的范围。这些是:

  • Navigation:在点击连接或赋值location.href或相似操做时能够更改全局对象和全部其余的对象。

目前,jsdom对某些功能的某些方面具备虚拟行为,例如操做navigation 时向虚拟控制台发送“未实现的”"jsdomError",或者为许多与布局相关的属性返回0。您一般能够在代码中解决这些限制,例如经过在爬网过程当中为每一个页面建立新的JSDOM实例,或使用Object.defineProperty更改各类与布局相关的getter和方法的返回值

请注意,相同领域中的其余工具(如PhantomJS)确实支持这些功能。在wiki上,咱们有关于的更完整的比较介绍。

若是您须要jsdom的帮助,请随时使用如下任何方式:

以上文档翻译自开源项目 jsdom,若有翻译错误,欢迎指正。

  • 加载 HTML 页面时, Web浏览器生成一个树型结构,用来表示页面内部结构。DOM 将这种树型结构理解为由节点组成的DOM树
  • DOM规定了一系列标准接口,允许开发人员通过标准方式访问文档结构、操作网页内容、控制样式和行为等
  • 在DOM中,接口可以理解为就是函数(函数 方法 API 接口 本质上都是一个函数)
  • Document 对象是是window对象的一个属性,因此可以将document对象作为一个全局对象来访问。当浏览器载入 html文档, 它就会成为 Document 对象
// 当不写第三个参数的时候,_blank是打开一个新的标签页
  • history对象存储了客户端浏览器的浏览历史,通过window对象的history属性可以访问该对象

我要回帖

更多关于 以下关于jquery说法错误的是 的文章

 

随机推荐