2

我正在处理的 Web 应用程序中有以下情况:

我有一个带有一组索引字段值的表单,用户在其中输入信息,然后将表单提交到服务器。字段验证在服务器上进行。如果发现任何字段无效,则重新显示表单,我希望输入焦点自动转到第一个无效字段。我已经准备好实现它的代码,但问题是焦点没有放在 IE 10 中的字段上(但它被放在 Firefox 中)。

  placefocusonfirstinvalidindexfield();

  // After an attempt to upload has failed due to one or more invalid fields, then place the input focus automatically on the first
  // invalid field:
  function placefocusonfirstinvalidindexfield() {
    var hasattemptedupload = '@Model.HasAttemptedUpLoadNumeric';
    if (hasattemptedupload == 1) {
      var indexfirstinvalidfield = '@Model.GetIndexOfFirstInvalidField()';
      // focusIndexField(indexfirstinvalidfield);
      setTimeout(focusIndexField(indexfirstinvalidfield), 100);
    }
  }

  function focusIndexField(fieldindex) {
    var control = document.getElementById("field" + fieldindex);
    control.focus();
  }

在上面的代码中,我已经确认引用了正确的字段。一切似乎都应该如此,除了在进程结束时,IE10 不会将焦点放在引用的字段上。为什么不呢?我该怎么做才能做到这一点?

4

2 回答 2

1

刚刚在控制台中尝试了这个以在 IE 中进行测试。当测试焦点在此页面上的“发布您的答案”文本区域时,以下代码运行良好。

setTimeout(function() { document.getElementById("wmd-input").focus() }, 5000);

也许您的代码中还有其他东西干扰了焦点?您是否尝试过扩展超时值以查看它是否与此有关?

于 2013-10-03T19:40:16.070 回答
0

您正在尝试使用这一行来解决 DOM 加载问题,对吗?

setTimeout(focusIndexField(indexfirstinvalidfield), 100);

该行没有按您的预期工作。focusIndexField 立即执行,函数的响应被 setTimeout 函数延迟 100 毫秒。

这将按您的预期工作:

setTimeout(function() {focusIndexField(indexfirstinvalidfield)}, 100);

但是,这不是一个好的解决方案。代码应该在文档准备好时执行。

于 2013-10-03T19:44:26.020 回答