如何在JavaScript中依次运行一个函数?

问题描述

我正在使Paypal上的任务自动化,该任务涉及连续单击页面上的几个按钮。

基本上,我需要单击一个单选按钮,然后单击“下一步”按钮以前进到下一页。但是除非先单击单选按钮,否则我无法进入下一页。

我目前在计时器上具有第二个功能,但是有没有办法在第一个功能完成并按下第一个单选按钮后启动第二个功能?

这是我的代码:

-restore -t:SignAndroidPackage -p:AndroidPackageFormat=aab -p:AndroidKeyStore=True -p:AndroidSigningKeyStore=$(keystore.secureFilePath) -p:AndroidSigningStorePass=$(KeystorePassword) -p:AndroidSigningKeyAlias=$(KeystoreAlias) -p:AndroidSigningKeyPass=$(KeystorePassword)

setTimeout方法照常运行,但不是最佳选择。

解决方法

setTimeout是最简单,最可靠的方法。修补您不拥有的页面时,这是一种很好的方法。

如果您想在下一个按钮出现后立即单击,请减少超时,如果该按钮尚不存在,请设置新的超时。这里也不需要依赖像jQuery这样的大依赖项:

document.querySelector('[id="BA-SMSNY4E48EHGC__ACH__STANDARD_FUNDSRadioBtn"]').click();
const clickNext = () => {
  const btn = document.querySelector('[name="selectFiNext|standard"]');
  if (btn) btn.click();
  else setTimeout(clickNext,50);
};
setTimeout(clickNext,50);

如果您真的想避免轮询,则还可以在按钮的父级上使用MutationObserver,但这会变得更加复杂。

如果该按钮在网络请求之后出现,则另一个可行的选择是监视网络请求完成的时间,如果站点使用的是jQuery,则使用ajaxComplete或通过猴子window.XMLHttpRequest进行修补。

,

您需要将事件处理程序绑定到“ click” JavaScript事件,或在元素上触发该事件。如下:

$(function(){
  $('[id="BA-SMSNY4E48EHGC__ACH__STANDARD_FUNDSRadioBtn"]').click(function(){
    $('[name="selectFiNext|standard"]').click();
  });

  $('[id="BA-SMSNY4E48EHGC__ACH__STANDARD_FUNDSRadioBtn"]').click();
});

以下代码段将事件处理程序 click 附加到ID为 BA-SMSNY4E48EHGC__ACH__STANDARD_FUNDSRadioBtn 的元素,这将触发事件句柄 click 具有属性 name =“ selectFiNext | standard” 的元素。

,

只想分享一种更现代的方法,该方法与公认的答案相同,但在我看来更容易阅读:

// Converts set timeout from callback approach to promise approach
function AsyncTimeout(delay = 0) {
    return new Promise(function (resolve,reject) {
        setTimeout(resolve,delay);
    });
}

(async () => {
    // possibly,you might or might not want to awit a bit before you start
    // await AsyncTimeout(100);

    document.querySelector('[id="BA-SMSNY4E48EHGC__ACH__STANDARD_FUNDSRadioBtn"]').click();
    let btn = null;
    // safeguard to prevent endless loop if something goes wrong
    let iterations = 0;
    while (btn == null) {
        await AsyncTimeout(50);
        // try to assign the btn
        btn = document.querySelector('[name="selectFiNext|standard"]');
        // remember the iteration count
        ++iterations;
        // if we tried too many times,just give up
        if (iterations > 100) {
            throw new Error("Couldn't find the button to click");
        }
    }
    btn.click();
})();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...