Add access to the event in InputData (#1411)

This commit is contained in:
Iha Shin 2020-07-13 15:56:39 +09:00 committed by GitHub
parent f7ce3e2c71
commit a4eb965082
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 8 additions and 4 deletions

View File

@ -28,7 +28,7 @@ impl_action! {
onerror(event: ResourceErrorEvent) -> ResourceErrorEvent => |_, event| { event }
onfocus(event: FocusEvent) -> FocusEvent => |_, event| { event }
// onformdata not supported
oninput(event: InputEvent) -> InputData => |this: &Element, _| { oninput_handler(this) }
oninput(event: InputEvent) -> InputData => |this: &Element, event| { oninput_handler(this, event) }
// oninvalid not supported
onkeydown(event: KeyDownEvent) -> KeyDownEvent => |_, event| { event }
onkeypress(event: KeyPressEvent) -> KeyPressEvent => |_, event| { event }

View File

@ -27,7 +27,7 @@ impl_action! {
onfocus(name: "focus", event: FocusEvent) -> web_sys::FocusEvent => |_, event| { event }
// web_sys doesn't have a struct for `FormDataEvent`
onformdata(name: "formdata", event: Event) -> web_sys::Event => |_, event| { event }
oninput(name: "input", event: InputEvent) -> InputData => |this: &Element, _| { oninput_handler(this) }
oninput(name: "input", event: InputEvent) -> InputData => |this: &Element, event| { oninput_handler(this, event) }
oninvalid(name: "invalid", event: Event) -> web_sys::Event => |_, event| { event }
onkeydown(name: "keydown", event: KeyboardEvent) -> web_sys::KeyboardEvent => |_, event| { event }
onkeypress(name: "keypress", event: KeyboardEvent) -> web_sys::KeyboardEvent => |_, event| { event }

View File

@ -12,6 +12,7 @@ cfg_if! {
use stdweb::unstable::{TryFrom, TryInto};
use stdweb::web::html_element::{InputElement, SelectElement, TextAreaElement};
use stdweb::web::{Element, EventListenerHandle, FileList, IElement, INode};
use stdweb::web::event::InputEvent;
pub use listener_stdweb::*;
} else if #[cfg(feature = "web_sys")] {
@ -21,6 +22,7 @@ cfg_if! {
use web_sys::{
Element, FileList, HtmlInputElement as InputElement, HtmlSelectElement as SelectElement,
HtmlTextAreaElement as TextAreaElement,
InputEvent
};
pub use listener_web_sys::*;
@ -33,6 +35,8 @@ pub struct InputData {
/// Inserted characters. Contains value from
/// [InputEvent](https://developer.mozilla.org/en-US/docs/Web/API/InputEvent/data).
pub value: String,
/// The InputEvent received.
pub event: InputEvent,
}
// There is no '.../Web/API/ChangeEvent/data' (for onchange) similar to
@ -55,7 +59,7 @@ pub enum ChangeData {
Files(FileList),
}
fn oninput_handler(this: &Element) -> InputData {
fn oninput_handler(this: &Element, event: InputEvent) -> InputData {
// Normally only InputElement or TextAreaElement can have an oninput event listener. In
// practice though any element with `contenteditable=true` may generate such events,
// therefore here we fall back to just returning the text content of the node.
@ -83,7 +87,7 @@ fn oninput_handler(this: &Element) -> InputData {
let v3 = this.text_content();
let value = v1.or(v2).or(v3)
.expect("only an InputElement or TextAreaElement or an element with contenteditable=true can have an oninput event listener");
InputData { value }
InputData { value, event }
}
fn onchange_handler(this: &Element) -> ChangeData {