You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用thirtyfour时,如何不提交表单触发onchange事件?

问题描述

我正在使用thirtyfour库编写Rust自动化代码,代码如下:

let transfer_balance = self
     .driver
      .find(By::XPath("//*[contains(@name, 'transfer_balance')]"))
      .await?;
transfer_balance.send_keys(amount.to_string()).await?;
transfer_balance.send_keys(Key::Return.to_string()).await?;

其中transfer_balance.send_keys(Key::Return.to_string()).await?;这段代码按下回车键后会直接提交表单,而非仅触发输入框的onchange事件。对应的Yew前端HTML代码如下:

<div class="container">
    <form onsubmit={onsubmit} id="balance-transfer-from">
    <div class="mb-3">
    <label for="Destination Account" class="form-label">{"Destination Account Address:"}</label>
    <input name="destination_account" type="text" class="form-control" required={true} onchange={dest_account_onchanged}/>
    </div>

    <div class="mb-3">
    <label for="Transfer Balance" class="form-label">{"Transfer Balance:"}</label>
    <input name="transfer_balance" type="text" class="form-control" required={true} onchange={transfer_balance_onchanged}/>
    </div>
    if let Some(_value) = *spinner {
        <button type="submit" disabled={true} id="tranfer-balance-submit">{"Submit"}</button>
        <Icon icon_id={IconId::FontAwesomeSolidSpinner} />
    } else {
        <button type="submit" id="tranfer-balance-submit">{"Submit"}</button>
    }
</form>

请问该如何解决此问题?

解决方法

方法1:手动触发onchange事件

放弃按回车的方式,通过JavaScript直接触发输入框的onchange事件,既能触发目标逻辑,又不会提交表单:

let transfer_balance = self
    .driver
    .find(By::XPath("//*[contains(@name, 'transfer_balance')]"))
    .await?;
transfer_balance.send_keys(amount.to_string()).await?;

// 执行JS代码触发change事件
self.driver.execute_script(r#"
    const element = arguments[0];
    const event = new Event('change', { bubbles: true });
    element.dispatchEvent(event);
"#, vec![transfer_balance.into()]).await?;

方法2:移开输入框焦点触发onchange

输入完成后,点击页面空白区域让输入框失去焦点,同样会触发onchange事件:

let transfer_balance = self
    .driver
    .find(By::XPath("//*[contains(@name, 'transfer_balance')]"))
    .await?;
transfer_balance.send_keys(amount.to_string()).await?;

// 点击页面body区域,使输入框失去焦点
self.driver.find(By::Css("body")).await?.click().await?;

方法3:修改前端阻止回车提交(若有权限修改前端代码)

在表单上添加keydown事件处理,阻止回车的默认提交行为:

// 在Yew的表单组件中添加onkeydown回调
<form onsubmit={onsubmit} id="balance-transfer-from" onkeydown={Callback::from(|e: KeyboardEvent| {
    if e.key() == "Enter" {
        e.prevent_default();
    }
})}>
    // 原有表单内容...
</form>

内容的提问来源于stack exchange,提问作者Amiya Behera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 06:45:16