【问题标题】:How can I perform checks and screen scrolls more efficiently in Javascript? [closed]如何在 Javascript 中更有效地执行检查和屏幕滚动? [关闭]
【发布时间】:2017-04-14 17:58:38
【问题描述】:

我正在构建一个大型表单的网络应用程序。表单的顶部有五个按钮,用户单击其中一个按钮会打开一个对话框。这些按钮用于性别、体重、身高、头发颜色和眼睛颜色。

按钮开始显示类别名称和问号,如下所示:

Sex - ?
Weight - ?
Height - ?
Hair - ?
Eyes - ?

因此,例如,如果有人单击“体重”按钮,则会弹出一个 JS 对话框,允许他们选择自己的体重。一旦他们完成并关闭对话框,问号就会更改以显示他们选择的实际重量,然后他们可以单击另一个按钮。

表单的其余部分具有“普通”字段(标准输入字段),我正在使用 Jquery validate 来验证它们。一切正常,但 Jquery validate 不适用于我上面描述的按钮设置,所以我使用下面的代码自己验证它们。

基本上,我会检查其中是否有问号,如果有(这意味着用户尚未选择它),它会“显示”一个包含“必需”消息的跨度并且它会滚动到页面顶部,否则它只会滚动到第一个无效的 Jquery Validate 表单(始终位于页面下方)。

我相当肯定下面的这段代码效率很低。你同意吗?如果 Sex 仍然有问号,代码告诉屏幕滚动到顶部,但仍然需要再经过 4 次检查,这似乎是完全错误的。

      if ( $sexdisplaytext.indexOf('?') !== -1 ) {
        $('#sex-display-error').show();
        $('html,body').animate({scrollTop:0},0);
      } 
      if ( $weightdisplaytext.indexOf('?') !== -1 ) {
        $('#weight-display-error').show();
        $('html,body').animate({scrollTop:0},0);
      } 
      if ( $heighthdisplaytext.indexOf('?') !== -1 ) {
        $('#height-display-error').show();
        $('html,body').animate({scrollTop:0},0);
      } 
      if ( $hairdisplaytext.indexOf('?') !== -1 ) {
        $('#hair-display-error').show();
        $('html,body').animate({scrollTop:0},0);
      } 
      if ( $eyedisplaytext.indexOf('?') !== -1 ) {
        $('#eye-display-error').show();
        $('html,body').animate({scrollTop:0},0);
      } 

我希望有人可以帮助解释一种更有效地编写此代码的更好方法。

或者也许我过度分析了,这段代码的编写方式很好和/或效率低到不会导致性能/速度/其他方面的任何问题?

任何见解将不胜感激。

【问题讨论】:

  • 1) 你可能想看看Code Review 2) 你总是可以利用短路。 var scrollPage = checkSex || checkWeight || ...。其中一个返回true后,后面的就不会执行了。

标签: javascript jquery html css validation


【解决方案1】:
if([$sexdisplaytext,$weightdisplaytext,$heighthdisplaytext,$hairdisplaytext,$eyedisplaytext].reduce(function(status,el){
  if ( el.indexOf('?') !== -1 ) {
    el.parent.show();//TODO get the error based on its relative position in dom, like 3rd child or sth

    return true;//scroll to top
  } 
    return status;//keep old status
 },false)) $('html,body').animate({scrollTop:0},0);

只需循环遍历您的元素,然后在发现错误时滚动到顶部...

【讨论】:

  • 如果说用户忘记了 5 个“按钮”中的 3 个,这段代码只会告诉他们他们错过了一个权利(即错过的第一个)?然后,如果他们再次提交,它将告诉他们下一个(而不是显示所有 3 个已丢失)。如果是这样,我不确定这将是最好的用户体验。还是我误解了,这段代码实际上会同时显示所有“必需”消息,无论是 1 还是 4?
  • @user3304303 是的,没错。已根据您的需要进行编辑...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多