NodeJS使用jQuery选择器操作DOM


Posted in NodeJs onFebruary 13, 2015

注* 这是一个两年多的“老”项目,可以让你在NodeJS中使用jQuery的选择器,像操作前端DOM一样操作后端的HTML/XML,在去除浏览器兼容相关代码后,比JSDOM的操作快8倍. 之前我们曾经提到JSDOM有严重的性能问题:   Debug调试Node.JS:我们是如何定位内存泄漏和无限循环的

cheerio

快速,灵活,在服务器端使用的jQuery。

简介

测试你的服务器端HTML:

var cheerio = require('cheerio'),

$ = cheerio.load('<h2 class="title">Hello world</h2>');

$('h2.title').text('Hello there!');

$('h2').addClass('welcome');

$.html();

//=> <h2 class="title welcome">Hello there!</h2>

安装

npm install cheerio

功能

❤熟悉的语法:Cheerio实现了jQuery核心的一个子集。Cheerio 从jQuery库中删除了所有的DOM不一致和浏览器兼容支持,呈现其真正华丽的API。

ϟ极快:Cheerio 使用一个非常简单的,一致的DOM模型。这样解析,操作和呈现就会带来令人难以置信的性能提升。初步的端至端的基准测试表明Cheerio比JSDOM快大概8倍。

❁令人难以置信的灵活性:兼容htmlparser2API。Cheerio可以解析几乎所有的HTML或XML文档。

JSDOM怎么样?

我写Cheerio,因为我对JSOM越来越感到失望。对于我来说,有我一次又一次的碰到三大症结:

•JSDOM内置的解析器是太过严格:JSDOM捆绑的HTML解析器现在不能处理很多流行的网站。

•JSDOM太慢:解析大网站,JSDOM有明显的延迟。

•JSDOM感觉太沉重:JSDOM的目的是提供一个跟我们在浏览器中看到的相同的DOM环境(注* 可执行JavaScript)。我从来没有真的需要这些东西,我只想要一个简单的,熟悉的方式做HTML操作。

什么时侯使用JSDOM

Cheerio无法解决你所有的问题。如果我需要在一个类似浏览器的环境中工作,我仍然会使用JSDOM,特别是当在服务器上想要进行自动化功能测试时。

API

我们将使用的示例HTML代码:

<ul id="fruits">

<li class="apple">Apple</li>

<li class="orange">Orange</li>

<li class="pear">Pear</li>

</ul>

加载

首先,你需要在加载HTML。这一步在jQuery是自动完成的,因为jQuery的运行在一个,即时的DOM环境中。我们需要将HTML文档传入Cheerio中。

这是首选的方法:

var cheerio = require('cheerio'),

    $ = cheerio.load('<ul id="fruits">...</ul>');

另外,您还可以将HTML作为字符串参数传入:

$ = require('cheerio');

$('ul', '<ul id="fruits">...</ul>');

或者作为根结点

$ = require('cheerio');

$('li', 'ul', '<ul id="fruits">...</ul>');

您也可以通过一个额外的.load()加载您需要修改的默认解析选项:

$ = cheerio.load('<ul id="fruits">...</ul>', {

    normalizeWhitespace: true,

    xmlMode: true

});

这些解析选项是直接从 htmlparser2 借来的,因此可以在htmlparser2使用的任何参数在cheerio也有效。默认的选项是:

{

    normalizeWhitespace: false,

    xmlMode: false,

    decodeEntities: true

}

Selectors选择器

Cheerio的选择器几乎与jQuery的完全相同,所以API是非常相似的。

$( selector, [context], [root] )

选择器按照: 根[root,可选]->上下文[context,可选]->选择器 的顺序选择元素。选择器和上下文可以是一个字符串表达式,DOM元素,DOM元素数组。根通常document 是 HTML文档的根元素。

像jQuery一样,此选择方法会从起点遍历和操纵文档。它是从文档中选择的元素的主要方法,但不像jQuery那样构建CSSSelect库(Sizzle 选择器)。

$('.apple', '#fruits').text()

//=> Apple

$('ul .pear').attr('class')

//=> pear

$('li[class=orange]').html()

//=> <li class="orange">Orange</li>

Attributes属性

获取和修改属性的方法。

.attr( name, value )

用于获取和设置属性的方法。仅获取匹配的第一个元素的属性值。如果设置属性的值设置为null,则删除该属性。您也可以像jQuery一样传入map和function。

$('ul').attr('id')

//=> fruits

$('.apple').attr('id', 'favorite').html()

//=> <li class="apple" id="favorite">Apple</li>

.data( name, value )

用于获取和设置数据属性的方法。获取或设置仅用于匹配的第一个元素。

$('<div data-apple-color="red"></div>').data()

//=> { appleColor: 'red' }

$('<div data-apple-color="red"></div>').data('data-apple-color')

//=> 'red'

var apple = $('.apple').data('kind', 'mac')

apple.data('kind')

//=> 'mac'

.val( [value] )

用于获取和设置input,select和textarea值的方法。注:支持map,function尚未添加。

$('input[type="text"]').val()

//=> input_text

$('input[type="text"]').val('test').html()

//=> <input type="text" value="test"/>

更多API请参见官网

NodeJs 相关文章推荐
用nodejs写的一个简单项目打包工具
May 11 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
NodeJS实现阿里大鱼短信通知发送
Jan 17 NodeJs
docker中编译nodejs并使用nginx启动
Jun 23 NodeJs
nodejs+express搭建多人聊天室步骤
Feb 12 NodeJs
Nodejs把接收图片base64格式保存为文件存储到服务器上
Sep 26 NodeJs
nodejs基础之多进程实例详解
Dec 27 NodeJs
详解nodejs http请求相关总结
Mar 31 NodeJs
typescript nodejs 依赖注入实现方法代码详解
Jul 21 NodeJs
nodejs简单抓包工具使用详解
Aug 23 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 NodeJs
windows如何把已安装的nodejs高版本降级为低版本(图文教程)
Dec 14 NodeJs
NodeJs基本语法和类型
Feb 13 #NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 #NodeJs
nodejs 整合kindEditor实现图片上传
Feb 03 #NodeJs
NodeJS学习笔记之Connect中间件应用实例
Jan 27 #NodeJs
NodeJS学习笔记之Connect中间件模块(二)
Jan 27 #NodeJs
NodeJS学习笔记之Connect中间件模块(一)
Jan 27 #NodeJs
nodejs批量修改文件编码格式
Jan 22 #NodeJs
You might like
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP三层结构(上) 简单三层结构
2010/07/04 PHP
PHP数组无限分级数据的层级化处理代码
2012/12/29 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
浅谈PHP中JSON数据操作
2015/07/01 PHP
PHP7新增运算符用法实例分析
2016/09/26 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
分享别人写的一个小型js框架
2007/08/13 Javascript
js对table的td进行相同内容合并示例详解
2013/12/27 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
2014/03/13 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
JavaScript中的null和undefined区别介绍
2015/01/01 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
js+html5实现的自由落体运动效果代码
2016/01/28 Javascript
Node.js 文件夹目录结构创建实例代码
2016/07/08 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
浅谈vuex之mutation和action的基本使用
2017/08/29 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
Vue项目中ESlint规范示例代码
2019/07/04 Javascript
使用p5.js实现动态GIF图片临摹重现
2019/10/23 Javascript
Scrapy抓取京东商品、豆瓣电影及代码分享
2017/11/23 Python
Python爬取十篇新闻统计TF-IDF
2018/01/03 Python
python3调用百度翻译API实现实时翻译
2018/08/16 Python
如何使用Python自动控制windows桌面
2019/07/11 Python
python批量处理文件或文件夹
2020/07/28 Python
pandas read_excel()和to_excel()函数解析
2019/09/19 Python
python 监控logcat关键字功能
2020/09/04 Python
jupyter notebook快速入门及使用详解
2020/11/13 Python
大学生在校学习的自我评价
2014/02/18 职场文书
妇联主席先进事迹
2014/05/18 职场文书
2015小学教师年度考核工作总结
2015/05/12 职场文书
解决Pytorch中关于model.eval的问题
2021/05/22 Python