【问题标题】:Moving to the next input which was disabled and enabled onchange移动到下一个被禁用和启用 onchange 的输入
【发布时间】:2013-01-02 17:14:05
【问题描述】:

我有一个禁用的元素,只有在将值输入到它的前一个输入后才启用它,问题是change 在输入失去焦点之前触发并且焦点移动到下一个未禁用的元素,所以删除@ 987654324@属性那就不行了。

HTML:

Fill this before you continue:      <input id="a" />
Fill this after the previous input: <input id="b" disabled="disabled" />​

jQuery:

$('#a').change(function(){
    if (this.value === "")
        $('#b').attr('disabled', 'disabled');
    else
        $('#b').removeAttr('disabled');
});​

Fiddle

我设法通过从disabled 更改为readonly 来克服这个问题,但是它是只读的,而不是我喜欢的禁用,是否有好的和强大的(鼠标证明)方法来实现它并使用readonly?

需要考虑的事项:

  • 订阅多个事件似乎并不正确。
  • 用户可以在不使用键盘的情况下将文本粘贴到第一个输入。

【问题讨论】:

  • change 在输入失去焦点之前不会触发 AFAIK。你用的是什么浏览器?
  • @Asad, "change- 当控件失去输入焦点时发生更改事件,并且在获得焦点后其值已被修改。此事件适用于INPUT、SELECT 和 TEXTAREA. 元素。" Spec
  • 仅供建议:如果您正在构建一个接收电子邮件或密码而不是原始文本的表单,则在成功验证第一个输入时启用另一个输入!你用的方法没有用!人们只会添加空格并解锁其他输入;)
  • 是的,它发生在输入失去焦点时,而不是之前。
  • @AspiringAqib,我认为使用 keyup 粘贴会起作用,而不是 change

标签: javascript jquery focus readonly disabled-input


【解决方案1】:

您在问题中说过您不想订阅多个事件,但这是我能想到的唯一方法。问题是改变输入值的不同方式都直接与 C/C++ DOM 接口,但它们不通过 JS API 来完成。有关更多信息,请参阅this question

在订阅多个事件时,一种合理的防弹方式是:

$('#a').on('keyup paste propertychange input', function() {
    if (this.value === "") $('#b').prop('disabled', true);
    else $('#b').removeAttr('disabled');
});

这是一个演示:http://jsfiddle.net/HmzYR/

【讨论】:

  • 谢谢,但pastekeyup 还不够吗?
  • @gdoron 我认为 Opera 的粘贴事件有问题。我会试着找到我在哪里读到的。
  • @gdoron 原来是 Opera doesn't support paste eventsinput 事件为此提供了一个很好的回退。
  • 结果是onpaste isn't in the spec at all
【解决方案2】:

您是否考虑在onkeydownonkeyup 上添加活动?

如果用户只需要输入 something,您可以在 onkeyup 上添加一个事件,该事件会进行验证并设置其他输入元素的 disabled 属性。

我不确定事件的顺序,但onkeyup 也会在焦点移动后触发,我会假设。但在这种情况下,这应该不是什么大问题。我能想到的一种情况是以下键序列:"a" backspace tab。 我想完美的解决方案是使用onkeydown 并在按下之前检查键,但是很难预测backspacearrowdown 这样的不可读键的影响。 p>


另一个建议:附加一个onkeydown 侦听器并查找tab 键。验证值并启用下一个输入字段。


本质上:您要么需要捕捉所有输入事件,要么需要捕捉所有改变焦点的事件(如tab)。而且您必须在事件完成之前采取行动。

【讨论】:

  • 用户无需使用键盘即可粘贴文本,而且订阅多个事件似乎不适合这么简单的任务。
  • 这不是一个简单的任务。你想做实时表格生成,这很复杂。粘贴不是问题,你会看到ctrl "v" tab"v" 之后的验证应该启用下一个输入元素。
  • 好吧,哥们不要打架,@gdoron 请解释一下你到底想要什么?因为我已经尝试过你的代码并且它正在工作!
  • @FritsvanCampen 不用键盘也可以粘贴。
  • @AspiringAqib,我同意这个帖子变成了一堆,我希望我可以删除它,但我现在不能这样做......
【解决方案3】:

使用prop 而不是attr

$('#b').prop('disabled', true);

还可以尝试挂钩keyup 事件而不是change 事件。

这是一个小提琴:http://jsfiddle.net/maniator/swubm/3/

更多解释请看这里:.prop() vs .attr()


使用mouseout处理剪切和粘贴的小提琴:http://jsfiddle.net/maniator/swubm/4/(基于下面的cmets)

【讨论】:

  • 你有一个错字,无论如何我几乎可以肯定它不会有帮助,但我会试一试。 更新:我在 jsFiddle 上试过,但没有用,不知道你为什么认为它会。
  • @gdoron 我为你添加了一个小提琴演示 ^_^
  • 鼠标呢?添加所有这些事件似乎很复杂。如果您订阅了keyup,那么attr 也一样!
  • @gdoron 鼠标呢?
  • 虽然这是您的问题,但您似乎并不知道两者之间的区别。
【解决方案4】:

我更新了我的答案:http://jsfiddle.net/swubm/10/

Fill this before you continue:
<input id="a" />
<br>
<br>
Fill this after the previous input
<input id="b" disabled />​

JS:

$('#a').bind('input propertychange', function() {
    var value = $('#a').val();
    if (value == "")
        $('#b').attr('disabled', 'disabled');
    else
        $('#b').removeAttr('disabled');

});

【讨论】:

  • 如果你不知道KO,请忽略这个答案
  • @namkha87 是的。选择一些东西,右键单击并选择复制,转到输入,右键单击并选择粘贴。第二个输入没有任何反应。
  • 对不起,我更新了我的答案。你可以看看。很容易吧:)
猜你喜欢
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 2012-10-08
相关资源
最近更新 更多