Javascript 移动到下一个在更改时被禁用和启用的输入
我有一个禁用的元素,我只有在将值输入到它的上一个输入后才启用它,问题是Javascript 移动到下一个在更改时被禁用和启用的输入,javascript,jquery,focus,readonly,disabled-input,Javascript,Jquery,Focus,Readonly,Disabled Input,我有一个禁用的元素,我只有在将值输入到它的上一个输入后才启用它,问题是change在输入失去焦点并且焦点移动到下一个未禁用的元素之前触发,因此删除disabled属性是不好的 HTML: $('#a').change(function(){ if (this.value === "") $('#b').attr('disabled', 'disabled'); else $('#b').removeAttr('disabled'
change
在输入失去焦点并且焦点移动到下一个未禁用的元素之前触发,因此删除disabled
属性是不好的
HTML:
$('#a').change(function(){
if (this.value === "")
$('#b').attr('disabled', 'disabled');
else
$('#b').removeAttr('disabled');
});
在继续之前,请填写以下内容:
在上一次输入后填写:
jQuery:
$('#a').change(function(){
if (this.value === "")
$('#b').attr('disabled', 'disabled');
else
$('#b').removeAttr('disabled');
});
我设法克服了这个问题,从disabled
改为readonly
,但它是只读的,而不是像我喜欢的那样被禁用,有没有好的、健壮的(防鼠标)方法来实现它,并使用readonly
需要考虑的事项:
$('#a').change(function(){
if (this.value === "")
$('#b').attr('disabled', 'disabled');
else
$('#b').removeAttr('disabled');
});
- 订阅多个活动似乎并不正确
- 用户可以在不使用键盘的情况下将文本粘贴到第一次输入
- 使用
prop
而不是attr
:
$('#b').prop('disabled', true);
还可以尝试连接到keyup
事件,而不是change
事件
这是一把小提琴:
有关更多说明,请参见此处:
使用
mouseout
:(基于下面的评论)您是否考虑过在onkeydown
或onkeydup
上添加事件
如果用户只需要输入一些内容,您可以在onkeyup
上添加一个事件,该事件进行验证并设置另一个输入元素的disabled属性
我不确定事件的顺序,但我假设焦点移动后,onkeyup
也会触发。但在这种情况下,这应该不是什么大问题。我能想到的一个例子是以下键序列:“a”backspace tab
。
我认为完美的解决方案是使用onkeydown
并在按下键之前检查键,但很难预测像backspace
和arrowdown
这样的不可读键的效果
另一个建议是:附加一个
onkeydown
侦听器并查找选项卡
键。验证该值并启用下一个输入字段
本质上:您要么需要捕获所有输入事件,要么捕获所有改变焦点的事件(如
选项卡
)。您必须在事件完成之前采取行动。我更新了我的答案:
你在问题中说过你不想订阅多个活动,但这是我能想到的唯一方法。问题在于,改变输入值的不同方法都直接与C/C++DOM接口,但它们不是通过JSAPI实现的。请参阅以了解更多关于此的信息 订阅多个活动时,一种合理的防弹方法是:
$('#a').on('keyup paste propertychange input', function() {
if (this.value === "") $('#b').prop('disabled', true);
else $('#b').removeAttr('disabled');
});
这里有一个演示:你有一个输入错误,不管怎样,我几乎肯定它不会有帮助,但我会尝试一下。更新:我在JSFIDLE上试过,但没有成功,不知道你为什么认为它会成功。@gdoron我为你添加了一个小提琴演示^ ^鼠标呢?把所有这些事件加起来似乎很复杂。如果您订阅了
keyup
,那么attr
也将同样有效@gdoron鼠标呢?虽然这是你的问题,但你似乎不知道两者之间的区别。change
在输入失去焦点之前不会触发。您使用的浏览器是什么?@Asad,“更改-当控件失去输入焦点且自获得焦点后其值已被修改时,会发生更改事件。此事件对input、SELECT和TEXTAREA.element有效。”仅供建议:如果您正在构建一个接受电子邮件或密码而不是原始文本的表单,那么在第一次输入成功验证时启用其他输入!你使用的方法是没有用的!用户将仅添加空白并解锁其他输入;)是的,它发生在输入失去焦点时,而不是之前。@AspiringAqib,我认为使用keyup粘贴会起作用,而不使用change
。用户可以不使用键盘粘贴文本,订阅多个事件似乎不适合这么简单的任务。这不是一项简单的任务。你想做活生生的形式生成,这是相当复杂的。粘贴不是问题,您将看到ctrl“v”选项卡
。“v”
之后的验证应该启用下一个输入元素。好吧,朋友们不会打架,@gdoron请解释一下你到底想要什么?因为我已经试过了你的代码,它正在工作@FritsvanCampen不使用键盘就可以粘贴。@AspiringAqib,我同意这条线变成了一团,我希望我可以删除它,但我现在不能这么做……如果你不知道KO,请忽略这个answer@namkha87对选择内容,右键单击并选择“复制”,转到输入,右键单击并选择“粘贴”。第二个输入没有发生任何变化。对不起,我更新了我的答案。你可以看看。非常简单,对:)谢谢,但是paste
和keyup
还不够吗?@gdoron我认为Opera在粘贴事件上有问题。“我会努力找到我在哪里读到的。”格多伦根本就不知道歌剧。input
事件为此提供了一个很好的回退。结果是onpaste
。