Comments (6)
@xmh0511 的确 cloned()
方法是调用的 node
节点的 clone_node
方法 ,该方法只是 Rc
的一个拷贝,这个实现的确和标准语义不相符。当前库里还没有实现类似 jquery 内的 clone
方法,我打算这两天抽时间来实现一下,同时为了保证不是破坏性更改,先暂时在原基础上新增一个新方法了。
from visdom.
use visdom::{types::BoxDynError, Vis};
fn main()->Result<(),BoxDynError> {
const HTML:&str = r#"<div id="contain"><p class="item"></p></div>"#;
let v = Vis::load(HTML)?;
let p = v.find("p").get(0).unwrap().cloned();
let mut p_clone = Vis::dom(&p);
p_clone.set_text("abc");
//v.find("#contain").append(& mut p_clone);
println!("{}",v.outer_html());
Ok(())
}
输出:
<div id="contain"><p class="item">abc</p></div>
.
期望行为:
提供deep clone方法对拷贝的对象的dom的操作不影响拷贝源dom.
from visdom.
也许叫 clone_dom()
?既能与Rust的clone区分,也能体现jquery中clone的含义?
from visdom.
命名实在有点头大,想的是以后如果更新大版本直接把当前版本node节点的 clone_node
的语义改了,对应取了个 copy_node
可能会更好理解点~?对集合的操作还是实现了 clone
方法(可能容易和已有的 cloned
混淆,但将来更新版本可以不用改动),集合或者元素的 cloned
方法到时也会移除掉,另外对应元素上新增了一个 copied
方法,和node节点的 copy_node
对应,因为是打补丁的方式,所以好像都不太美观。新的代码我已经合并到主分支了,一会发布一个版本你可以试试:
const HTML:&str = r#"<div id="contain"><p class="item"></p></div>"#;
let v = Vis::load(HTML)?;
let p = v.find("p");
let mut p_clone = p.clone();
p_clone.set_text("abc");
assert_eq!(p.text(), "");
assert_eq!(p_clone.text(), "abc");
Ok(())
感谢建议与反馈~!
from visdom.
@fefit 我认为visdom里面所有类型提供的clone
接口应该都是深拷贝语义(即节点/dom的深拷贝),这一点也是Rust中clone的语义,即clone
返回的值具有该值类型所表示对象的独立的所有权。如果用户想要浅拷贝,应该使用获取引用,或者通过具有指针语义的类型包装节点/dom, 比如通过Rc::new(v)
,Arc::new(v)
等表示有多个实体共享同一个节点/dom的所有权的方式,这样也即贴合Jquery clone的语义,也符合Rust的clone语义。
from visdom.
@fefit 我认为visdom里面所有类型提供的
clone
接口应该都是深拷贝语义(即节点/dom的深拷贝),这一点也是Rust中clone的语义,即clone
返回的值具有该值类型所表示对象的独立的所有权。如果用户想要浅拷贝,应该使用获取引用,或者通过具有指针语义的类型包装节点/dom, 比如通过Rc::new(v)
,Arc::new(v)
等表示有多个实体共享同一个节点/dom的所有权的方式,这样也即贴合Jquery clone的语义,也符合Rust的clone语义。
嗯,后续如果做大版本迭代会保持这种方式了~
from visdom.
Related Issues (20)
- error: failed to get `mesdoc` as a dependency of package `visdom v0.1.4 HOT 1
- How to remove a DOM element? HOT 6
- No problem, my bad :(
- Please add support for html method for all elements HOT 5
- Navigating sideway with `find` method HOT 2
- set_html and replace_with seems not work HOT 6
- 这么好的项目为什么这么少人知道? HOT 1
- 不可用 HOT 2
- `rphtml` and `htmlentities` APIs changed HOT 3
- Stripping class entirely HOT 2
- Does this support xpath selectors ? HOT 4
- 带:冒号的怎么解析? HOT 9
- `Vis::load`返回的结果应该自动选中root元素 HOT 2
- 内存泄漏 HOT 6
- 如何获取节点的tag name(节点名称)? HOT 3
- 将`Result<Elements, Box<dyn Error>>` 改为`Result<Elements, Box<dyn Error + Send>>` HOT 2
- 是否有更好的方式获取 select 元素的值? HOT 4
- Opposite of .has() HOT 4
- doc.find("p:contains('好用')" panicked, only when Chinese characters appear in contains() HOT 2
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from visdom.