基本上我需要做的是在 3 秒后alert()
传入的值,清除任何以前的超时,但每个调用者。 我可以通过为所有 3 个输入框创建一个更改事件处理程序来做到这一点,但想尝试只用一个处理程序来完成此操作。
.HTML:
<div class="container">
<input type="text" class="brown" readonly="readonly" id="txt1" value="0" />
<button class="btn" id="btn1">btn1</button>
</div>
<div class="container">
<input type="text" class="brown" readonly="readonly" id="txt2" value="0" />
<button class="btn" id="btn2">btn2</button>
</div>
<div class="container">
<input type="text" class="brown" readonly="readonly" id="txt3" value="0" />
<button class="btn" id="btn3">btn3</button>
</div>
Javascript:
$(".btn").on("click", function () {
var currnum = $(this).closest(".container").find('input[id*="txt"]').val();
var newnum = parseFloat(currnum) + 1;
$(this).closest(".container").find('input[id*="txt"]').val(newnum).trigger("change");
});
var timer;
$('.brown').bind("change", function () {
//clear all current timeouts
clearTimeout(timer);
var s = $(this).val();
//pause for 3 seconds before alert
timer = setTimeout(function () {
alert(s);
}, 3000);
});
因此,期望的结果是,如果我单击btn1
两次,然后btn2
一次,然后btn3
三次,警报将指示2
然后1
然后3
。 处理程序应发出警报的值是 3 秒结束时相应输入的最后一个值。 就我而言,我只是只收到一个警报(val 3(,因为它清除了所有其他计时器。 我可以使用 3 个不同的更改处理程序来完成此操作,每个输入一个,但这可以用一个处理程序完成吗?我感谢您的反馈。谢谢。
如果将计时器更改为数组,则代码将正常运行,例如:
<html>
<head></head>
<body>
<div class="container">
<input type="text" class="brown" readonly="readonly" id="txt1" value="0" />
<button class="btn" id="btn1">btn1</button>
</div>
<div class="container">
<input type="text" class="brown" readonly="readonly" id="txt2" value="0" />
<button class="btn" id="btn2">btn2</button>
</div>
<div class="container">
<input type="text" class="brown" readonly="readonly" id="txt3" value="0" />
<button class="btn" id="btn3">btn3</button>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(".btn").on("click", function() {
var currnum =
$(this).closest(".container").find('input[id*="txt"]').val();
var newnum = parseFloat(currnum) + 1;
$(this).closest(".container").find('input[id*="txt"]').val(newnum).trigger("change");
});
var timer = [];
timer.length = $(".brown").length;
$('.brown').bind("change", function() {
var listItem = $(this);
var i = listItem.index(".brown"); //clear all current timeouts
clearTimeout(timer[i - 1]);
var s = $(this).val();
//pause for 3 seconds before alert
timer[i - 1] = setTimeout(function() {
alert(s);
timer[i - 1]
}, 3000);
//clear all current timeouts
clearTimeout(timer[i - 1]);
var s = $(this).val();
//pause for 3 seconds before alert
timer[i - 1] = setTimeout(function() {
alert(s);
}, 3000);
});
</script>
</body>
</html>
我会使用一个为每个元素保存计时器的对象。在这种情况下,您只能清除当前元素的计时器,并且可以区分不同元素的不同计时器。
$(".btn").on("click", function () {
var currnum = $(this).closest(".container").find('input[id*="txt"]').val();
var newnum = parseFloat(currnum) + 1;
$(this).closest(".container").find('input[id*="txt"]').val(newnum).trigger("change");
});
var timers = {};
$('.brown').bind("change", function () {
var id = $(this).attr("id");
//clear the current timer
clearTimeout(timers[id]);
var s = $(this).val();
//pause for 3 seconds before alert
timers[id] = setTimeout(function () {
alert(s);
}, 3000);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<input type="text" class="brown" readonly="readonly" id="txt1" value="0" />
<button class="btn" id="btn1">btn1</button>
</div>
<div class="container">
<input type="text" class="brown" readonly="readonly" id="txt2" value="0" />
<button class="btn" id="btn2">btn2</button>
</div>
<div class="container">
<input type="text" class="brown" readonly="readonly" id="txt3" value="0" />
<button class="btn" id="btn3">btn3</button>
</div>
为什么不在达到 3 秒限制后简单地迭代所有输入字段?为了确保您的按钮处理正确的值,您可以向按钮添加一个data-attribute
,指向您希望增加的字段,例如
<input type="text" id="first" value="0" />
<button type="button" data-target="first">Increase first</button>
如果按钮具有指向输入字段的链接,则必须更改,然后您可以使用一个事件处理程序处理所有内容,例如:
document.querySelectorAll('[data-target]').forEach( button => {
button.addEventListener('click', handleClick);
});
在句柄单击中,您可以获取属性,并为其增加相应的字段
document.querySelectorAll('[data-target]').forEach( button => {
button.addEventListener('click', handleClick);
});
在句柄单击中,您可以使用 event 参数来检索单击的按钮,它的目标应该是什么,然后在找到它后更新该字段
function handleClick(e) {
let source = e.target;
let target = source.getAttribute('data-target');
let elem = document.getElementById( target );
if (!elem) {
// no elem found
return;
}
elem.value = +elem.value + 1;
if (handleClick.timer) {
clearTimeout( handleClick.timer );
}
// use a function specific property for the timer
handleClick.timer = setTimeout( () => {
document.querySelectorAll('input').forEach( input => {
if ( parseInt( input.value ) <= 0 ) {
return;
}
alert( input.value );
});
}, 3000 );
}
document.querySelectorAll('[data-target]').forEach( button => {
button.addEventListener('click', handleClick);
});
function handleClick(e) {
let source = e.target;
let target = source.getAttribute('data-target');
let elem = document.getElementById( target );
if (!elem) {
// no elem found
return;
}
elem.value = +elem.value + 1;
if (handleClick.timer) {
clearTimeout( handleClick.timer );
}
handleClick.timer = setTimeout( () => {
document.querySelectorAll('input').forEach( input => {
if ( parseInt( input.value ) <= 0 ) {
return;
}
alert( input.value );
});
}, 3000 );
}
<input type="text" id="first" value="0" />
<button type="button" data-target="first">Increase first</button>
<input type="text" id="second" value="0" />
<button type="button" data-target="second">Increase second</button>
<input type="text" id="third" value="0" />
<button type="button" data-target="third">Increase third</button>
我知道这是没有jQuery的,但我并没有真正看到它的必要性