visdom icon indicating copy to clipboard operation
visdom copied to clipboard

`Vis::load`返回的结果应该自动选中root元素

Open xmh0511 opened this issue 1 year ago • 2 comments

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"));手动选择元素才能设置成功

xmh0511 avatar Apr 16 '24 09:04 xmh0511

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.

也许与这个问题相关

xmh0511 avatar Apr 17 '24 01:04 xmh0511

这块的设计的确和 jQuery 不太相同,load 方法加载的可能是整个html页面,也可能是html片段,与 cheeriojs 中的 load 方法更类似。

// jquery 中解析的主要是元素节点
$("<!DOCTYPE html><html></html>").length // 0
$("<html></html>").length // 1

load 方法得到的是个虚拟根节点,根节点上实际上只能进行一些查找操作和节点修改操作,其它操作则可能会报上面的错误,当初为了操作相对方便, load 方法返回的数据类型也是 Elements,后面有时间打算把它做成单独的类型,限制下它的可操作范围,防止出现上面的操作错误了。感谢反馈建议!

fefit avatar Apr 18 '24 01:04 fefit