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