visdom
visdom copied to clipboard
`Vis::load`返回的结果应该自动选中root元素
use visdom::{types::BoxDynError, Vis};
fn main()->Result<(),BoxDynError> {
const HTML:&str = r#"<div id="contain"><p class="item"></p></div>"#;
let mut v = Vis::load(HTML)?;
v.set_attr("class", Some("ppp"));
println!("{}",v.outer_html());
Ok(())
}
输出:
期望:
对比Jquery
let d = $(`<div id="contain"><p class="item"></p></div>`);
d.addClass("ppp");
console.log(d[0].outerHTML)
输出:
visdom 需要通过v.find("#contain").set_attr("class", Some("ppp"));手动选择元素才能设置成功
use visdom::{types::BoxDynError, Vis};
fn main()->Result<(),BoxDynError> {
const HTML:&str = r#"<div><p class="item"></p></div><div></div>"#;
let v_out = Vis::load(HTML)?;
let p = v_out.find("p").get(0).unwrap().outer_html();
let p_clone = Vis::load(p)?;
let p_clone = p_clone.get(0).unwrap();
p_clone.get_attribute("class");
Ok(())
}
这个代码会直接panic
Element node must have a meta field.
也许与这个问题相关
这块的设计的确和 jQuery 不太相同,load 方法加载的可能是整个html页面,也可能是html片段,与 cheeriojs 中的 load 方法更类似。
// jquery 中解析的主要是元素节点
$("<!DOCTYPE html><html></html>").length // 0
$("<html></html>").length // 1
load 方法得到的是个虚拟根节点,根节点上实际上只能进行一些查找操作和节点修改操作,其它操作则可能会报上面的错误,当初为了操作相对方便, load 方法返回的数据类型也是 Elements,后面有时间打算把它做成单独的类型,限制下它的可操作范围,防止出现上面的操作错误了。感谢反馈建议!