Javascript 输入时的淘汰更改事件:验证-如果无效,则设置焦点

Javascript 输入时的淘汰更改事件:验证-如果无效,则设置焦点,javascript,jquery,knockout.js,Javascript,Jquery,Knockout.js,我有一个由knockout绑定的表,其中包含输入字段。我正在成功地使用更改事件验证其中一个输入,但我正在努力解决这一问题: 如果输入的数据不符合我的要求,我如何让knockout将焦点设置回输入 我已经尝试返回false以防止冒泡通过,但这会将焦点放在tr中的下一个输入上 标记: <script> $(document).ready(function() { mynamespace.myVm.myModel = new personalInfoViewModel();

我有一个由knockout绑定的表,其中包含输入字段。我正在成功地使用更改事件验证其中一个输入,但我正在努力解决这一问题:

如果输入的数据不符合我的要求,我如何让knockout将焦点设置回输入

我已经尝试返回false以防止冒泡通过,但这会将焦点放在tr中的下一个输入上

标记:

<script>
  $(document).ready(function() {
    mynamespace.myVm.myModel = new personalInfoViewModel();

    ko.applyBindings(mynamespace.myVmument.getElementById('divMyTable'));
  }
</script>
<div id='divMyTable'>
  <table>
    <tbody data-bind="foreach: mynamespace.myVm.myModel">
      <tr data-bind="event: { change: $root.markDirtyRow }">
        <td><input data-bind="value: dto.PersonId,
                              event: { change: $root.validateId }"></td>
        <td><input data-bind="value: dto.someValue"></td>
      </tr>
    </tbody>
  </table>
</div>

您只需使用。当它为
true
时,元素获得焦点

注意:在大多数情况下,不应使用更改事件,而应使用计算值来确定输入中的值是否有效。您可以将事件与KO一起使用,但这不是您想要的自然方式。例如,您可以创建一个名为
valid
,并使用如下绑定:
data bind=“hasFocus:!valid()”


您应该看看这一点,这将对KO中的验证有很大帮助:

然后测试它,如果这是一个问题,请添加一个新问题。IE从IE6到IE11都得到了官方支持:我不担心古老的浏览器,我们把IE10+定位于那些仍然坚持IE的人。@JimFR抱歉,我是在回答G_的评论,没关系,我也是。似乎有必要回答:)
var personInfoViewModel = function () {
  var self = this;
  var self.myModel = ko.observableArray();

  self.validateId = function (record) {
    if (doValidate(record.PersonId)) {  // for example
      self.UserData(record.PersonId);
      return true;
    } else {
      alert("Person Id " + record.PersonId + " is not recognised.");
      return false;
    }
  }
}