我有一个密码强度栏,它使用li
项目,这些项目使用不同的颜色设置,以向用户表明他们的密码有多强,例如:
<input type="password" name="password" id="password" placeholder="Password">
<ul id="passwordStrength">
<li class="point-reg"></li>
<li class="point-reg"></li>
<li class="point-reg"></li>
<li class="point-reg"></li>
</ul>
当通过一组if
语句满足regEx条件时,counter
会递增,switch
语句会为每个语句添加必要的CSS background
属性li
项,取决于counter
值。
var password_li = $('#passwordStrength').find('li');
var counter = 0;
if(pw.match(/[A-Z]/) && pw.match(/[a-z]/)) {
counter++;
}
//further regex if statements
switch(counter) { //patrick
case 0:
break;
case 1:
$(password_li[0]).css('background', '#e30613'); //first li
break;
case 2:
$(password_li[0]).css('background', '#e30613'); //first li
$(password_li[1]).css('background', '#f9b233'); //second li
break;
case 3:
$(password_li[0]).css('background', '#e30613'); //first li
$(password_li[1]).css('background', '#f9b233'); //second li
$(password_li[2]).css('background', '#53ab58'); //third li
break;
case 4:
$(password_li[0]).css('background', '#e30613'); //first li
$(password_li[1]).css('background', '#f9b233'); //second li
$(password_li[2]).css('background', '#53ab58'); //third li
$(password_li[3]).css('background', '#418746'); //fourth li
break;
}
这似乎不是设置li
项目样式的最有效方式。此外,如果用户然后删除他们输入的值,li
项目仍然是他们已分配的颜色,而不是恢复为默认的灰色,这是有道理的,因为没有功能在适当的位置删除样式。我可以为li
项添加灰色,具体取决于case
语句中符合switch
的内容,如下所示:
case 1:
$(password_li[0]).css('background', '#e30613');
$(password_li[1]).css('background', '#dcdcdc');
$(password_li[2]).css('background', '#dcdcdc');
$(password_li[3]).css('background', '#dcdcdc');
break;
但同样,这似乎不是最有效的应用程序。
问题
如何处理此功能,以便动态添加和删除li
元素的样式?
这是JSFiddle
答案 0 :(得分:2)
首先,实际上有一种删除样式的方法。只需将其设置为空:
['moduleA/client']
但是如果你喜欢用更少的迭代来做,你可以用CSS类来做。只需将您的父元素设置为一个类,该类将有一个$(password_li[0]).css({
background: ""
});
// I guess that can be done inline too
$(password_li[0]).css("background", "");
选择器,它将根据位置单独设置每个子项的颜色。
nth-child
然后您可以根据计数器将类添加到父级,如此
<style>
.list1 > li:nth-child(1) {
background: #e30613;
}
.list2 > li:nth-child(2) {
background: #f9b233;
}
.list3 > li:nth-child(3) {
background: #53ab58;
}
.list4 > li:nth-child(4) {
background: #418746;
}
.list5 > li:nth-child(5) {
background: red;
}
.list6 > li:nth-child(6) {
background: blue;
}
</style>
<input type="password" name="password" id="password" placeholder="Password">
<ul id="passwordStrength">
<li class="point-reg"></li>
<li class="point-reg"></li>
<li class="point-reg"></li>
<li class="point-reg"></li>
</ul>
在不需要时删除它们
counter && $("#passwordStrength").addClass("list" + counter);
通过这种方式,您可以按照建议将样式放在其他文件中,而不是使用内联样式,这是不鼓励的。
答案 1 :(得分:1)
我建议添加/删除CSS类,而不是操纵CSS规则。
您可以使用自定义<li>
前缀属性来保留要与data-*
元素一起添加的类。
然后,您可以使用.filter()
方法和:lt()
选择器定位需要添加类的元素。
$(document).ready(function() {
var password_li = $('#passwordStrength').find('li');
$('#password').bind('keyup', function() {
var counter = 0;
var pw = $(this).val();
if (pw.length >= 8) {
counter++;
}
if (pw.match(/\d/)) { //match digit
counter++;
}
if (pw.match(/[A-Z]/) && pw.match(/[a-z]/)) { //match digit
counter++;
}
if (pw.match(/[$@$!%*#?&]/)) { //match digit
counter++;
}
//Get all classes to remove
var clssesToRemove = password_li.map(function() {
return $(this).data('matched-class');
}).get().join(' ');
//Remove all class
password_li.removeClass(clssesToRemove);
//Filter and add class
password_li.filter(':lt(' + counter + ')').each(function() {
$(this).addClass($(this).data('matched-class'));
});
})
})
ul#strength {
display: inline;
list-style: none;
padding: 0;
vertical-align: 2px;
}
.point-reg {
background: #DDD;
border-radius: 2px;
display: inline-block;
height: 10px;
margin-right: 2px;
width: 30px;
}
.first {
background-color: #e30613;
}
.second {
background-color: #f9b233;
}
.third {
background-color: #53ab58;
}
.fourth {
background-color: #418746;
}
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-beta/css/bootstrap.min.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="row">
<div class="col-xl-8 offset-xl-2">
<div class="form-group row">
<div class="col-md-12">
<input type="password" name="password" class="form-control pill-radius font-body" id="password" placeholder="Password">
</div>
<div class="form-group row">
<div class="col-md-12">
<ul id="passwordStrength">
<li class="point-reg" data-matched-class="first"></li>
<li class="point-reg" data-matched-class="second"></li>
<li class="point-reg" data-matched-class="third"></li>
<li class="point-reg" data-matched-class="fourth"></li>
</ul>
</div>
</div>
</div>
</div>
</div>
答案 2 :(得分:0)
也许你可以做这样的事情
colours = [
'#e30613',
'#f9b233',
'#53ab58',
'#53ab58'
];
for (i = 0; i < counter; i++) {
$("password_li[" + i + "]").css('background', colours[i]);
}
您可以按以下方式重置所有颜色:
$("password_li").css('background', '#dcdcdc');