我正在尝试在<span>
中添加和删除一个类,但是虽然正在调用该函数,但removeClass仍然无效。
setInterval(changeClass,4000);
var spanId=1;
function changeClass(){
$('#'+spanId).addClass("hilite");
setTimeout(remove, 1000);
spanId++;}
function remove(){
$('#'+spanId).removeClass("hilite");
return true;
}
任何人都可以说出原因吗?
我怎么能用这样的while循环做这个我尝试了所有的方法但是不能让它工作
var spanSet=4;
var spanId=1;
while(spanSet > 0)
{
changeClass();
spanSet--;
}
function changeClass(){
$('#'+spanId).addClass("hilite");
setTimeout(remove, 3000);
}
function remove(){
$('#'+spanId).removeClass("hilite");
spanId++;
return true;
}
答案 0 :(得分:5)
spanId
在超时结束前递增,因此您尝试从 next 项而不是最后一项中删除该类。
避免此问题的常用方法是使用闭包,但在这种情况下,将spanId++;
移动到remove
函数的末尾会更加简单。
闭包方法(在这种情况下我不推荐,因为它与移动增量相比过于复杂)可能如下所示:
setInterval(changeClass, 4000);
var spanId = 1;
function changeClass() {
$('#' + spanId).addClass("hilite");
setTimeout(
remove(spanId), // CALL remove and pass spanId as an argument
1000
);
spanId++;
}
function remove(spanId) {
return function () { // RETURN a function from remove().
// Note: This spanId is the local variable defined in the argument list
// not the one that exists in the wider scope
$('#' + spanId).removeClass("hilite");
return true;
}
}
答案 1 :(得分:2)
你应该这样说:
setInterval(changeClass, 4000);
var spanId = 1;
function changeClass() {
$('#'+spanId).addClass("hilite");
setTimeout(remove, 1000);
}
function remove() {
$('#'+spanId).removeClass("hilite");
spanId++; // <--
return true;
}
编辑:[由于Quentin建议使用diff工具,谢谢Quentin]
我将spanId ++放在remove函数的末尾,以便在每次调用时使用相同的spanId值调用changeClass和remove函数。
答案 2 :(得分:-1)
function changeClass(){
$('#'+spanId).addClass("hilite");
setTimeout(remove, 1000);
spanId++;}
在此代码中,您应该在回调函数中执行spanId++
,该函数作为参数传递给setTimeout,因为JS在完成setTimeout语句之前不会暂停执行。
所以你的代码应该是这样的:
function changeClass(){
$('#'+spanId).addClass("hilite");
setTimeout(remove, 1000);
}
function remove(){
$('#'+spanId).removeClass("hilite");
spanId++;
return true;
}
答案 3 :(得分:-2)
这对我有用,也增加了一些超时控制。
changeClass();
function changeClass(){
$("#container").addClass("box");
console.log("changeClass()");
clearTimeout(interval);
interval = setTimeout(remove, 1000);
}
function remove(){
$("#container").removeClass("box");
console.log("remove()");
clearTimeout(interval);
interval = setInterval(changeClass,1000);
}