【问题标题】:Dynamic Progress Bar For Drop-Down Lists下拉列表的动态进度条
【发布时间】:2014-06-16 02:01:29
【问题描述】:

我希望我的页面显示一个进度条,当用户在下拉列表中选择选项时该进度条会填满。到目前为止,我已经能够设置变量以包含下拉列表的值,以及改变条形值的函数,但没有任何东西可以一起工作。这是下拉列表之一:

<select id="optionA">
    <option value=" " disabled selected>Choose One...</option>
    <option value="mike">Mike</option>
    <option value="ryce">Andrew</option>
    <option value="michael">Michael</option>
    <option value="dannyl">Danny</option>
    <option value="cozz">Cozz</option>
    <option value="drew">Andrew</option>
    <option value="pete">Pete</option>
    <option value="sean">Sean</option>
    <option value="dom">Dom</option>
    <option value="marc">Marc</option>
    <option value="lou">Lou</option>
    <option value="rob">Rob</option>
    </select>

目前有两个相同的下拉菜单,即 id="optionA" 和 id="optionB"。这是我尝试过的脚本:

var optAVal; 
var optBVal; 

$('#optA').on('change', function() {
    var optAVal = this.value;  
}); 

$('#optB').on('change', function() {
    var optBVal = this.value;
}); 

if (optAVal == " " && optBVal == " ") {
    $("#progressBar").attr('value','0')
;} 

if (optAVal !== " " || optBVal !== " ") {
    $("#progressBar").attr('value','50');
}

if (optAVal !-- " " && optBVal !== " ") {
    $("#progressBar").attr('value','100');
}

您可以看到这个想法是,如果两者都没有选择,则条显示为 0,如果选择了其中一个,则显示为 50,如果两者都被选中,则显示为 100,问题是没有任何工作正常。我尝试了几种不同的组合,包括将 if 语句嵌套在 $('#optX').on('change', function() {});并且此当前组合将进度条设置为加载时的 100%。提前感谢帮助。谢谢!!!

【问题讨论】:

  • optA 和progressBar 在哪里?
  • 你有 optionA 作为 id 但你使用了 optA
  • 你是对的,很好,但这只是一个错字。我的错。

标签: javascript jquery dynamic drop-down-menu progress-bar


【解决方案1】:

除了小错误和拼写错误之外,基本问题是在初始加载后永远不会调用您的条件。因此进度条永远不会更新。

如果你像这样使用html:

<select id="optionA">
    <option value=" " disabled selected>Choose One...</option>
    <option value="mike">Mike</option>
    ...
</select>
<select id="optionB">
    <option value=" " disabled selected>Choose One...</option>=
    <option value="rob">Rob</option>
    ...
</select>
<progress id='progressBar' max='100' value='0'></progress>

JQuery 是这样的:

var doneA = false;
$('#optionA').on('change', function() {
    if (!doneA) {
        $("#progressBar").attr('value', $("#progressBar").prop('value')+50);
        doneA = true;
    }
}); 

var doneB = false;
$('#optionB').on('change', function() {
    if (!doneB) {
        $("#progressBar").prop('value', $("#progressBar").attr('value')+50);
        doneB = true;
    }
});

结果应该如你所愿。这是一个要验证的工作 JSFiddle:http://jsfiddle.net/wLt4z/2/


编辑 1: 如果您想更聪明一点,您可以为每个表单选项分配一个共享类,如 class='formOption',并制作一个通用的 JQuery 来适当地更新进度条。例如:

$('.formOption').data("done", false);
$('.formOption').on('change', function() {
    if (!$(this).data("done")) {
        $("#progressBar").attr('value', $("#progressBar").prop('value')+100/$('.formOption').length);
    $(this).data("done", true);
    }
});

编辑 2: 更新以确保更改值不会增加完成百分比。在这两种情况下,这都是通过一个简单的布尔标志来完成的,它实际上取代了检查值。

【讨论】:

  • 迈克尔,再次感谢您的回答。不过,我确实注意到了一个小问题:我只希望每次下拉菜单都发生一次。这个想法有点像“你已经完成了第一步,然后是第二步,太棒了!”之类的事情。使用您的代码,如果您打开任一下拉菜单并选择一个选项,然后再次打开它并选择一个新选项,则该栏将继续填满。是否有类似于 .on('firstchange', ...) 或类似效果的东西?谢谢!!
  • 很抱歉。我搞砸了。没有什么能比得上 firstchange(请参阅 javascriptkit.com/jsref/events.shtml 了解事件列表),但您可以使用简单的布尔标志使其工作。查看我对答案所做的更改。
  • 完美!再次感谢,迈克尔。仅供参考,出于某种原因,我不得不切换 .attr 和 .prop 的顺序以相互匹配,否则当您选择第二个值时,条形将完全填满(我只希望它们各占 25%,因为会有还有两个下拉菜单可供选择)。
猜你喜欢
  • 2019-08-08
  • 1970-01-01
  • 2012-11-13
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多