【问题标题】:Fill textboxes sequentially按顺序填充文本框
【发布时间】:2017-10-06 05:45:47
【问题描述】:

我有 5 个文本框(带有预填充数据)分别代表地址行 1,2,...5。要求是检查 TEXTBOX 1 是否为空,然后将数据从文本框 2 移到 1,将文本框 3 移到 2,依此类推。这是为了确保连续文本框之间没有任何空文本框。我如何在 Jquery 中实现它?如果所有文本框都是空的,我将显示必填字段错误。

这里我只是想将数据保存在一个变量中。

 custData.CustAddr1 = $("#txtCustAddr1" + value).val().trim() == "" ? $("#txtCustAddr2" + value).val() : $("#txtCustAddr1" + value).val();

在上面的代码中,我需要检查所有 5 个文本框,如果 txtbox1 为空,则使用文本框 2 中的数据,否则使用 3 else 4 else 5 中的数据。

【问题讨论】:

  • 你的代码在哪里?
  • 请输入代码...?
  • 恕我直言,这个问题的代码不需要,只是算法问题。
  • 是的.. 正是@dfsq

标签: javascript jquery conditional


【解决方案1】:

Vanilla JavaScript(下面是 jQuery 解决方案)

这是一个不使用 jQuery 的解决方案。它使用线性时间,并且在不需要时不会更新文本框的值,因此经常调用它是没有问题的。

高层次的想法是跟踪哪个是第一个空文本框,并且在遍历所有文本框时,在遇到文本框值时将它们移动到这个空文本框。

如果在此函数结束时,第一个空文本框仍然是第一个(在下面的演示代码中为firstEmpty === 0),则可以显示错误。

function enforceSequential(selector) {
  var firstEmpty = -1, current = -1,
      textboxes = document.querySelectorAll(selector);
  for (let textbox of textboxes) {
    current++;
    if (textbox.value === '') {
      if (firstEmpty < 0) {
        firstEmpty = current;
      }
    } else if (firstEmpty >= 0) {
      textboxes[firstEmpty].value = textbox.value;
      textbox.value = '';
      firstEmpty++;
    }
  }
}

document.getElementById('run').addEventListener('click', () => enforceSequential('.box'));
input {
  display: block;
  margin: 0 0 1em 0;
}
<input type="text" class="box" value="foo" />
<input type="text" class="box" value="" />
<input type="text" class="box" value="bar" />
<input type="text" class="box" value="" />
<input type="text" class="box" value="" />
<input type="text" class="box" value="baz" />
<button id="run">Run script</button>

jQuery 变体

当然,如果你想使用jQuery,你可以。

function enforceSequential(selector) {
  var firstEmpty = -1,
      textboxes = $(selector);
  textboxes.each((current, textbox) => {
    textbox = $(textbox);
    if (textbox.val() === '') {
      if (firstEmpty < 0) {
        firstEmpty = current;
      }
    } else if (firstEmpty >= 0) {
      textboxes.eq(firstEmpty).val(textbox.val());
      textbox.val('');
      firstEmpty++;
    }
  });
}

$('#run').on('click', () => enforceSequential('.box'));
input {
  display: block;
  margin: 0 0 1em 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" class="box" value="foo" />
<input type="text" class="box" value="" />
<input type="text" class="box" value="bar" />
<input type="text" class="box" value="" />
<input type="text" class="box" value="" />
<input type="text" class="box" value="baz" />
<button id="run">Run script</button>

【讨论】:

  • 非常好的解决方案。
【解决方案2】:

我认为最好的方法是:

  • 获取所有不为空的文本框值作为JS数组
  • 如果数组为空,则显示错误
  • 否则,空文本框值
  • 然后用数组值填充文本框(按正确顺序)

【讨论】:

  • 这可能没问题,或者您可以检查 txtbox[index] 是否为空,然后从 txtbox[index+1] 移动并循环索引。然后你可以在不改变代码的情况下改变文本框的数量。
  • 当然可以,但是您需要循环 o(n²)。如果前两个文本框为空,则会在 #1 中放置一个空值。您将需要从 0 到
  • 另外,如果您需要硬编码文本框的数量,那么使用上面的算法是没有用处的
  • 我认为这是最简单的解决方案。但循环解决方案可能更有趣也更棘手。
  • 这会使用大量内存来复制所有文本框值,并且当填充的文本框之间没有空文本框时会不必要地更新所有文本框值。它还将所有文本框循环两次,而循环一次就足够了。当然,当只有 5 个文本框时,这些注释在实践中根本不会引起关注。无论如何,我提供的答案确实解决了这些问题。
猜你喜欢
  • 1970-01-01
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 2012-12-07
  • 1970-01-01
  • 2018-06-05
  • 2020-10-28
  • 2019-11-08
相关资源
最近更新 更多