pub struct Elements<'a> { /* private fields */ }

Implementations

Iterate over the element in Elements, when the handle return false, stop the iterator.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <ul>
      <li>item1</li>
      <li>item2</li>
      <li>item3</li>
    </ul>
  "##;
  let doc = Vis::load(html)?;
  let mut items = doc.find("ul > li");
  assert_eq!(items.length(), 3);
  let mut items_texts:Vec<String> = vec![];
  items.for_each(|index, ele| {
    if index < 2{
      items_texts.push(ele.text());
      return true;
    }
    false
  });
  assert_eq!(items_texts.len(), 2);
  assert_eq!(items_texts.join(","), "item1,item2");
  Ok(())
}

A short alias for method for_each

Get a collection of values by iterate the each element in Elements and call the handle function.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <ul>
      <li>item1</li>
      <li>item2</li>
      <li>item3</li>
    </ul>
  "##;
  let doc = Vis::load(html)?;
  let mut items = doc.find("ul > li");
  assert_eq!(items.length(), 3);
  let items_texts: Vec<String> = items.map(|index, ele| {
    ele.text()
  });
  assert_eq!(items_texts.len(), 3);
  assert_eq!(items_texts.join(","), "item1,item2,item3");
  Ok(())
}

Return the length of the Elements set.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <ul>
      <li>item1</li>
      <li>item2</li>
      <li>item3</li>
    </ul>
  "##;
  let doc = Vis::load(html)?;
  let mut items = doc.find("ul > li:contains('item3')");
  assert_eq!(items.length(), 1);
  Ok(())
}

Check if the Elements is empty, it’s a short alias for .length() == 0

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <ul>
      <li>item1</li>
      <li>item2</li>
      <li>item3</li>
    </ul>
  "##;
  let doc = Vis::load(html)?;
  let mut items = doc.find("ul > li:empty");
  assert!(items.is_empty());
  assert_eq!(items.length(), 0);
  Ok(())
}

A quick way to get the document object when the loaded html is a document.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <ul>
          <li>item1</li>
          <li>item2</li>
          <li>item3</li>
        </ul>
      </body>
    </html>
  "##;
  let root = Vis::load(html)?;
  let mut document = root.document();
  assert!(document.is_some());
  assert_eq!(document.unwrap().title(), Some("document"));
  Ok(())
}

Get the descendants of each element in the Elements, filtered by the selector

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <ul>
          <li>item1</li>
          <li>item2</li>
          <li>
              <ol>
                <li>subitem1</li>
                <li>subitem2</li>
              </ol>
          </li>
        </ul>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  assert_eq!(doc.find("ul").length(), 1);
  assert_eq!(doc.find("ul li").length(), 5);
  assert_eq!(doc.find("ul > li").length(), 3);
  assert_eq!(doc.find("ul li:first-child").text(), "item1subitem1");
  Ok(())
}

Reduce the Elements to those that match the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <ul>
          <li>item1</li>
          <li class="item2">item2</li>
          <li>item3</li>
        </ul>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let items = doc.find("li");
  assert_eq!(items.length(), 3);
  assert_eq!(items.filter("[class]").length(), 1);
  assert_eq!(items.filter("[class]").text(), "item2");
  assert_eq!(items.filter("li:contains('item3')").length(), 1);
  assert_eq!(items.filter("li:contains('item3')").text(), "item3");
  Ok(())
}

Reduce the Elements to those that pass the handle function test.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <ul>
          <li>item1</li>
          <li class="item2">item2</li>
          <li>item3</li>
        </ul>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let items = doc.find("li");
  assert_eq!(items.length(), 3);
  let class_items = items.filter_by(|_, ele| ele.get_attribute("class").is_some());
  assert_eq!(class_items.length(), 1);
  assert_eq!(class_items.text(), "item2");
  Ok(())
}

Reduce the Elements to those that also in the searched Elements.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <ul>
          <li></li>
          <li class="item2">item2</li>
          <li class="item3"></li>
        </ul>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let items = doc.find("li");
  assert_eq!(items.length(), 3);
  let empty_items = items.filter(":empty");
  let class_items = items.filter("[class]");
  assert_eq!(empty_items.length(), 2);
  assert_eq!(class_items.length(), 2);
  // has class and also empty
  let class_and_empty_items = class_items.filter_in(&empty_items);
  assert_eq!(class_and_empty_items.length(), 1);
  assert_eq!(class_and_empty_items.attr("class").unwrap().to_string(), "item3");
  Ok(())
}

Get the children of each element in Elements, when the selector is not empty, will filtered by the selector

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">
              <dl>
                <dd>subitem1</dd>
                <dd>subitem2</dd>
              </dl>
          </dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let top_dl = doc.find("dl").eq(0);
  let all_dd = top_dl.find("dd");
  assert_eq!(all_dd.length(), 5);
  let child_items = top_dl.children("");
  assert_eq!(child_items.length(), 4);
  let child_dd = top_dl.children("dd");
  assert_eq!(child_dd.length(),3);
  Ok(())
}

Get the previous sibling of each element in Elements, when the selector is not empty, will filtered by the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let item3 = dl.children(".item3");
  assert_eq!(item3.prev("").text(), "item2");
  assert_eq!(item3.prev(":not[class]").is_empty(),true);
  Ok(())
}

Get all preceding siblings of each element in Elements, when the selector is not empty, will filtered by the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let item3 = dl.children(".item3");
  assert_eq!(item3.prev_all("").length(), 3);
  assert_eq!(item3.prev_all("dd").length(),2);
  assert_eq!(item3.prev_all("dt").length(),1);
  assert_eq!(item3.prev_all("dd[class]").length(),1);
  Ok(())
}

Get all preceding siblings of each element in Elements, until the previous sibling element matched the selector, when contains is true, the matched previous sibling will be included, otherwise it will exclude; when the filter is not empty, will filtered by the selector;

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let item3 = dl.children(".item3");
  assert_eq!(item3.prev_until("dt", "", false).length(), 2);
  assert_eq!(item3.prev_until("dt", "", false).eq(0).is("dd"), true);
  assert_eq!(item3.prev_until("dt", "", true).length(), 3);
  assert_eq!(item3.prev_until("dt", "", true).eq(0).is("dt"), true);
  assert_eq!(item3.prev_until("dt", "dd", true).length(), 2);
  assert_eq!(item3.prev_until("dt", "dd", true).eq(0).is("dd"), true);
  Ok(())
}

Get the next sibling of each element in Elements, when the selector is not empty, will filtered by the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let dt = dl.children("dt");
  assert_eq!(dt.next("").text(), "item1");
  assert_eq!(dt.next("[class]").is_empty(), true);
  Ok(())
}

Get all following siblings of each element in Elements, when the selector is not empty, will filtered by the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let dt = dl.children("dt");
  assert_eq!(dt.next_all("").length(), 3);
  assert_eq!(dt.next_all("[class]").length(), 2);
  assert_eq!(dt.next_all("[class]").text(), "item2item3");
  Ok(())
}

Get all following siblings of each element in Elements, until the sibling element matched the selector, when contains is true, the matched sibling will be included, otherwise it will exclude; when the filter is not empty, will filtered by the selector;

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let dt = dl.children("dt");
  assert_eq!(dt.next_until(".item3", "", false).length(), 2);
  assert_eq!(dt.next_until(".item3", "", true).length(), 3);
  assert_eq!(dt.next_until(".item3", "[class]", false).length(), 1);
  assert_eq!(dt.next_until(".item3", "[class]", true).length(), 2);
  Ok(())
}

Get the siblings of each element in Elements, when the selector is not empty, will filtered by the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let item2 = dl.children(".item2");
  assert_eq!(item2.siblings("").length(), 3);
  assert_eq!(item2.siblings("").first().is("dt"), true);
  assert_eq!(item2.siblings("dd").first().text(), "item1");
  Ok(())
}

Get the parent of each element in Elements, when the selector is not empty, will filtered by the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let item2 = dl.children(".item2");
  assert_eq!(item2.parent("").length(), 1);
  assert_eq!(item2.parent("").get(0).unwrap().tag_name(), "DL");
  assert_eq!(item2.parent("ul").length(), 0);
  Ok(())
}

Get the ancestors of each element in Elements, when the selector is not empty, will filtered by the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let item2 = dl.children(".item2");
  assert_eq!(item2.parents("").length(), 3);
  assert_eq!(item2.parents("").first().is("html"), true);
  assert_eq!(item2.parents("").last().is("dl"), true);
  assert_eq!(item2.parents("dl").length(), 1);
  Ok(())
}

Get the ancestors of each element in Elements, until the ancestor matched the selector, when contains is true, the matched ancestor will be included, otherwise it will exclude; when the filter is not empty, will filtered by the selector;

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let item2 = dl.children(".item2");
  assert_eq!(item2.parents_until("body", "", false).length(), 1);
  assert_eq!(item2.parents_until("body", "", true).length(), 2);
  assert_eq!(item2.parents_until("body", "dl", true).length(), 1);
  Ok(())
}

Get the first matched element of each element in Elements, traversing from self to it’s ancestors.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let item2 = dl.children(".item2");
  assert_eq!(item2.closest("dd").length(), 1);
  assert_eq!(item2.closest("dd").is_all_in(&item2), true);
  assert_eq!(item2.closest("dl").is_all_in(&item2.parent("")), true);
  Ok(())
}

pub fn contains

Check at least one element in Elements is match the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.is("dd"), true);
  assert_eq!(items.is("dt"), true);
  assert_eq!(items.is(".item2"), true);
  assert_eq!(items.is(".item3"), true);
  assert_eq!(items.is(":contains('item2')"), true);
  Ok(())
}

Check at least one element in Elements call the handle function return true.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.is_by(|_, ele|{
    ele.tag_name() == "DT"
  }), true);
  assert_eq!(items.is_by(|_, ele|{
    ele.tag_name() == "DD"
  }), true);
  assert_eq!(items.is_by(|_, ele|{
    Vis::dom(ele).has_class("item2")
  }), true);
  Ok(())
}

Check at least one element in Elements is also in the other Elements set.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  let dd = items.filter("dd");
  let dt = items.filter("dt");
  assert_eq!(items.is_in(&dd), true);
  assert_eq!(items.is_in(&dt), true);
  Ok(())
}

Check if each element in Elements are all matched the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.is_all("dd"), false);
  assert_eq!(items.is_all("dt"), false);
  assert_eq!(items.is_all("dt,dd"), true);
  Ok(())
}

Check if each element in Elements call the handle function are all returned true.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.is_all_by(|_, ele|{
    ele.tag_name() == "DT"
  }), false);
  assert_eq!(items.is_all_by(|_, ele|{
    ele.tag_name() == "DD"
  }), false);
  assert_eq!(items.is_all_by(|_, ele|{
    let tag_name = ele.tag_name();
    tag_name == "DT" || tag_name == "DD"
  }), true);
  Ok(())
}

Check if each element in Elements is also in the other Elements set.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  let dd = items.filter("dd");
  let dt = items.filter("dt");
  assert_eq!(items.is_all_in(&dd), false);
  assert_eq!(items.is_all_in(&dt), false);
  assert_eq!(dd.is_all_in(&items), true);
  assert_eq!(dt.is_all_in(&items), true);
  Ok(())
}

Remove elements those that match the selector from the Elements set.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.not("dd").is_all("dt"), true);
  assert_eq!(items.not("dt").is_all("dd"), true);
  assert_eq!(items.not("dt,dd").is_empty(), true);
  Ok(())
}

Remove elements those that pass the handle function test from the Elements set.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.not_by(|_, ele|ele.tag_name() == "DD").is_all("dt"), true);
  assert_eq!(items.not_by(|_, ele|ele.tag_name() == "DT").is_all("dd"), true);
  assert_eq!(items.not_by(|_, ele|ele.tag_name() == "DT" || ele.tag_name() == "DD").is_empty(), true);
  Ok(())
}

Remove elements those that also in the elements from the Elements set.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd>item1</dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.not_in(&items.filter("dd")).is_all("dt"), true);
  assert_eq!(items.not_in(&items.filter("dt")).is_all("dd"), true);
  assert_eq!(items.not_in(&items).is_empty(), true);
  Ok(())
}

Reduce Elements to those that have a descendant that matches the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>&lt;<strong>T</strong>itle&gt;</dt>
          <dd><span>item1</span></dd>
          <dd class="item2">item2</dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.filter("dt").text(), "<Title>");
  assert_eq!(items.filter("dd").text(), "item1item2item3");
  Ok(())
}

Reduce Elements to those that have a descendant that matches the selector.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.length(), 4);
  assert_eq!(items.has_in(&items.children("span")).length(), 2);
  assert_eq!(dl.has_in(&items).length(), 1);
  Ok(())
}

Get one element from the Elements at the specified index.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.eq(0).is("dt"), true);
  assert_eq!(items.eq(2).has_class("item2"), true);
  Ok(())
}

Get the first element of the Elements set,equal to eq(0).

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.first().is_all_in(&items.eq(0)), true);
  assert_eq!(items.first().is("dt"), true);
  Ok(())
}

Get the last element of the set, equal to eq(length - 1).

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.last().is_all_in(&items.eq(items.length()-1)), true);
  assert_eq!(items.last().is(".item3"), true);
  Ok(())
}

Get a subset specified by a range of indices.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.slice(..).length(), 4);
  assert_eq!(items.slice(0..3).length(), 3);
  assert_eq!(items.slice(0..=3).length(), 4);
  assert_eq!(items.slice(0..10).length(), 4);
  Ok(())
}

Get a concated element set from Elements and the other parameter elements, it will generate a new element set, take the ownership of the parameter elements, but have no sence with the Elements itself.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  let dt = items.filter("dt");
  let class_dd = items.filter("[class]");
  assert_eq!(dt.length(), 1);
  assert_eq!(class_dd.length(), 2);
  let add_dt_dd = dt.add(class_dd);
  assert_eq!(add_dt_dd.length(), 3);
  Ok(())
}

Get the form value of input, select, option, textarea.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <input type="text" value="textvalue" />
        <select name="single">
          <option value="default"></option>
          <option value="opt1">opt1</option>
          <option value="opt2">opt1</option>
        </select>
        <select multiple>
          <option value="default"></option>
          <option value="opt1" selected="selected">opt1</option>
          <option value="opt2" selected="selected">opt1</option>
        </select>
        <textarea><div>hello</div></textarea>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let input = doc.find("input[type='text']");
  assert_eq!(input.val().to_string(), "textvalue");
  let select = doc.find("select[name='single']");
  assert_eq!(select.val().to_string(), "default");
  let multi_select = doc.find("select[multiple]");
  assert_eq!(multi_select.val().to_string(), "opt1,opt2");
  let textarea = doc.find("textarea");
  assert_eq!(textarea.val().to_string(), "<div>hello</div>");
  Ok(())
}

Get the text of each element in Elements,the html entity will auto decoded.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  let dt = items.filter("dt");
  let class_dd = items.filter("[class]");
  assert_eq!(dt.length(), 1);
  assert_eq!(class_dd.length(), 2);
  let add_dt_dd = dt.add(class_dd);
  assert_eq!(add_dt_dd.length(), 3);
  Ok(())
}

Set the Elements’s text, the html entity in content will auto encoded.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3">item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  let mut dt = items.filter("dt");
  dt.set_text("<Title>");
  assert_eq!(dt.text(), "<Title>");
  assert_eq!(dt.html(), "&lt;Title&gt;");
  let mut item2 = items.filter(".item2");
  assert_eq!(item2.html(), "<span>item2</span>");
  item2.set_text("item2");
  assert_eq!(item2.html(), "item2");
  Ok(())
}

Get the html of the first element in Elements.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3"><!--comment-->item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  let item2 = items.filter(".item2");
  assert_eq!(item2.html(), "<span>item2</span>");
  let item3 = items.filter(".item3");
  assert_eq!(item3.html(), "<!--comment-->item3");
  Ok(())
}

Set the html to content of each element in Elements.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3"><!--comment-->item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  let mut item2 = items.filter(".item2");
  assert_eq!(item2.html(), "<span>item2</span>");
  item2.set_html("set_html:<em>item2</em>");
  assert_eq!(item2.html(), "set_html:<em>item2</em>");
  Ok(())
}

Get the outer html of the first element in Elements.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3"><!--comment-->item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  let mut item2 = items.filter(".item2");
  assert_eq!(item2.outer_html(), r#"<dd class="item2"><span>item2</span></dd>"#);
  Ok(())
}

pub fn texts get the text node of each element

pub fn texts_by get the text node of each element, filter by the handle

Get an atrribute by name from the first element in Elements.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <input type="text" class="inp inp-txt" readonly />
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let input = doc.find("input");
  let attr_readonly = input.attr("readonly");
  assert!(attr_readonly.is_some() && attr_readonly.unwrap().is_true());
  let attr_type = input.attr("type");
  assert!(attr_type.is_some() && attr_type.unwrap().to_string() == "text");
  let attr_class = input.attr("class");
  assert!(attr_class.is_some() && attr_class.unwrap().to_list().contains(&"inp"));
  Ok(())
}

Check if has an attribute with specified name.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <input type="text" class="inp inp-txt" readonly />
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let input = doc.find("input");
  assert!(input.has_attr("readonly"));
  assert!(input.has_attr("class"));
  assert!(input.has_attr("type"));
  assert_eq!(input.has_attr("value"), false);
  Ok(())
}

Set a specified name attribute with a value who’s type is an Option<&str>, when the value is None,that means the attribute does’n have a string value but a bool value of true.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <input type="text" class="inp inp-txt" readonly />
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let mut input = doc.find("input");
  assert_eq!(input.has_attr("value"), false);
  input.set_attr("value", None);
  assert!(input.attr("value").is_some() && input.attr("value").unwrap().is_true());
  input.set_attr("value", Some("myinput"));
  assert!(input.attr("value").is_some() && input.attr("value").unwrap().to_string() == "myinput");
  input.set_attr("value", Some(""));
  assert!(input.attr("value").is_some() && input.attr("value").unwrap().is_true() == false);
  Ok(())
}

Remove a specified name attribute from the each element in the Elements.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <input type="text" class="inp inp-txt" readonly />
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let mut input = doc.find("input");
  assert_eq!(input.has_attr("value"), false);
  input.set_attr("value", None);
  assert!(input.attr("value").is_some() && input.attr("value").unwrap().is_true());
  input.remove_attr("value");
  assert!(input.attr("value").is_none());
  assert!(input.attr("readonly").is_some());
  input.remove_attr("readonly");
  assert!(input.attr("readonly").is_none());
  Ok(())
}

Check if Elements’s ClassList contains the specified class name, multiple classes can be splitted by whitespaces.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <input type="text" class="inp inp-txt" readonly />
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let input = doc.find("input");
  assert_eq!(input.has_class("inp"), true);
  assert_eq!(input.has_class("inp-txt"), true);
  assert_eq!(input.has_class("inp-txt inp"), true);
  assert_eq!(input.has_class("inp-txt inp noinp"), false);
  Ok(())
}

Add class to Elements’s ClassList, multiple classes can be splitted by whitespaces.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <input type="text" class="inp inp-txt" readonly />
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let mut input = doc.find("input");
  assert_eq!(input.has_class("noinp"), false);
  assert_eq!(input.has_class("inp-red"), false);
  input.add_class("noinp inp-red");
  assert_eq!(input.has_class("noinp"), true);
  assert_eq!(input.has_class("inp-red"), true);
  Ok(())
}

Remove class from Elements’s ClassList, multiple classes can be splitted by whitespaces.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <input type="text" class="inp inp-txt" readonly />
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let mut input = doc.find("input");
  assert_eq!(input.has_class("inp"), true);
  assert_eq!(input.has_class("inp-txt"), true);
  input.remove_class("inp inp-txt");
  assert_eq!(input.has_class("inp"), false);
  assert_eq!(input.has_class("inp-txt"), false);
  assert_eq!(input.has_attr("class"), true);
  Ok(())
}

Toggle the class name from Elements’s ClassList, multiple classes can be splitted by whitespaces.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <input type="text" class="inp inp-txt" readonly />
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let mut input = doc.find("input");
  assert_eq!(input.has_class("inp"), true);
  assert_eq!(input.has_class("inp-txt"), true);
  input.toggle_class("inp inp-red");
  assert_eq!(input.has_class("inp"), false);
  assert_eq!(input.has_class("inp-txt"), true);
  assert_eq!(input.has_class("inp-red"), true);
  Ok(())
}

Remove the Elements set.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3"><!--comment-->item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.length(), 4);
  // remove the dt element
  items.filter("dt").remove();
  let now_items = dl.children("");
  assert_eq!(now_items.length(), 3);
  Ok(())
}

Clear all the nodes in the Elements set.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3"><!--comment-->item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let mut dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.length(), 4);
  // clear the dl
  dl.empty();
  let now_items = dl.children("");
  assert_eq!(now_items.length(), 0);
  Ok(())
}

Append the parameter Elements to the child before the tag end of the current Elements set.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3"><!--comment-->item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let mut dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.length(), 4);
  assert_eq!(items.last().is(".item3"), true);
  // now append item2 to the last child
  let mut item2 = items.filter(".item2");
  dl.append(&mut item2);
  let now_items = dl.children("");
  assert_eq!(now_items.last().is(".item2"), true);
  // append a new document fragement
  let mut append_dd = Vis::load(r#"<dd class="item4">item4</dd>"#)?;
  dl.append(&mut append_dd);
  let now_items = dl.children("");
  assert_eq!(now_items.last().is(".item4"), true);
  Ok(())
}

Same as append, but exchange the caller and the parameter target.

Append the parameter Elements to the child after the tag start of the current Elements set.

Same as prepend, but exchange the caller and the parameter target.

Insert the each element in the current Elements set into the other Elements’s element’s before position.

use visdom::Vis;
use visdom::types::BoxDynError;
fn main()-> Result<(), BoxDynError>{
  let html = r##"
    <html>
      <head>
        <title>document</title>
      </head>
      <body>
        <dl>
          <dt>Title</dt>
          <dd><span>item1</span></dd>
          <dd class="item2"><span>item2</span></dd>
          <dd class="item3"><!--comment-->item3</dd>
        </dl>
      </body>
    </html>
  "##;
  let doc = Vis::load(html)?;
  let mut dl = doc.find("dl");
  let items = dl.children("");
  assert_eq!(items.length(), 4);
  assert_eq!(items.last().is(".item3"), true);
  // now insert item3 before item2
  let mut item2 = items.filter(".item2");
  let mut item3 = items.filter(".item3");
  item3.insert_before(&mut item2);
  let now_items = dl.children("");
  assert_eq!(now_items.last().is(".item2"), true);
  // insert a new item0
  let mut insert_dd = Vis::load(r#"<dd class="item0">item0</dd>"#)?;
  let mut first_dd = dl.children("dd").first();
  insert_dd.insert_before(&mut first_dd);
  let now_dds = dl.children("dd");
  assert_eq!(now_dds.first().is(".item0"), true);
  Ok(())
}

Same as insert_before, but exchange the caller and the parameter target.

Insert the each element in the current Elements set into the other Elements’s element’s after position.

Same as insert_after, but exchange the caller and the parameter target.

Trait Implementations

Returns the “default value” for a type. Read more

The type of the elements being iterated over.

Which kind of iterator are we turning this into?

Creates an iterator from a value. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

Performs the conversion.