两个相同的元素需要执行相同的功能,但存在冲突
Two identical elements needing to do the same function, but are conflicting
所以我有一个加号/减号div,当单击按钮时,它将添加或减去一个值。我的问题是,当我把其中两个放在一页上时,它们会相互冲突。
我如何调整它们,使它们不会发生冲突?
您可以在此处查看工作代码:http://codepen.io/maudulus/pen/yjnHv
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="css.css">
<script type="text/javascript" src="main.js"></script>
</head>
<div class="doors">
<div class="miniDoor left">-</div>
<input id="middle" placeholder="0"/>
<div class="miniDoor right">+</div>
</div>
<br><br><br><br><br><br><br>
<div class="doors">
<div class="miniDoor left">-</div>
<input id="middle" placeholder="0"/>
<div class="miniDoor right">+</div>
</div>
$(function(){
$('.left').on('click',function() {
subtractInputValue(this)
});
$('.right').on('click',function() {
addInputValue(this)
});
});
function addInputValue(thisDiv) {
inputVal = $(thisDiv).parent().children('input').val()
if (inputVal == "") {
$(thisDiv).parent().children('input').val(1)
} else {
$('#middle').val(eval(inputVal) +1)
}
}
function subtractInputValue(thisDiv) {
inputVal = $(thisDiv).parent().children('input').val()
if (inputVal == "") {
$(thisDiv).parent().children('input').val(-1)
} else {
$('#middle').val(eval(inputVal) -1)
}
}
您在两个地方使用#middle
作为ID,ID需要是唯一的(我将ID更新为唯一的,它们是任意的)。因此,jQuery会找到它看到的第一个ID并对其进行更新,这就是为什么当您单击底部的ID时,顶部的ID会被更新。一个简单的修复方法是在您想要更新值时使用$(thisDiv).parent().children('input')
。这样可以确保找到正确的输入进行更新。
这是我从你的原件中提取的一支工作代码笔。
此外,您不应该使用eval。有更好的方法可以将字符串转换为int。以下是一个很好的解释,解释为什么eval是个坏主意。
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="css.css">
<script type="text/javascript" src="main.js"></script>
</head>
<div class="doors">
<div class="miniDoor left">-</div>
<input id="middle1" placeholder="0"/>
<div class="miniDoor right">+</div>
</div>
<br><br><br><br><br><br><br>
<div class="doors">
<div class="miniDoor left">-</div>
<input id="middle2" placeholder="0"/>
<div class="miniDoor right">+</div>
</div>
$(function(){
$('.left').on('click',function() {
subtractInputValue(this)
});
$('.right').on('click',function() {
addInputValue(this)
});
});
function addInputValue(thisDiv) {
inputVal = $(thisDiv).parent().children('input').val()
if (inputVal == "") {
$(thisDiv).parent().children('input').val(1)
} else {
$(thisDiv).parent().children('input').val(eval(inputVal) +1) // change it here
}
}
扩展tokyovariable的答案
找到输入元素的最简单方法是:
$(thisDiv).closest('.doors').find(':input');
忘记eval。您可以使用$.isNumeric
来检查它是否是一个数字。
这是一个简化版本:
$(函数(){$('.left').on('click',function(){calculateValue(this,-1,-1);});
$('.right').on('click',function() {
calculateValue(this, +1, 1);
});
});
函数getInput(thisDiv){return($(thisDiv).closest('.doors').find(':input'));}
函数calculateValue(thisDiv,op,defaultValue){var elem=getInput(thisDiv);var值=elem.val();elem.val(!$.isNumeric(value)?defaultValue:(parseInt(value)+op));}
$(function(){
$('.left').on('click',function() {
calculateValue(this, -1, -1);
});
$('.right').on('click',function() {
calculateValue(this, +1, 1);
});
});
function getInput(thisDiv)
{
return ($(thisDiv).closest('.doors').find(':input'));
}
function calculateValue(thisDiv, op, defaultValue)
{
var elem = getInput(thisDiv);
var value = elem.val();
elem.val(!$.isNumeric(value) ? defaultValue : (parseInt(value) + op) );
}
.miniDoor {
font-style: bold;
height:30px;
width:30px;
background:#333;
padding:10px;
font-size:20px;
text-align:center;
color:#fff;
line-height:1.5em;
/* transition: all .3s ease-in-out;*/
transition:all .3s;
transition-timing-function: cubic-bezier(0,0,0,1);
transform-style: preserve-3d;
float:left;
}
.miniDoor.right {
-webkit-transition: background .7s;
-moz-transition: background .7s;
transition: background .7s;
}
.miniDoor.right:hover {
background: #6B6A6A;
background: rgba(107, 106, 106, 0.8);
-webkit-transform: scale(0.93);
-moz-transform: scale(0.93);
-ms-transform: scale(0.93);
transform: scale(0.93);
color: #fff;
}
.miniDoor.left {
-webkit-transition: background .7s;
-moz-transition: background .7s;
transition: background .7s;
}
.miniDoor.left:hover {
background: #6B6A6A;
background: rgba(107, 106, 106, 0.8);
-webkit-transform: scale(0.93);
-moz-transform: scale(0.93);
-ms-transform: scale(0.93);
transform: scale(0.93);
color: #fff;
}
#middle1, #middle2{
border:0;
height:50px;
width:75px;
background:#333;
padding:10px;
font-size:20px;
text-align:center;
color:#fff;
line-height:1.5em;
/* transition: all .3s ease-in-out;*/
transition:all .3s;
transition-timing-function: cubic-bezier(0,0,0,1);
transform-style: preserve-3d;
float:left;
border-bottom-left-radius: 20px;
border-bottom-right-radius: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div class="doors">
<div class="miniDoor left">-</div>
<input id="middle1" placeholder="0"/>
<div class="miniDoor right">+</div>
</div>
<br><br><br><br><br><br><br>
<div class="doors">
<div class="miniDoor left">-</div>
<input id="middle2" placeholder="0"/>
<div class="miniDoor right">+</div>
</div>
- 我想用Javascript网站在开放的Chrome浏览器上执行功能
- 如果未按下该按钮,则在30秒内自动执行该功能
- 如果在编辑中下拉值发生变化,如何执行功能
- 在周一上午8点至晚上7点之间执行功能
- 对页面上的所有ID执行JS功能
- 使用html 5对元素执行自定义表单验证功能
- 如何在ng中继器运行中执行功能
- 具有onclick功能的自定义复选框在实际切换复选框之前执行功能
- 基于条件执行功能
- clearInterval无法执行shuffle功能
- 页面内容加载完毕后执行Jquery功能
- 自动执行Javascript中的功能,用于评测实现
- 为什么不是't点击按钮时执行的功能
- Chrome扩展 - 如何使用按钮单击功能执行javascript文件
- Meteor功能执行了两次
- 分配和功能执行
- 有条件地延迟功能执行
- 功能执行后禁用键
- JS多功能执行
- 如何停止定时器,如果功能执行正确