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,若有翻译错误,欢迎指正。

在网页中所有对象和内容都被称为节点,如文档、元素、文本、属性、注释等。节点(Node)是 DOM 最基本的单元,并派生出不同类型的节点,它们共同构成了文档的树形结构模型。

根据 DOM 规范,整个文档是一个文档节点,每个标签是一个元素节点,元素包含的文本是文本节点,元素的属性是一个属性节点,注释属于注释节点,以此类推。

DOM 支持的节点类型说明如表所示。

表示整个文档,DOM 树的根节点
表示文档片段,轻量级的 Document 对象,仅包含部分文档
稳文档定义的实体提供接口
表示元素或属性中的文本内容
表示文档中的 CDATA 区段,其包含的文本不会被解析器解析
表示在 DTD 中声明的符号

使用 nodeType 属性可以判断一个节点的类型,取值说明如表所示。

下面示例演示如何借助节点 nodeType 属性检索当前文档中包含元素的个数。

 


在上面的 Script 脚本中定义一个计数函数,然后通过递归调用的方式逐层检索 document 下所包含的全部节点,在计数函数中再通过 node.nodeType == 1 过滤掉非元素节点,进而统计文档中包含的全部元素个数。
 
使用 nodeName 和 nodeValue 属性可以读取节点的名称和值。属性取值说明如表所示。
元素的名称(或标签名称)

通过上表可以看到,不同类型的节点,nodeName 和 nodeValue 属性取值不同。元素的 nodeName 属性返回值是标签名,而元素的 nodeValue 属性返回值为 null。因此在读取属性之前,应该先检测类型。

 
nodeName 属性在处理标签时比较实用,而 nodeValue 属性在处理文本信息时比较实用。
 
DOM 把文档视为一棵树形结构,也称为节点数。节点之间的关系包括:上下父子关系、相邻兄弟关系。简单描述如下:
  • 在节点树中,最顶端节点为根节点。
  • 除了根节点之外,每个节点都有一个父节点。
  • 节点可以包含任何数量的子节点。
  • 叶子时没有子节点的节点。
  • 同级节点是拥有相同父节点的节点。
 
 
针对下面这个 HTML 文档结构。
 
在上面的 HTML 结构中,首先是 DOCTYPE 文档类型声明,然后是 html 元素,网页里所有元素都包含在这个元素里。从文档结构看,html 元素既没有父辈,也没有兄弟。如果用树来表示,这个 html 元素就是树根,代表整个文档。由 html 元素派生出 head 和 body 两个子元素,它们属于同一级别,且互不包含,可以称之为兄弟关系。head 和 body 元素拥有共同的父元素 html,同时它们又是其他元素的父元素,担保函的子元素不同。head 元素包含 title 元素,title 元素又包含文本节点“标准 DOM 示例”。body 元素包含 3 个子元素:h1、p 和 ul,它们是兄弟关系。如果继续访问,ul 元素也是一个父元素,它包含 3 个 li 子元素。整个文档如果使用树形结构表示,如下图所示。使用树形结构可以很直观的把文档结构中各个元素之间的关系表现出来。
 
  • parentNode:返回当前节点的父节点,所有的节点都仅有一个父节点。
  • childNodes:返回当前节点的所有子节点的节点列表。
  • firstChild:返回当前节点的第一个子节点。
  • lastChild:返回当前节点的最后一个子节点。
  • nextSibling:返回当前节点之后相邻的同级节点。
  • previousSibling:返回当前节点之前相邻的同级节点。
 
 
childNodes 返回所有子节点的列表,它是一个随时可变的类数组。
 
下面示例演示了如何访问 childNodes 中的节点。
 
使用中括号语法或者 item() 方法都可以访问 childNodes 包含的子元素。childNodes 的 length 属性可以动态返回子节点的个数,如果列表项目发生变化,length 属性值也会随之变化。
 
childNodes 是一个类数组,不能直接使用数组的方法,但是可以通过动态调用数组的方法把它转换为数组。下面示例把 childNodes 转换为数组,然后调用数组的 reverse() 方法颠倒数组中元素的顺序。
 


文本节点和属性节点都不包含任何子节点,所以它们的 childNodes 属性返回值是一个空集合。可以使用 haschildNodes() 方法或者 childNodes.length>0了来判断一个节点是否包含子节点。
 
 

 
nextSibling 返回下一个相邻节点,previousSibling 返回上一个相邻节点。如果没有同属一个父节点的相邻节点,则返回 null。
 
 
 
可以使用下面方法访问 body 元素。
 
通过下面方法可以访问 span 包含的文本。
 
 
操作节点的基本方法如表所示。
Node 类型原型方法说明
向节点的子节点列表的结尾添加新的子节点
判断当前节点是否拥有子节点
在指定的子节点前插入新的子节点
合并相邻的 Text 节点并删除空的 Text 节点
删除(并返回)当前节点的指定子节点
用新节点替换一个子节点

appendChild()、insertBefore()、removeChild()、replaceChild() 四个方法用于对子节点进行操作。使用这四个方法之前,可以使用 parentNode 属性先获取父节点。另外,并不是所有类型的节点都有子节点,如果在不支持子节点的节点上调用了这些方法将会导致错误发生。

下面示例为列表框绑定一个 click 事件处理程序,通过深度克隆,新的列表框没有添加 JavaScript 事件,仅克隆了 HTML 类样式和 style 属性。

 

【 前端开发日报】再也不学AJAX了(三)跨域获取资源 ② – JSONP & CORS;JavaScript 权威面试指南; 前端开发日报;听说你用JavaScript写代码?本文是你的机器学习指南;卷两根Weeds,搞懂Promise;一步一步将支付宝...详情→

【Bootstrap响应式布局瀑布流】bootstrap响应式瀑布流布局,bootstrap标签选项卡流式布局,Bootstrap是当下比较热门的web前端开发框架之一,通过引入Bootstrap,你可以很快的给你的项目做一个自适应的页面。 #前端开发博客#

【HTML5 video视频兼容实践】我们都知道HTML5 video标签是现在比较流行的播放器,几乎很多高级的浏览器如chrome、firefox和Safari都支持HTML5 video标签,但是仍然有一部分老的浏览器不支持,特别是IE9以下的浏览器,这样子你需要提...详情→ #前端开发博客#

【rem自适应布局-移动端自适应必备:flexible.js】本文通过使用一个开源代码flexible.js,结合rem的特性,1rem等于根元素html的字号,来解决移动端多种设备的自适应问题。通过rem与px的换算,你可以把设计稿从px转到rem。再也不用为各...详情→ #前端开发博客#

【详解响应式布局设计】响应式布局等于流动网格布局,而自适应布局等于使用固定分割点来进行布局。自适应布局给了你更多设计的空间,因为你只用考虑几种不同的状态。而在响应式布局中你却得考虑上百种不同的状态。

【CSS3弹性盒模型flexbox布局基础版】最近看了社区上的一些关于flexbox的很多文章,感觉都没有我这篇文章实在,最重要的兼容性问题好多人都没有提出解决方案。另外本人还废寝忘食的翻译了国外的《CSS3弹性盒模型flexbox完整教程》和...详情→ #前端开发博客#

前端开发周报】css实现图片背景填充的正六边形;网页适配 iPhoneX,就是这么简单;如何用 CSS 修出好看的照片;JS中动态添加元素并绑定事件,造成程序重复执行;前端重构之路(组件化);如何使用ES6箭头函数使JavaScript代码更易读...详情→

【 前端开发日报】掌握JS中this指向只需记忆5大原则;JavaScript 如何工作的: 事件循环和异步编程的崛起 + 5 个关于如何使用 async/await 编写更好的技巧;React 整洁代码最佳实践;Web 性能优化 – TCP; 前端开发日报;V...详情→

【弹窗Modal实现和有滚动条偏移解决方法】弹窗也叫modal(模态)在网页设计中是一个常见的功能。实现方法也不会太复杂,可以通过css实现居中(bootstrap的modal是使用靠上边距来实现),然后JS控制点击显示和消失。在弹窗中也许你会...详情→ #前端开发博客#

【 前端开发日报】SegmentFault 技术周刊 Vol.38 – 神奇的 CSS;前端工程师的 CI 进阶之路;【JavaScript从入门到精通】第十九课;7 款前端开发者重制的经典游戏 总有一款能让你回味童年时光;CSS自适应导航菜单;JavaScript学习...详情→

【CSS 实用 Tips】  作为前端,日常开发充满了各种挑战与乐趣,我们穷尽一切在奇葩的需求中提升用户体验。本文将列举一些前端开发中碰到的小众需求,并提供解决方案以供参考。 一、修改鼠标手势图标 很多童鞋可能都用

【CSS3 pointer-events允许鼠标点击穿透后面的元素】CSS新属性pointer-events:字面理解是点击鼠标事件,值分别是auto和none。当使用pointer-events:none,表示它将捕获不到任何点击,而只是让事件穿透到它的下面。代码如下:<styl...详情→ #前端开发博客#

【 前端开发日报】如何用 CSS 修出好看的照片;开发更好用的 JavaScript 模块;你还要我怎样的JS系列(4) — 作用域链;HTTPS的协议需求与密钥交换过程;自己动手做一个识别手写数字的 Web 应用(四);Typescript 构建命令行工具...详情→

【GET和POST的区别】1. GET是从服务器上获取数据,POST是向服务器传送数据。2. GET是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段...详情→ #前端开发博客#

【CSS自适应导航菜单】本文教程旨在教你如何创建一个使用HTML5+CSS的自适应导航菜单,它不需要用到javascript,而且可以居左,居中和居右,这个菜单不是通过点击显示的,它是鼠标滑过的时候显示出来的,并且兼容各种浏览器包括手机客...详情→ #前端开发博客#

【 前端开发日报】分享7款个性化jQuery/HTML5地图插件;2017 年前端开发者必学清单;前端重构之路(组件化);now.js 0.1.0 发布了;JavaScript优化模式;关于JavaScript对象,你所不知道的事(二)- 再说属性;Vue实现一个页面缓存、左...详情→

【纯CSS3制作TAB选项卡的两种方式】css tab,纯CSS3制作tab,不用JavaScript就可以制作选项卡是不是很神奇,而且效果跟不适用jQuery是一个样的,本站独创的CSS3 Tab绝对让你眼前一亮。 #前端开发博客#

【手机端页面自适应解决方案—rem布局】原文:手机端页面自适应解决方案—rem布局相信很多刚开始写移动端页面的同学都要面对页面自适应的问题,当然解决方案很多,比如:百分比布局,弹性布局flex(什么是flex),也都能获得不错的效果...详情→ #前端开发博客#

【 前端开发日报】前端开发人员如何搭建数据库;一步步打造自己的纯CSS单标签图标库;React Diff 算法 – 众成翻译;关于JavaScript对象,你所不知道的事(一)- 先谈对象;vue中慎用style的scoped属性;JavaScript 正则表达式笔记...详情→

【jQuery中的show是inline还是inline-block?】jQuery里面的show是inline或者block取决于你的css代码里面怎么写,如果没有写 相关属性,则是按照CSS默认内联和块级元素。同样,如果设置为不可见,则也是按照CSS默认内联或者块级元素...详情→ #前端开发博客#

【Vue与React两个框架的区别和优势对比】Vue和React两个JavaScript框架都是当下比较受欢迎的,他们两者之间的区别有哪些,各自的优缺点是什么,本文将为你呈现。 #前端开发博客#

【 前端开发日报】如何使用ES6箭头函数使JavaScript代码更易读;css实现图片背景填充的正六边形;一个行为标准Popup组件(vue), 强大的过度动画支持, 和定位支持;10个有趣的Javascript和CSS库-2017年11月; 前端开发日报;JS中...详情→

【jquery圆环百分比进度条制作】最近项目里遇到一个有意思的效果,那就是圆形进度条,类似于这样的:demo1demo2实现类似这样的效果方法很多。我主要想了2个解决方案,都是通过jQuery和CSS实现的,下面就一一道来:方法一:jQuery + C...详情→ #前端开发博客#

【CSS自适应布局等分比例实践】CSS等比例划分,在CSS布局中是比较重要的,下面分享几种常用方法和探讨一下兼容性。一:浮动布局+百分比emmet html代码:ul.float-ul>li*5>.con>h3{等分标题}+p{等分内容等分内容}.float-ul{w...详情→ #前端开发博客#

【 前端开发日报】js中的正则表达式(1);iOS开发者的大前端感悟:向前端说对不起;GitHub 上 82% 的代码是重复代码;使用 ClojureScript 开发浏览器插件的过程与收获;Node.js 应用的可视化调试与性能分析;用 Jest 测试 JavaScript 应...详情→

【Swipe-移动前端端触摸滑动插件swipe.js】swipe.js是一个比较有名的前端触摸滑动插件,它能够处理内容滑动,支持自定义选项,你可以让它自动滚动,控制滚动间隔,返回回调函数等。经常可见使用在移动前端开发中。 #前端开发博客#

【 前端开发日报】一次 H5 「保存页面为图片」 的踩坑之旅;纯 CSS 实现波浪效果;前端本地文件操作与上传;函数声明、函数表达式、匿名函数、立即执行函数详解;Chromium 新的弹窗机制以及 HTML 的 dialog 元素;RxJS 5 中文文档;CSS ...详情→

【一个普通本科在校生的前端学习之路】本文从如何选择前端方向、学习前端的历程,学习的资源、需要掌握的基础知识,到最后写简历以及找工作,和心态准备多方面给大家分享作者的前端学习之路,值得看看。 #前端开发博客#

【美化表单的CSS高级技巧】  学习一些新的和旧的选择器,你可以根据需求、有效性和更多的方式来美化表单。 表单一直以来对于CSSer来说都是一件不易的事情,很难用CSS处理好表单要样式。但是有一些很少使用的选择器,

【Bootstrap Modal遮罩弹出层】之前发表过一篇文章叫Bootstrap Modal弹窗代码,其实那个只是一个弹窗代码而已,并不是仿造Bootstrap的,Bootstrap Modal是给外层添加固定fixed,然后内容使用自适应靠上居中方式。今天分享的这篇文章...详情→ #前端开发博客#

【原生js的常用方法】  前言:随着前端市场日新月异的发展,现如今的市场要的不只是会切切图的小仔、小妹了,而是需要真正懂原生js闭包,继承,原型链,node,以及熟读源码的大神,那么我们也不能太落后各位大神,撸起袖

【 前端开发日报】美化表单的CSS高级技巧;如何优雅的编写 JavaScript 代码;CSS3 径向渐变语法及辅助理解案例 10 则;前端防御从入门到弃坑:CSP 变迁;CSS3 radial-gradient径向渐变语法及辅助理解案例10则;JSON: 不要误会,我真的不...详情→

【WEB 前端菜鸟,感觉很迷茫,该怎么做?】  前几天看到这样的问题 先说问题吧:感觉前端涉及到的东西太多了,自己也很浮躁,看了挺多书,可是代码缺敲得却不多。技术菜,又什么都想学,比如现在纠结要不要先学scss或者

前端开发周报】生产环境中选择性的部署ES6+;基于 HTML5 Canvas 实现地铁站监控;这一次,彻底弄懂 JavaScript 执行机制;CSS 在线交互式速查表;WEB 前端菜鸟,感觉很迷茫,该怎么做?;不使用 JS 匿名函数的三个理由;探究 CSS 解...详情→

【纯CSS3多列的瀑布流布局演示】网上的瀑布流布局大部分都是通过JS来求定位,但现在CSS3也可以做到了,你不需要使用一点JS,就可以做出一个反应快速的CSS3瀑布流布局。html代码:<div class="container"><div class="waterf...详情→ #前端开发博客#

我要回帖

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

 

随机推荐