这两天在公司项目中,维护phtml文件,有个相互制约的联动且自定义select,想了好久才解决问题,这里主要运用到了元素属性textContent。
- 需要注意点有
1> 事件的产生的先后顺序
2> 事件内容状态的暂存
- 代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<style>
body,
p,
ul,
li {
padding: 0;
margin: 0;
}
li {
list-style: none;
}
.list {
margin: 50px;
}
.content {
position: relative;
width: 150px;
height: 25px;
border: 1px solid gray;
}
.content:after {
content: '';
position: absolute;
right: 0;
top: 0;
height: 25px;
width: 25px;
background: gray;
}
.select-ul {
display: none;
width: 150px;
}
.select-ul li {
width: 150px;
border: 1px solid red;
}
.caret {
position: absolute;
top: 0;
right: 0;
width: 25px;
height: 25px;
}
.caret:after {
content: '';
position: absolute;
border-width: 5px;
border-style: solid;
left: 10px;
top: 8px;
z-index: 15;
border-color: transparent transparent transparent red;
transition: all 0.1s linear;
transform: rotate(0deg);
}
.caret_after:after {
border-width: 5px;
border-style: solid;
border-color: transparent transparent transparent red;
transform: rotate(90deg);
}
.para{
text-align:center;
height:100%;
}
.restrict{
background:black;
display: inline-block;
color:white;
padding:5px;
border:3px;
cursor: pointer;
margin-right:10px;
}
.active{
background:lawngreen;
}
</style>
<body>
<div class="list">
<span class="active restrict">5</span>
<span class="restrict">10</span>
<span class="restrict">15</span>
<span class="restrict">20</span>
<div class="content">
<p class="para">0</p>
<span class="caret"></span>
</div>
<ul class="select-ul">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
<li>6</li>
<li>7</li>
<li>8</li>
<li>9</li>
<li>10</li>
<li>11</li>
<li>12</li>
<li>13</li>
<li>14</li>
<li>15</li>
<li>16</li>
<li>17</li>
<li>18</li>
<li>19</li>
</ul>
</div>
</body>
<script>
var oUl = document.getElementsByClassName("select-ul")[0];
var oContent = document.getElementsByClassName("content")[0];
var oCaret = document.getElementsByClassName("caret")[0];
var oPara = document.getElementsByClassName("para")[0];
var oParaText = '';
// 获得默认状态值
oPara.onclick = function(){
oParaText = this.textContent
}
// 判断是否展示自定义下拉框
oContent.onclick = function () {
if (oUl.style.display == "block") {
oUl.style.display = "none";
oCaret.classList.remove('caret_after');
return;
}
oCaret.classList.add('caret_after');
oUl.style.display = "block";
}
// 点击每个列表中的元素,并且赋值在选项框
var oLi = document.getElementsByTagName("li");
for (var i = 0; i < oLi.length; i++) {
oLi[i].onclick = function () {
if(Number(restrictSpanText) >= Number(this.textContent)){
oPara.textContent = this.textContent;
}
else{
oPara.textContent = oParaText;
alert('所选数字大于限制数字,请重选');
}
oContent.click();
}
}
// 捕获限制元素
var oRestrict = document.getElementsByClassName("restrict");
// 限制文本,默认设置个值
var restrictSpanText = oRestrict[0].textContent;
// 添加日期限制事件
for(var i = 0; i< oRestrict.length;i++){
oRestrict[i].onclick = function(){
for(var j = 0 ; j < oRestrict.length;j++){
if(Number(oPara.textContent) > this.textContent){
alert("所选限制数字与文本框数字相矛盾,请重新选择");
return;
}
if(this!=oRestrict[j]){
oRestrict[j].classList.remove("active");
}
this.classList.add("active");
restrictSpanText = this.textContent;
}
}
}
</script>
</html>
如有更好的办法,请指出,顺便吐槽下公司以前写的项目,代码真TM的乱
补充2018-07-05 自定义下拉列表,并实现多选
代码如下,原理同上,注意的是字符间的空格
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<style>
body,
p,
ul,
li {
padding: 0;
margin: 0;
}
li {
list-style: none;
}
.list {
margin: 50px;
}
.content {
position: relative;
width: 150px;
height: 25px;
border: 1px solid gray;
}
.content:after {
content: '';
position: absolute;
right: 0;
top: 0;
height: 25px;
width: 25px;
background: gray;
}
.select-ul {
display: none;
width: 150px;
}
.select-ul li {
width: 150px;
border: 1px solid red;
}
.caret {
position: absolute;
top: 0;
right: 0;
width: 25px;
height: 25px;
}
.caret:after {
content: '';
position: absolute;
border-width: 5px;
border-style: solid;
left: 10px;
top: 8px;
z-index: 15;
border-color: transparent transparent transparent red;
transition: all 0.1s linear;
transform: rotate(0deg);
}
.caret_after:after {
border-width: 5px;
border-style: solid;
border-color: transparent transparent transparent red;
transform: rotate(90deg);
}
.para {
text-align: center;
height: 100%;
}
</style>
<body>
<div class="list">
<div class="content">
<p class="para"></p>
<span class="caret"></span>
</div>
<ul class="select-ul">
<li>
<input type="checkbox">1</li>
<li>
<input type="checkbox">2</li>
<li>
<input type="checkbox">3</li>
<li>
<input type="checkbox">4</li>
<li>
<input type="checkbox">5</li>
<li>
<input type="checkbox">6</li>
<li>
<input type="checkbox">7</li>
<li>
<input type="checkbox">8</li>
<li>
<input type="checkbox">9</li>
<li>
<input type="checkbox">10</li>
<li>
<input type="checkbox">11</li>
<li>
<input type="checkbox">12</li>
<li>
<input type="checkbox">13</li>
<li>
<input type="checkbox">14</li>
<li>
<input type="checkbox">15</li>
<li>
<input type="checkbox">16</li>
<li>
<input type="checkbox">17</li>
<li>
<input type="checkbox">18</li>
<li>
<input type="checkbox">19</li>
</ul>
</div>
</body>
<script>
var oUl = document.getElementsByClassName("select-ul")[0];
var oContent = document.getElementsByClassName("content")[0];
var oCaret = document.getElementsByClassName("caret")[0];
var oPara = document.getElementsByClassName("para")[0];
// 判断是否展示自定义下拉框
oContent.onclick = function () {
if (oUl.style.display == "block") {
oUl.style.display = "none";
oCaret.classList.remove('caret_after');
return;
}
oCaret.classList.add('caret_after');
oUl.style.display = "block";
}
// 点击每个列表中的元素,并且赋值在选项框
var oLi = document.getElementsByTagName("li");
for (var i = 0; i < oLi.length; i++) {
oLi[i].onclick = function (ev) {
if (ev.target.nodeName.toLowerCase() == "input") {
var existIndex = 0;
if (this.getElementsByTagName("input")[0].checked) {
if (!oPara.textContent.replace(/\s| /g, "")) { //因为本身html格式的原因【即换行的问题,所以即使数字去掉了,但会有换行和空格字符串,所以得把这两个给替换掉】,
oPara.textContent = this.textContent;
}
else {
oPara.textContent = oPara.textContent + ',' + this.textContent;
}
}
else {
existIndex = oPara.textContent.indexOf(this.textContent)
if (existIndex == oPara.textContent.length) {
// 当字母为最后一个的时候
oPara.textContent = oPara.textContent.slice(0, existIndex - 1) + oPara.textContent.slice(existIndex + this.textContent.length, oPara.textContent.length);
}
else if(existIndex == 0){
// 当字母为第一个的时候
oPara.textContent = oPara.textContent.slice(existIndex + this.textContent.length+1, oPara.textContent.length);
}
else{
// 当字母为中间的时候
oPara.textContent = oPara.textContent.slice(0, existIndex - 1) + oPara.textContent.slice(existIndex + this.textContent.length, oPara.textContent.length);
}
}
}
}
}
</script>
</html>