【问题标题】:Execute code as soon as form has been reset [duplicate]表单重置后立即执行代码[重复]
【发布时间】:2013-07-13 08:09:00
【问题描述】:

如何在表单重置后立即运行一段代码?

reset 事件在表单字段重置为默认值之前触发。所以,例如:

$('form').on('reset', function(e) {
    $('input').val('a value that should be set after the form has been reset');
});

这行不通。 (Demo)

由于reset 事件在浏览器处理默认表单重置行为之前触发,上面的代码只是在reset 事件的默认操作发生之前设置输入的value,将输入的值恢复为其默认值.这是有道理的,所以我可以调用e.preventDefault() 来取消表单重置。

我的用例需要在表单重置后立即执行代码。在简单的情况下,setTimeout 就足够了:

$('form').on('reset', function(e) {
    setTimeout(function() {
        $('input').val('yay it works now');
    }, 0);
});

这是可行的,因为setTimeout 将在未来的某个时间执行,在reset 完成冒泡并且浏览器已处理其默认操作之后。

但是,这会失去同步性。一旦我必须以编程方式重置表单并从另一个地方操作它,一切都会付诸东流。

$('form').on('reset', function(e) {
    setTimeout(function() {
        $('input').val("reset'd value");
    }, 0);
});

//somewhere in another module..
$('form').trigger('reset');
$('input').val('value after resetting the form');

(Demo)

当然,一切都应该同步发生,但只有我的 reset 事件处理被推送到将来异步运行,因此它在所有当前同步代码都执行后才运行,而应该是在表单重置后立即运行。

我考虑过的解决方案:

  • 使用另一个setTimeoutsetTimeout 之后运行。这太丑陋了,我拒绝跳入setTimeout 地狱。
  • 实现一个用于重置表单的包装器,它采用回调函数或返回一个承诺对象。不过,这似乎有点矫枉过正。

如果只存在 afterreset 事件。好吧,我是否忽略了某些事情,或者解决方案是我唯一的选择吗?


我在搜索时遇到了这些问题:

但是他们的标题(恕我直言)有点误导,因为这些标题实际上与我的问题相去甚远。

【问题讨论】:

  • 浏览器完成默认操作后,也无法“处理”事件,对吧?这是相当令人沮丧的。
  • 只是出于好奇,什么用例提示您这样做?
  • @Blender 我有一些Select2 实例。我想在重置表单时将其数据设置为我的默认值,但是在我设置 Select2 数据后,它们对应的 select 元素将重置它们的 selectedIndex 。 :(
  • 这个question和你的问题相似吗
  • @Yogesh 哦,谢谢,我曾想过与.on('reset', fn) 类似的东西,但这会陷入无限循环(因为香草form.reset() 确实会触发.on('reset', fn),我已经经过测试),接受的答案使用click 处理程序作为重置按钮 mhm 我想它可能会有所帮助。如果可行,我将进行试验并将其标记为欺骗,否则我将更新问题。

标签: javascript jquery forms dom


【解决方案1】:

在你的情况下,我认为你只是简单地为你的文本框分配一个默认值。当表单被重置时,浏览器会自动将其重置为默认值。

<form>
    <input value="Abc" type="text"/>
    <input type="reset" />
</form>

检查demo

【讨论】:

  • 是的,我一直在考虑这个问题。我的用例有点复杂,但我会尝试一下。
  • @Fabrício Matté:实际上,当您在 HTML 中设置默认值时,浏览器会将值分配给特殊的 defaultValue 字段,而不是 value。检查此链接jsfiddle.net/5YKRk/1。尝试设置为document.getElementById("test").value = "Abc"; 你会看到不同
  • 我知道 defaultValue 文本输入属性,但我真正的问题是 select 元素。
  • @Fabrício Matté:对于选择元素,只需为其选项设置selected。见jsfiddle.net/5YKRk/2
  • 谢谢。我以为我无法使用selected,因为我的option 元素是动态生成的,但我刚刚意识到我可以在DOM 准备好(甚至在reset 处理程序中)设置.attr('selected', 'selected'),它会工作正常。只需再进行几次测试,我就会接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2015-02-28
  • 1970-01-01
  • 2013-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多