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的10个性能优化技巧
Jul 15 NodeJs
使用NodeJs 开发微信公众号(三)微信事件交互实例
Mar 02 NodeJs
浅析Nodejs npm常用命令
Jun 14 NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 NodeJs
Nodejs 获取时间加手机标识的32位标识实现代码
Mar 07 NodeJs
用nodeJS搭建本地文件服务器的几种方法小结
Mar 16 NodeJs
详解nodejs微信公众号开发——2.自动回复
Apr 10 NodeJs
nodejs和C语言插入mysql数据库乱码问题的解决方法
Apr 14 NodeJs
nodejs+mongodb+vue前后台配置ueditor的示例代码
Jan 02 NodeJs
NodeJS 中Stream 的基本使用
Jul 30 NodeJs
Nodejs 识别图片类型的方法
Aug 15 NodeJs
nodejs+express最简易的连接数据库的方法
Dec 23 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
介绍php设计模式中的工厂模式
2008/06/12 PHP
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
ThinkPHP 模板substr的截取字符串函数详解
2017/01/09 PHP
强制设为首页代码
2006/06/19 Javascript
javascript读取xml
2006/11/04 Javascript
JQery jstree 大数据量问题解决方法
2010/03/09 Javascript
Grid得到选择行数据的方法总结
2011/01/17 Javascript
JavaScript实现Iterator模式实例分析
2015/06/09 Javascript
jQuery与JS加载事件用法分析
2016/09/04 Javascript
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
基于Vue实现支持按周切换的日历
2020/09/24 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
Vue路由切换时的左滑和右滑效果示例
2018/05/29 Javascript
解决循环中setTimeout执行顺序的问题
2018/06/20 Javascript
Vant的安装和配合引入Vue.js项目里的方法步骤
2018/12/05 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
使用localStorage替代cookie做本地存储
2019/09/25 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
js+canvas实现简单扫雷小游戏
2021/01/22 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
python中使用smtplib和email模块发送邮件实例
2014/04/22 Python
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
Python将多个excel表格合并为一个表格
2021/02/22 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
对python 树状嵌套结构的实现思路详解
2019/08/09 Python
Django Docker容器化部署之Django-Docker本地部署
2019/10/09 Python
python 画函数曲线示例
2019/12/04 Python
全面介绍python中很常用的单元测试框架unitest
2020/12/14 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
即时搜索数百万张门票:SeatsForEveryone.com
2018/08/26 全球购物
十一个高级MySql面试题
2014/10/06 面试题
教师政风行风评议心得体会
2014/10/21 职场文书
给下属加薪申请报告
2015/05/15 职场文书
拥有这5个特征人,“命”都不会太差
2019/08/16 职场文书
个人房屋租赁合同(标准范本)
2019/09/16 职场文书