javascript - 在特定于单击元素的超时内更改类

标签 javascript jquery settimeout addclass

我设置了一个 jsFiddle here .但下面是代码...

HTML

<div class="square square0"></div>
<div class="square square1"></div>
<div class="square square2"></div>
<div class="square square3"></div>

Javascript

$('.square').click(function () {
    if ($(this).hasClass('square0')) {
        $(this).removeClass('square0').addClass('square1');
        return false;
    }
    if ($(this).hasClass('square1')) {
        $(this).removeClass('square1').addClass('square2');
        return false;
    }
    if ($(this).hasClass('square2')) {
        $(this).removeClass('square2').addClass('square3');
        return false;
    }
    if ($(this).hasClass('square3')) {
        $(this).removeClass('square3').addClass('square0');
        return false;
    }
});

CSS

.square { display: block; height: 100px; width: 100px; }
.square0{ background-color: #000; }
.square1{ background-color: #F00; }
.square2{ background-color: #0F0; }
.square3{ background-color: #00F; }

目前设置 fiddle 的方式主要是我想要的。用户单击颜色,它会在黑色、红色、绿色、蓝色之间循环,然后再次变回黑色。然而,有一个转折点!

假设黑色为默认值/空值,颜色(红色、绿色和蓝色)为不同的选项。如果用户单击某个值时它已经是一种颜色,它将重置为黑色。如果用户点击它时它是黑色的,那么它会循环显示颜色。

问题在这里……

从他们点击黑色的那一刻起,(然后它变成红色)一个 2 秒的计时器开始计时。如果用户在 2 秒内没有点击,那么当他们下次点击它时,它会变成黑色(默认/空值)。 但是每次他们继续点击以循环显示颜色(包括返回黑色)时,该计时器会再次重置为 2 秒。

最后,如果您单击一个黑色方 block 将其变为红色,然后单击另一个方 block ,然后返回到前一个方 block ,它会将其变为黑色(不是循环),因为您点击的是离开前一个方 block 的事实,它摆脱了计时器。

我知道很多 - 但我觉得用这个简单的概念不应该 t̲o̲o̲ h̲a̲r̲d̲ 弄清楚,但出于某种原因我只是我无法全神贯注。这可能非常简单。

帮助我 Obi Wan Stackoverflow(我?)...你是我唯一的希望!

最佳答案

你需要做这样的事情:

$('.square').click(function(e) {
    var $this = $(this);
    if ($this.hasClass('timer-on') || $this.hasClass('square0')) {
        if ($this.hasClass('square0')) {
            $this.removeClass('square0').addClass('square1');
        } else if ($this.hasClass('square1')) {
            $this.removeClass('square1').addClass('square2');
        } else if ($this.hasClass('square2')) {
            $this.removeClass('square2').addClass('square3');
        } else if ($this.hasClass('square3')) {
            $this.removeClass('square3').addClass('square1');
        };
    } else {
        $this.addClass('square0').removeClass('square1 square2 square3');
    };

    clearTimeout($this.data('timer'));
    $this.addClass('timer-on').data('timer', setTimeout(function () {
        $this.removeClass('timer-on');
    }, 2000));
});

http://jsfiddle.net/mblase75/bF5Re/

您的 return false 语句完全没有必要,并且会干扰后面的代码,所以我删除了它们并将您随后的 if 语句更改为 else if 代替。

我使用的技巧是在两秒计时器启动时添加一个类 timer-on,并在计时器结束后将其删除。现在我们只需要测试 timer-on 是否存在,以了解计时器是否已用完。

setTimeout 函数返回一个可以使用 clearTimeout 清除的 ID,因此我们使用 .data() 将该 ID 存储在点击的元素上> 并在每次点击时重置它以重新启动计时器。

关于javascript - 在特定于单击元素的超时内更改类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201516/

相关文章:

javascript - 使用正则表达式验证任何字符串

javascript - 如何隐藏空白数组并只保留数组的值/名称?

javascript - 我的 Greasemonkey 脚本中的 setInterval() 忽略给定的时间并不断执行

javascript - 使用 Booklet Jquery 插件,如何验证最后一页是否已显示?

javascript - setTimeout导致堆栈溢出

javascript - setTimeout 函数,以 Promise 解析值作为回调

javascript - mysql 请求后 Node JS 重定向

JavaScript,生成一个长度为 9 个数字的随机数

javascript - 如何滚动到 <div> 内的特定文本索引

javascript - 在元素呈现时运行函数