【问题标题】:jQuery sequential functions one after the other in a each loopjQuery顺序函数在每个循环中一个接一个
【发布时间】:2021-02-23 14:19:25
【问题描述】:

我知道这个话题已经在几篇文章中讨论过,但我似乎无法为我的特定用例做这件事。

所以我需要在一个接一个的页面上模拟将值输入到输入中。用户只是坐下来观看 - 但基本上我需要的是加载,第一个输入重点 > 逐字母输入一个值,然后移动到下一个输入以对其值执行相同操作。

到目前为止,这是我对我的代码的意思的一个小问题:https://codepen.io/samwoodchs/pen/WNxYmPj

$(document).ready(function(){

$('.typein').each(function(i, el) {
    var value = $(this).data('value');

    $(this).focus();
    $(this).val(''); //clear
    typeText($(this), value, 150, 0);

});

function typeText(item, text, delay, i) {
    $(item).val($(item).val() + text.charAt(i))
        .delay(delay)
        .promise()
        .done(function() {
            if(i<text.length) {
                i++;
                typeText(item, text, delay, i);  
            }
        });       
}

});

我在 jQuery 的每个循环中都有这个工作,但似乎无法让它按顺序工作,而不是同时工作。我猜我需要使用队列或承诺功能,但不确定如何使用。在每个循环中这样做的原因是不同的页面有不同的输入量,我想找到一个解决方案来通过选择器(类名)而不是手动来定位它。

任何帮助将不胜感激

【问题讨论】:

  • 如果您阅读delay() 的文档,它明确指出它不能替代setTimeout 方法。 delay() 仅在您使用 jQuery 执行的操作与其内部动画堆栈之一相关时才有效。设置值与任何动画堆栈都没有任何关系。 api.jquery.com/delay
  • 感谢延迟使用的解释。代码实际上是由 stan_t 从笔中提取的,所以不是我的工作codepen.io/stan_t/pen/Lafkz。它的工作原理不必担心 - 更多的是我如何让每个依次触发每个运行的输入函数,这是我要求提供一些指导的部分。
  • 您的代码是异步的,您想放弃异步进行顺序填充的可能性吗?

标签: javascript jquery loops promise sequential


【解决方案1】:

您可以使用 Promises 链接一个有序的函数数组,如下所示:

$(document).ready(function () {

    const delay = 150;
    $('.typein').data('value', 'other value');

    const functions = $('.typein').map((_, item) => typeText(item)).get();
    chainAndExecDelayedFunctions(functions, delay);

    function typeText(item) {
        return [
            () => {
                $(item).focus();
                $(item).val('');
            }
        ].concat($(item).data('value').split('').map(char => () => {
                $(item).val($(item).val() + char);
            }));
    }

    function chainAndExecDelayedFunctions(functions, delay) {
        functions.reduce((acc, cur) => {
            return acc.then(() => new Promise(resolve => setTimeout(() => {
                        resolve();
                        cur();
                    }, delay)));
        }, Promise.resolve());
    }

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input class="typein" value="initial value">
<input class="typein" value="initial value">
<input class="typein" value="initial value">
<input class="typein" value="initial value">
<input class="typein" value="initial value">
<input class="typein" value="initial value">
<input class="typein" value="initial value">
<input class="typein" value="initial value">

【讨论】:

  • 感谢 Guerric P 的重播。这是一个很好的解决方案,而我所追求的就是响应。目前,尽管这会将每个输入设置为相同的新值“其他值”。我希望这可以从作为数据属性放置的输入中提取值。你能适应这种逻辑吗?
  • 我已经调整为只提取数据值,而不是设置为相同的值,并且所有测试都可以正常工作。感谢您的帮助
猜你喜欢
  • 2016-12-21
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
相关资源
最近更新 更多