【问题标题】:Progress bar indicating form completion in jQuery在 jQuery 中指示表单完成的进度条
【发布时间】:2019-01-28 00:59:53
【问题描述】:

我正在使用progress 元素制作一个进度条,该元素会随着用户填写冗长表单中的字段而增加。我发现this SO thread 有助于使用data-* 属性获得一些基线功能,但我的表单具有“保存进度”功能,可以将任何输入的字段信息保存到浏览器的本地存储中,以便稍后检索。因此,如果用户返回带有已保存数据的表单,我希望该栏反映该进度。

以下是目前的工作方式——使用数据属性data-prog 的表单字段示例标记:

<!-- FORM - SAMPLE FIELD -->
<div id="form">
<div class="field-group required">
   <label for="mgd_org_name">Organization Name:</label>
   <div>
      <input id="mgd_org_name" type="text" name="mgd_org_name" placeholder="Please enter your organization's name" required data-prog="6">
   </div>
</div>
</form>

<!-- Progress bar -->
<div id="form-progress">
    <p>Form Progress</p>
    <progress max="100" value="0" id="progress"></progress>
</div>

到目前为止的 jQuery:

$(function() {
    // get all form inputs w/ data-prog values
    var inputs = $('#dossier-form').find('input[data-prog], textarea[data-prog]');
    var progBar = $('#progress');
    var progVal = 0;

    $(inputs).change(function() {
        if ($(this).val().length > 0) {
            progVal += $(this).data('prog');
            progBar.attr('value', progVal);
        }
    });

});

这样,每个字段都有一个data-prog 值,该值将添加到progVal 并反映在进度条级别中。我遇到的问题是为任何可能已经在加载时填写的表单字段加载 initial 值 - 因此,我需要找到所有输入值的字段,添加关联的 @ 987654329@ 值,并最初将该值加载到进度条中。如果字段被清除,我还想相应地减少进度值。

对于初始加载,我一直在尝试类似以下的方法(不起作用):

var inputsSaved = $(inputs).val();
if($(inputsSaved).length > 0) {
    progVal = $(inputs).data('prog');
    console.log('has existing progress');
} else {
    progVal = 0;
    console.log('does not have existing progress');
}

我不太确定如何找到在加载时输入文本的字段并获取相关的 prog 值,也不确定如何在清除字段时相应地减小值。非常感谢这里的任何帮助!

【问题讨论】:

  • 这是一项不平凡的任务。为什么不接受一个虚假的进步,或者一个不确定的进步呢?
  • @IvanRubinson 你能详细说明你所说的虚假/无限进展是什么意思吗?另外,有没有办法查看哪些字段在加载时输入了数据,并将各自的data-prog 值相加?这是我最关心的部分。
  • 1) 除非您真的想为每个输入分配不同的进度百分比...为什么不只计算填充的数量除以总数? 2) 然后localStorage可以用来填充之前输入的值...当然。
  • @LouysPatriceBessette 您介意发布一个显示该解决方案的答案吗?这个想法是为需要更多努力的问题分配更高的价值,但我可能会放弃这种方法并尝试你的建议。
  • 好的,我了解了“努力”方面......我有一个想法可以让你保留它。给我几分钟。

标签: javascript jquery forms user-interface progress-bar


【解决方案1】:

首先,您的inputs 选择器可以替换为:

var inputs = $('#dossier-form [data-prog]');

那么,$(inputs).change(...inputs 已经是一个 jQuery 对象了。无需使用$() 包装。

您的进度更新功能正确。我只是将它放在一个命名函数中,以便能够从代码中的不同位置调用它(并避免重复代码)。

我添加了localStorage 保存和检索...

$(function() {

  // get all form inputs w/ data-prog values
  var inputs = $('#dossier-form [data-prog]');
  var progBar = $('#progress');
  var progVal = 0;

  // Establish the "dificulty unit" base.
  var totalDifficulty = 0;
  inputs.each(function(){
    totalDifficulty += $(this).data('prog');
  });

  var difficultyUnit = 100/totalDifficulty;

  // Update progressbar
  function updateProgress(el){
    progVal += parseFloat($(el).data('prog')) * difficultyUnit;
    progBar.val(progVal);
  }

  // LocalStorage on load
  inputs.each(function(){
    var value = localStorage.getItem(this.id);
    if(value !=null && value !=""){
      $(this).val(value);
      updateProgress(this);
    }
  });  // End load from LocalStorage

  // Blur handler to save user inputs
  inputs.on("blur",function(){
    // Reset the progress
    progVal = 0;
    progBar.val(progVal);

    // Loop through all inputs for progress
    inputs.each(function(){
      if ($(this).val().length > 0) {
        updateProgress(this);
      }

      // LocalStorage
      localStorage.setItem(this.id,this.value);
    });
  });  // End on blur

});  // End ready

localStorage 在 SO sn-ps 中是不允许的...所以看看这个CodePen


因此,您现在可以给出一些“难度级别”,而不必担心所有data-prog 获得的总和为 100。只需给出您喜欢的任意数字即可。 ;)

【讨论】:

  • 大声笑...我觉得我在这里做了太多...你的问题引起了我的兴趣! ;) 告诉我它是否符合您的需求!
  • 哇,这太棒了!谢谢 - 我也会试试这个。我想这也会帮助其他人。
  • 快速提问 - 我已经有了将表单数据保存到本地存储和清除功能的按钮,您认为我仍然可以按原样使用您的功能,而不会出现与本地存储相关的任何问题吗?再次感谢 - 你应该把它变成一个插件!
  • 我不知道...试试吧!在我上面的代码中,它是一个加载“填充”和一个模糊处理程序。因此,如果您已经有要保存的按钮,只需删除模糊处理程序即可。
  • 我的兴趣点是“难度级别”的概念...例如,您可以只有 5 个级别,例如 1 = 容易填充和 5 = 困难。然后在表格中输入您需要的金额,而不用关心总数。 ;) 所以你可以随时添加一个输入或根据你的感觉改变难度。
【解决方案2】:

如果你总是从头开始累加进度,你可以在这两种情况下做同样的事情。

$(function() {

    // get all form inputs w/ data-prog values
    var inputs = $('#dossier-form').find('input[data-prog], textarea[data-prog]');
    var progBar = $('#progress');

    function update () {
        var progVal = 0;
        inputs.each( function () {
            if ($(this).val().length > 0) {
                progVal += Number( $(this).data('prog') );
            }
        })
        progBar.attr('value', progVal);
    }

    inputs.change( update );

    // Fill in fields from localStorage, then:
    update();

});

【讨论】:

  • 谢谢!我会试一试。
猜你喜欢
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2012-08-26
  • 1970-01-01
  • 2011-06-07
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多