当前位置: 首页 > 知识库问答 >
问题:

javascript - 如何让页面内符合条件的多个Dom节点同时执行httprequest分别接受2秒后返回的值?

郜琦
2023-06-24

一个油猴子脚本,通过查找页面也符合条件的a标签,对标签元素文本执行httpRequest,2秒左右返回值,然后将返回的值修改a标签文本

<a>第一个元素</a>
<a>第二个元素</a>
<a>第三个元素</a>
<a>第四个元素</a>

请求后,修改为

<a>第一个元素[t]</a>
<a>第二个元素[t]</a>
<a>第三个元素[t]</a>
<a>第四个元素[t]</a>

从页面取符合条件a标签内容,httpRequest请求后,返回t的值

定义全局t变量后,还未获取到前一个a标签内容请求返回的值并修改节点内容,第二个a标签节点的内容就开始执行httpRequest请求,t的值被修改,无法分别对节点同时请求,修改原节点内容

使用2个setTimeout,依次对每个a标签节点内容进行httpRequest请求并修改页面元素,等待时间太长,能否同时执行请求,分别修改对应的a标签元素内容添加返回的值?

    let Result = '';
    var t = '';
function getInfo(url) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function (res) {
                Result = res.status;
                let domNewx = new DOMParser().parseFromString(res.responseText, 'text/html');
                let info = domNewx.querySelectorAll('.info')[0];
                if(info) {

                    if(info.children[1].querySelector('.size'))
                        t = info.children[1].querySelector('.size').innerHTML.split(' ')[5];


                } else {
                        //console.log('undefined');
                    Result = 404;
                }
            },
            onerror: function (result) {
                console.log(result);
            },
        });
    }
document.querySelectorAll('a').forEach(function (value, index) {
            if(value.nextSibling.className == 'symbol') {
                setTimeout(() => {
                    getInfo(url + value.innerHTML);
                    setTimeout(() => {
                        if(t) {

                             value.innerHTML = value.innerHTML + '[' + t + ']';
                               
                        }
                        //console.log(t);

                        t = '';
                        //}, 2000*(index - 99 + 1))
                    }, 2000)
                }, 2500*(index + 1))
            }
        });

共有2个答案

厉高逸
2023-06-24

解决了,放在一个函数里面,每个节点调用一次函数,修改对应的节点

孔厉刚
2023-06-24
function getInfo(url) {
    return new Promise((resolve, reject) => {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function (res) {
                let domNewx = new DOMParser().parseFromString(res.responseText, 'text/html');
                let info = domNewx.querySelectorAll('.info')[0];
                let t = '';
                if(info && info.children[1].querySelector('.size')) {
                    t = info.children[1].querySelector('.size').innerHTML.split(' ')[5];
                }
                resolve(t);
            },
            onerror: function (result) {
                reject(result);
            },
        });
    });
}

然后:

document.querySelectorAll('a').forEach(function (value, index) {
    if(value.nextSibling.className == 'symbol') {
        getInfo(url + value.innerHTML).then(t => {
            if(t) {
                value.innerHTML = value.innerHTML + '[' + t + ']';
            }
        });
    }
});
 类似资料:
  • Tampermonkey中使用GM_xmlhttpRequest对多个链接同时进行请求,将最先返回结果的值进行条件判断,要是符合条件不再获取后面的请求结果的值,要是不符合,依次获取第二个、第三个的返回结果的值进行条件判断,同样符合条件不再获取后面的,要是不符合条件,同样获取后面的值 使用AI写了一段代码,看注释和实际结果,貌似是先获取一个请求结果,进行判断,然后再等所有剩下的结果请求完成,再进行条

  • 何时单链表中的节点符合垃圾回收机制? 如果单链表中有一个节点是最后一个元素,那么它的下一个指针将指向null。如果假设最后一个元素中的数据也是null。在这种情况下,数据和下一个指针都是空的。这个元素是否符合垃圾回收机制?

  • 问题内容: 我正在使用inside 执行外部脚本。 现在,由于脚本是 在 页面加载 之前 执行的,因此我无法访问。在文档“加载”后(HTML已完全下载并在RAM中),我想执行一些JavaScript。执行脚本时,是否有任何我可以挂上的事件,这些事件将在页面加载时触发? 问题答案: 这些解决方案将起作用: 要么 甚至 请注意, 最后一个选项是更好的选择,因为它不引人注目并且被[认为是更标准的。

  • 问题内容: 我正在尝试使用操作数AND一起查询集合。我有外壳版本工作: 我找不到Java等效项(使用本机驱动程序)。我已经尝试了各种方法,但这是我最近的尝试: 任何想法有什么问题吗? 问题答案:

  • 原文是这样的: 这确实令人惊讶,但最终明白了(嗯,至少我想我明白了)为什么会这样发生。 现在,我将第二个更改为: 如果我遗漏了一些明显的东西,或者我的问题是愚蠢的,让我提前说声对不起。还有谢谢你!

  • 我目前正在尝试一个项目,包括创建银行账户系统。该系统允许您创建一个新的银行账户,您可以在其中说明该账户的归属、余额等。 其中一种方法是能够从账户中提取资金。除此之外,您还可以检查帐户是否透支。 对于方法,我必须满足几个条件。这些是以下: 该值必须高于0.0,这意味着低于0的提款不会发生。 余额不得低于0.0,除非账户透支 目前,我已经能够做到这一点,所以如果金额低于0.0,该方法将返回false。