Merge pull request #133 from mrxiaozhuox/master

The desktop app will default open link in browser
This commit is contained in:
Jonathan Kelley 2022-01-18 23:09:40 -05:00 committed by GitHub
commit 887f69d5b4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 65 additions and 0 deletions

28
examples/link.rs Normal file
View file

@ -0,0 +1,28 @@
use dioxus::prelude::*;
fn main() {
dioxus::desktop::launch(app);
}
fn app(cx: Scope) -> Element {
cx.render(rsx! (
div {
p {
a {
href: "http://dioxuslabs.com/",
"default link"
}
}
p {
a {
href: "http://dioxuslabs.com/",
prevent_default: "onclick",
onclick: |_| {
println!("Hello Dioxus");
},
"custom event link",
}
}
}
))
}

View file

@ -29,6 +29,7 @@ tokio = { version = "1.12.0", features = [
], optional = true, default-features = false }
dioxus-core-macro = { path = "../core-macro", version ="^0.1.6"}
dioxus-html = { path = "../html", features = ["serialize"], version ="^0.1.4"}
webbrowser = "0.5.5"
[features]
default = ["tokio_runtime"]

View file

@ -343,6 +343,7 @@ class Interpreter {
this.listeners[event_name] = true;
this.root.addEventListener(event_name, (event) => {
const target = event.target;
const real_id = target.getAttribute(`dioxus-id`);
@ -356,6 +357,25 @@ class Interpreter {
event.preventDefault();
}
if (event.type == "submit") {
event.preventDefault();
}
if (event.type == "click") {
event.preventDefault();
if (should_prevent_default !== `onclick`) {
if(element.tagName == "A") {
const href = event.target.getAttribute("href")
if (href !== "" && href !== null && href !== undefined) {
rpc.call("browser_open", {
mounted_dom_id: parseInt(real_id),
href: event.target.getAttribute("href")
});
}
}
}
}
if (real_id == null) {
return;
}
@ -374,7 +394,9 @@ class Interpreter {
}
SetAttribute(edit) {
// console.log("setting attr", edit);
const name = edit.field;
const value = edit.value;
const ns = edit.ns;

View file

@ -187,6 +187,20 @@ pub fn launch_with_props<P: 'static + Send>(
is_ready.store(true, std::sync::atomic::Ordering::Relaxed);
let _ = proxy.send_event(UserWindowEvent::Update);
}
"browser_open" => {
let data = req.params.unwrap();
log::trace!("Open browser: {:?}", data);
if let Some(arr) = data.as_array() {
if let Some(temp) = arr[0].as_object() {
if temp.contains_key("href") {
let url = temp.get("href").unwrap().as_str().unwrap();
if let Err(e) = webbrowser::open(url) {
log::error!("Open Browser error: {:?}", e);
}
}
}
}
}
_ => {}
}
None