重置表单后立即执行代码 [复制]

Execute code as soon as form has been reset [duplicate]

提问人:Fabrício Matté 提问时间:7/13/2013 最后编辑:CommunityFabrício Matté 更新时间:7/13/2013 访问量:665

问:

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

该事件在表单字段重置为其默认值之前触发。因此,例如:reset

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

这是行不通的。(演示)

由于事件在浏览器处理默认表单重置行为之前触发,因此上面的代码只是在事件的默认操作发生之前设置输入,从而将输入的值恢复为其默认值。这是有道理的,这样我就可以打电话取消表单重置。resetvalueresete.preventDefault()

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

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

这是有效的,因为将在将来的某个时间执行,在完成冒泡并且浏览器处理了其默认操作之后。setTimeoutreset

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

$('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');

(演示)

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

我考虑过的解决方案:

  • 在 .这太丑陋了,我拒绝跳入地狱。setTimeoutsetTimeoutsetTimeout
  • 实现一个包装器,用于重置接受回调函数或返回 promise 对象的表单。不过,这似乎有点矫枉过正。

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


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

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

javascript jquery 表单 dom

评论

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

答:

1赞 Khanh TO 7/13/2013 #1

就您而言,我认为您只需为文本框分配一个默认值即可。重置表单时,浏览器会自动将其重置为默认值。

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

检查演示

评论

0赞 Fabrício Matté 7/13/2013
是的,我一直在思考这个问题。我的用例有点复杂,但我会尝试一下。
0赞 Khanh TO 7/13/2013
@Fabrício Matté:实际上,当您在 HTML 中设置默认值时,浏览器会将该值分配给一个特殊字段,而不是 .jsfiddle.net/5YKRk/1 检查此链接。尝试设置到你会看到不同defaultValuevaluedocument.getElementById("test").value = "Abc";
0赞 Fabrício Matté 7/13/2013
我知道文本输入的属性,但我真正的问题是元素。defaultValueselect
0赞 Khanh TO 7/13/2013
@Fabrício Matté:对于选择元素,只需设置其选项即可。查看 jsfiddle.net/5YKRk/2selected
0赞 Fabrício Matté 7/13/2013
谢谢。我以为我无法使用,因为我的元素是动态生成的,但我刚刚意识到我可以在 DOM ready 中(甚至在处理程序内)设置并且它会正常工作。再做几个测试,我就会接受答案。selectedoption.attr('selected', 'selected')reset