javascript - 模拟点击所有单选按钮并不断循环

标签 javascript jquery

场景

我目前有 3 个单选按钮,我希望每 2 秒点击一次。这将不断循环,直到我按下“停止”按钮。

HTML

<div id="gen">
    <input type="radio" id="radio1" name="radios" />
    <input type="radio" id="radio2" name="radios" />
    <input type="radio" id="radio3" name="radios" />

    <div id="genBtn">
        <button type="button" id="stopBtn">Stop</button>
    </div>
</div>

JavaScript

$(document).ready(function() {

    /* Every 2 seconds, click each radio button */
    var rollDemRadios = setInterval(function() {
        $('input[name="radios"]').each(function() {
            // You can only see the last one clicked after about 3 seconds
            $(this).click();
        });
    }, 2000);

    /* Stops the radio buttons from rolling */
    $('#stopBtn').click(function() {
        clearInterval(rollDemRadios);
    });
});

视觉呈现

•(click) • •

• •(click) • // after 2 seconds

• • •(click) // another 2 seconds, then click the first one again

[Stop]

fiddle :http://jsfiddle.net/3xeyf/5/

问题

为什么我只能看到最后一个单选按钮被点击,而不是“每 2 秒每个单选按钮”?

此外,我如何连续循环所有 3 个单选按钮(单击最后一个单选按钮后,从第一个单选按钮开始)?

尝试

  • setTimeout()setInterval()$(this).click() 括起来,使点击对用户可见.
  • setInterval() 中添加了一个 while(true) 以连续循环。不聪明,但值得一试!

最佳答案

问题在于代码的设置方式。解释一下:

var rollDemRadios = setInterval(function() {
    $('input[name="radios"]').each(function() {
        $(this).click();
    });
}, 2000);

为了简化事情,让我们去掉中间位。

var rollDemRadios = setInterval(function() {
    DoYourWork();
}, 2000);

那么,这段代码中发生了什么?就像您所期望的那样,浏览器将每 2 秒运行一次 DoYourWork() 方法。假设它向您显示一个警告框。这意味着您将每 2 秒看到一个警告框。

但是您没有显示警告框。你在做什么是这样的:

    $('input[name="radios"]').each(function() {
        $(this).click();
    });

这是做什么的?对于找到的每个按钮,它都会单击它。非常简单地说:

    firstRadioButton.click();
    secondRadioButton.click();
    thirdRadioButton.click();

我们将此操作称为“依次单击三个按钮”。我稍后会使用这个名称。

代码会在这三个点击事件之间等待吗?不,为什么不呢?你没有要求它。您只要求它在单击所有三个按钮后等待。

基本上是这样的:

  • 第一个间隔
  • “依次点击三个按钮”。请注意,三次点击之间没有设置时间。这些按钮将以您的浏览器所能达到的最快速度被点击。
  • 等待两秒钟...
  • 第二个间隔(第一个间隔后两秒)
  • “依次点击三个按钮”。请注意,三次点击之间没有设置时间。这些按钮将以您的浏览器所能达到的最快速度被点击。
  • 等等...

您无法察觉三个按钮被点击,因为浏览器比您的眼睛快得多。您需要做的是告诉浏览器点击每个按钮后等待。在您当前的示例中,您告诉它在单击所有按钮后等待。这是您问题的根本原因。

这应该均匀地间隔点击,每次点击等待 2 秒而不是每批点击:

var radiobuttons = $('input[name="radios"]');
var i = 0;

var rollDemRadios = setInterval(function() {
    var currentbutton = radiobuttons[i];

    currentbutton.click();

    i = (i + 1) % radiobuttons.length; //0, then 1, then 2, then 0, then 1, then 2, then 0, ...

}, 2000);

关于javascript - 模拟点击所有单选按钮并不断循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23475320/

相关文章:

javascript - 是否可以将全局处理程序附加到两个不同的对象,然后仅删除其中一个?

javascript - 使用ajax在html中加载html文件时出现的问题

javascript - 如何清空div

jquery - 在 Silverstripe 3 中加载带有滑动动画的新页面(使用 Ajax?)

JavaScript 和 Ajax 响应

jQuery 动画页面滚动,带有固定标题的偏移量,闪烁褪色的内容

javascript - 在 javascript 中获取根网站 url 以进行重定向

javascript - 如何在 JSDoc 中指定 promise 的解析和拒绝类型?

javascript - 将外部 json 查找中的值作为新的键/值对映射到数组中

javascript - 设置带有左右面板的 HTML 页面