吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 862|回复: 11
收起左侧

[求助] 模拟点击事件设置延时

[复制链接]
探索1979 发表于 2023-11-10 18:11
25吾爱币
想让模拟点击事件每次延时5秒钟,可是没有反应
function monitorDomChange() {
randomChars.forEach(function(value) {
   console.log(value);
    // 模拟点击事件
    if (value) {
       setTimeout(() => {
    // 在这里执行您想要的操作
       const event = new MouseEvent('click', {
             bubbles: true,
             cancelable: true,
             view: unsafeWindow,
         });
            value.dispatchEvent(event);
          }, 5000);
      //setInterval( value.dispatchEvent(event), 5000);
      
      //debugger
      const targetDivSelector = '#endText';
      const targetDiv = document.querySelector(targetDivSelector);
              if (targetDiv) {
                console.log('发现div:', targetDiv);
                // 在这里可以对目标div进行操作或获取需要的数据
              } else {
                console.log('没有发现div');
              }
            }
          }      
      );

    }

最佳答案

查看完整内容

我检查了一下代码,问题可能出现在对targetDiv和value的读取上。由于使用了异步函数setTimeout,所以在打印targetDiv.innerHTML和value.innerHTML时,可能已经发生了元素的变化。因此,你需要确保在获取元素和打印元素时,它们仍然存在并且具有正确的值。 另外,在每次循环中都使用相同的延迟时间(5000毫秒),这可能会导致一些问题。如果希望每个元素都有不同的延迟时间,应该在每次循环时使用不同的延迟时间。 请参考以 ...

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
为之奈何? + 1 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

tanglikecuan 发表于 2023-11-10 18:11
探索1979 发表于 2023-11-12 18:44
大神目前是可以实现每隔5秒实现模拟点击一次,但奇怪的是最后一次循环打印console.log('发现div:',  ...

我检查了一下代码,问题可能出现在对targetDiv和value的读取上。由于使用了异步函数setTimeout,所以在打印targetDiv.innerHTML和value.innerHTML时,可能已经发生了元素的变化。因此,你需要确保在获取元素和打印元素时,它们仍然存在并且具有正确的值。

另外,在每次循环中都使用相同的延迟时间(5000毫秒),这可能会导致一些问题。如果希望每个元素都有不同的延迟时间,应该在每次循环时使用不同的延迟时间。

请参考以下修改后的代码:

javascript
const targetDivValues = [];  
function monitorDomChange() {  
    randomChars.forEach(function(value, index) {  
        console.log(value); // 打印value  
        setTimeout(function() {  
            // 在这里执行您想要的操作  
            const event = new MouseEvent('click', {  
                bubbles: true,  
                cancelable: true,  
                view: unsafeWindow,  
            });  
            value.dispatchEvent(event); // 模拟点击事件  
  
            // 获取目标div  
            const targetDivSelector = '#endText';  
            const targetDiv = document.querySelector(targetDivSelector);  
            if (targetDiv) {  
                console.log('发现div:', targetDiv); // 打印目标div  
                targetDivValues.push(targetDiv.innerHTML);  
                targetDivValues.push(value.innerHTML);  
            } else {  
                console.log('没有发现div');  
            }  
        }, index * 5000 + 5000 * index); // 根据index来设置不同的延时时间,防止重叠  
    });  
      // 将存储器数据保存为HTML文件  
    const htmlContent =targetDivValues.map(value => value.replace(/&draft=0&type=norm&pm=y/g, '').replace(/&draft=0&type=norm&actID=0/g, '')).join('');  
    const blob = new Blob([htmlContent], { type: 'text/html' });  
    const url = URL.createObjectURL(blob);  
    const link = document.createElement('a');  
    link.href = url;  
    console.log('书名1111',title);  
    link.download = `${title}.html`;  
    link.click();  
}
这个修改的代码在每次循环时都会为setTimeout函数提供一个不同的延迟时间,这样就可以防止它们重叠。同时,我建议你在获取targetDiv和value元素之前,先检查它们是否存在,以避免在元素已经发生变化之后再去获取它们的值。
浪尘 发表于 2023-11-10 18:37
你可以试试按键精灵或者百宝箱看看,还蛮好用的
知心 发表于 2023-11-10 18:41
js的setTimeout是异步的,你按这个方面搜索一下资料
 楼主| 探索1979 发表于 2023-11-10 19:16
知心 发表于 2023-11-10 18:41
js的setTimeout是异步的,你按这个方面搜索一下资料

大佬的意思放在forEach里面不行,对吗,有什么解决方法吗?
鹿鸣 发表于 2023-11-10 19:35
[Asm] 纯文本查看 复制代码
function monitorDomChange() {  
    randomChars.forEach(function(value) {  
        console.log(value);  
        // 模拟点击事件  
        if (value) {  
            setTimeout(() => {  
                // 在这里执行您想要的操作  
                if (value.dispatchEvent) {  
                    const event = new MouseEvent('click', {  
                        bubbles: true,  
                        cancelable: true,  
                        view: unsafeWindow,  
                    });  
                    value.dispatchEvent(event);  
                } else {  
                    console.log('Value does not support dispatchEvent');  
                }  
            }, 5000);  
  
            const targetDivSelector = '#endText';  
            const targetDiv = document.querySelector(targetDivSelector);  
            if (targetDiv) {  
                console.log('发现div:', targetDiv);  
                // 在这里可以对目标div进行操作或获取需要的数据  
            } else {  
                console.log('没有发现div');  
            }  
        }  
    });  
}
urdarling 发表于 2023-11-10 21:12
好像没有看到随机数部分?
tanglikecuan 发表于 2023-11-11 09:37
从你的代码来看,你在使用 setTimeout 来延迟点击事件,但可能存在一些问题。你的 setTimeout 函数在每一轮循环中都会执行,这意味着它们会以你循环的速度进行,而不是每隔5秒执行一次。

如果你想让模拟点击事件每隔5秒执行一次,你应该在 setTimeout 的回调函数内部进行循环。这样,每次回调执行完毕后,都会等待5秒后开始下一次循环。

另外,你的 monitorDomChange 函数中没有对 randomChars 进行初始化,你需要确保 randomChars 是一个包含需要点击的DOM元素引用的数组。

下面是一个可能的修改:

javascript
let randomChars = [/* 在这里填充需要点击的DOM元素引用 */];

function monitorDomChange() {
    randomChars.forEach(function(value, index) {
        console.log(value);
        // 模拟点击事件
        if (value) {
            setTimeout(() => {
                // 在这里执行您想要的操作
                const event = new MouseEvent('click', {
                    bubbles: true,
                    cancelable: true,
                    view: unsafeWindow,
                });
                value.dispatchEvent(event);
            }, 5000 * (index + 1)); // 这里根据索引来设置不同的延时时间,保证每个元素点击的间隔为5秒
            //debugger
            const targetDivSelector = '#endText';
            const targetDiv = document.querySelector(targetDivSelector);
            if (targetDiv) {
                console.log('发现div:', targetDiv);
                // 在这里可以对目标div进行操作或获取需要的数据
            } else {
                console.log('没有发现div');
            }
        }
    });
}
 楼主| 探索1979 发表于 2023-11-11 18:56
本帖最后由 探索1979 于 2023-11-11 19:40 编辑
tanglikecuan 发表于 2023-11-11 09:37
从你的代码来看,你在使用 setTimeout 来延迟点击事件,但可能存在一些问题。你的 setTimeout 函数在每一轮 ...

大佬你好,用你的代码测试一下,实现了每5秒点击一次,但是在打印console.log(value);和console.log('发现div:', targetDiv);之后模拟点击的,我的代码想实现先打印console.log(value);之后模拟点击其次再打印console.log('发现div:', targetDiv);,原因是我先循环获取value用于模拟点击,每次模拟点击后另一个id为endText会显示不同的文本,我把它打印出来console.log('发现div:', targetDiv);
下面是我要获取数组值
let randomChars = [
  '<span id="treeDemo_1_span">前言</span>',
  '<span id="treeDemo_2_span">第1章</span>',
  '<span id="treeDemo_3_span">第2章</span>'
];
其中模拟点击子菜单后id为endText的值
<div class="content" id="endText" name="content">
  <div id="tree19976634">
    <h4>1.不提倡使用的农药</h4></div>
  <div>
    <p>杀虫剂:抗蚜威、毒死蜱、吡硫磷、三氟氯氰菊酯、氯氟氰菊酯、甲氰菊酯、氰氯苯醚菊酯、氰戊菊酯、异戊氰酸酯、敌百虫、戊酸氰醚酯、高效氯氰菊酯、贝塔氯氰菊酯、杀螟硫磷、敌敌畏等。</p>
    <p>杀菌剂:敌磺钠(地克松、敌克松)、冠菌清等。</p>
    <p>中等毒性、注意农药使用的安全间隔期。</p>
  </div>
  <div id="tree19976636">
    <h4>2.果树生产禁用的农药(高毒高残留)</h4></div>
  <div>
    <p>六六六、滴滴涕(DDT)、毒杀芬、二溴氯丙烷、杀虫脒、二溴乙烷、除草醚、艾氏剂、狄氏剂、汞制剂、砷类、铅类、敌枯双、氟乙酸胺、甘氟、毒鼠强、氟乙酸钠、毒鼠硅、甲拌磷、乙拌磷、久效磷、对硫磷、甲基对硫磷、甲胺磷、甲基异柳磷、氧化乐果、磷胺、特丁硫磷、甲基硫环磷、治螟磷、内吸磷、灭线磷、硫环磷、蝇毒磷、地虫硫磷、氯唑磷、苯线磷。</p>
    <p class="fire_center"></p>
    <p style="text-align:center">
      <img id="img_19976638" style="text-align: center; max-width: 90%; margin-left: -2em;" src="https://www.123.com/booklib/zpimage.zhtml?ID=19976638&SiteID=123&draft=0&type=norm&pm=y" class="imagedata0" w="20" h="20"></p>
    <p>
    </p>
    <p class="fire_center"></p>
    <p style="text-align:center">
      <img id="img_19976639" style="text-align: center; max-width: 90%; margin-left: -2em;" src="https://www.123.com/booklib/zpimage.zhtml?ID=19976639&SiteID=123&draft=0&type=norm&pm=y" class="imagedata0" w="20" h="20"></p>
    <p>
    </p>
  </div>
</div>
 楼主| 探索1979 发表于 2023-11-11 18:58
鹿鸣 发表于 2023-11-10 19:35
[mw_shl_code=asm,true]function monitorDomChange() {  
    randomChars.forEach(function(value) {  
...

你好,我测一下,大佬 ,没有实现每五秒模拟点击
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-28 07:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表