上一主题 下一主题
ScriptCat,新一代的脚本管理器脚本站,与全世界分享你的用户脚本油猴脚本开发指南教程目录
12下一页
返回列表 发新帖

调用函数无法立即执行

[复制链接]
  • TA的每日心情
    开心
    2023-12-25 06:51
  • 签到天数: 35 天

    [LV.5]常住居民I

    9

    主题

    56

    回帖

    67

    积分

    初级工程师

    积分
    67

    油中3周年

    发表于 2023-11-9 13:45:53 | 显示全部楼层 | 阅读模式
    悬赏10油猫币已解决

    在myFunction()中调用monitorDomChange()没法立即执行到该函数体中,而是for完之后再执行到该函数体中,请问如何解决
    function myFunction() {
    $(document).ready(function(){
    // 获取指定 ID 的元素
    const parentElement = document.getElementById('treeDemo');
    // 获取所有子元素
    const childElements = parentElement.children;
    // 遍历所有子元素
    for (let i = 0; i < childElements.length; i++) {
    // 判断当前元素是否为 li 标签
    if (childElements[i].tagName === 'LI') {
    // 获取 li 标签的 ID 并赋值给 document.getElementById()
    const id = childElements[i].id;
    // 在这里可以执行你需要的操作,例如打印 ID 或其他操作
    console.log(Element with ID ${id+"_span"} found.);
    const targetElement = document.getElementById(id + "_span"); // Correct the way to concatenate the string.
    console.log(targetElement);
    // 模拟点击事件
    if (targetElement) {
    const event = new MouseEvent('click', {
    bubbles: true,
    cancelable: true,
    view: unsafeWindow,
    interval: 5000 // Use the interval parameter here.
    });
    debugger
    setTimeout(() => {
    monitorDomChange();
    }, 0);
    targetElement.dispatchEvent(event);
    } else {
    console.log('目标 ul 元素不存在!');
    }
    }
    }
    });
    }
    function monitorDomChange() {
    // 你的代码在这里,例如:
    }

    最佳答案

    查看完整内容

    [油猴脚本开发指南]包装异步代码为同步代码 https://bbs.tampermonkey.net.cn/thread-883-1-1.html 宏任务与微任务的问题 可以将setinterval包裹成promise然后await
  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-11-9 13:45:54 | 显示全部楼层
    [油猴脚本开发指南]包装异步代码为同步代码
    https://bbs.tampermonkey.net.cn/thread-883-1-1.html

    宏任务与微任务的问题
    可以将setinterval包裹成promise然后await

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-25 06:51
  • 签到天数: 35 天

    [LV.5]常住居民I

    9

    主题

    56

    回帖

    67

    积分

    初级工程师

    积分
    67

    油中3周年

    发表于 2023-11-9 18:57:36 | 显示全部楼层
    李恒道 发表于 2023-11-9 18:04
    [油猴脚本开发指南]包装异步代码为同步代码
    https://bbs.tampermonkey.net.cn/thread-883-1-1.html

    这样写吗?大佬
    function myFunction() {
      $(document).ready(function() {
        // 获取指定 ID 的元素
        const parentElement = document.getElementById('treeDemo');
        // 获取所有子元素
        const childElements = parentElement.children;
        // 遍历所有子元素
        for (let i = 0; i < childElements.length; i++) {
          // 判断当前元素是否为 li 标签
          if (childElements.tagName === 'LI') {
            // 获取 li 标签的 ID 并赋值给 document.getElementById()
            const id = childElements.id;
            // 在这里可以执行你需要的操作,例如打印 ID 或其他操作
            console.log(`Element with ID ${id+"_span"} found.`);
            const targetElement = document.getElementById(id + "_span"); // Correct the way to concatenate the string.
            console.log(targetElement);
            // 模拟点击事件
            if (targetElement) {
              const event = new MouseEvent('click', {
                bubbles: true,
                cancelable: true,
                view: unsafeWindow,
              });
              targetElement.dispatchEvent(event);

              let p=new Promise((resolve, reject) => {
                  setTimeout(() => {
                      debugger
                     monitorDomChange();
                     }, 0);
                  });
            } else {
              console.log('目标 ul 元素不存在!');
            }
          }
        }
      });
    }
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-11-9 19:05:42 | 显示全部楼层
    tansuo 发表于 2023-11-9 18:57
    这样写吗?大佬
    function myFunction() {
      $(document).ready(function() {

    我盲猜哥哥又没看帖子...
    我用的async+await,哥哥只用了一个promise,一点同步的语法糖都没用上
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-11-9 19:07:08 | 显示全部楼层
    async function myFunction() {
      $(document).ready(function() {
        // 获取指定 ID 的元素
        const parentElement = document.getElementById('treeDemo');
        // 获取所有子元素
        const childElements = parentElement.children;
        // 遍历所有子元素
        for (let i = 0; i < childElements.length; i++) {
          // 判断当前元素是否为 li 标签
          if (childElements.tagName === 'LI') {
            // 获取 li 标签的 ID 并赋值给 document.getElementById()
            const id = childElements.id;
            // 在这里可以执行你需要的操作,例如打印 ID 或其他操作
            console.log(`Element with ID ${id+"_span"} found.`);
            const targetElement = document.getElementById(id + "_span"); // Correct the way to concatenate the string.
            console.log(targetElement);
            // 模拟点击事件
            if (targetElement) {
              const event = new MouseEvent('click', {
                bubbles: true,
                cancelable: true,
                view: unsafeWindow,
              });
              targetElement.dispatchEvent(event);
    
              await new Promise((resolve, reject) => {
                  setTimeout(() => {
                      debugger
                     monitorDomChange();
                     }, 0);
                  });
            } else {
              console.log('目标 ul 元素不存在!');
            }
          }
        }
      });
    }

    这样随便看几行丢一下gpt,没耐心慢慢磨语法很难有提升的

    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-25 06:51
  • 签到天数: 35 天

    [LV.5]常住居民I

    9

    主题

    56

    回帖

    67

    积分

    初级工程师

    积分
    67

    油中3周年

    发表于 2023-11-9 19:46:11 | 显示全部楼层
    李恒道 发表于 2023-11-9 19:07
    [md]```js
    async function myFunction() {
      $(document).ready(function() {

    报这个错误 unexpected token  new
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-11-9 19:53:03 | 显示全部楼层
    function myFunction() {
      $(document).ready(async function() {
        // 获取指定 ID 的元素
        const parentElement = document.getElementById('treeDemo');
        // 获取所有子元素
        const childElements = parentElement.children;
        // 遍历所有子元素
        for (let i = 0; i < childElements.length; i++) {
          // 判断当前元素是否为 li 标签
          if (childElements.tagName === 'LI') {
            // 获取 li 标签的 ID 并赋值给 document.getElementById()
            const id = childElements.id;
            // 在这里可以执行你需要的操作,例如打印 ID 或其他操作
            console.log(`Element with ID ${id+"_span"} found.`);
            const targetElement = document.getElementById(id + "_span"); // Correct the way to concatenate the string.
            console.log(targetElement);
            // 模拟点击事件
            if (targetElement) {
              const event = new MouseEvent('click', {
                bubbles: true,
                cancelable: true,
                view: unsafeWindow,
              });
              targetElement.dispatchEvent(event);
    
              await new Promise((resolve, reject) => {
                  setTimeout(() => {
                      debugger
                     monitorDomChange();
                     }, 0);
                  });
            } else {
              console.log('目标 ul 元素不存在!');
            }
          }
        }
      });
    }
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-25 06:51
  • 签到天数: 35 天

    [LV.5]常住居民I

    9

    主题

    56

    回帖

    67

    积分

    初级工程师

    积分
    67

    油中3周年

    发表于 2023-11-10 07:53:45 | 显示全部楼层
    李恒道 发表于 2023-11-9 19:53
    [md]```js
    function myFunction() {
      $(document).ready(async function() {

    大佬,注释掉你的代码能进去,用你的代码就跑到console.log(1111);,不知道什么原因
    // ==UserScript==
    // @name         zh
    // @match        https://*
    // @grant        GM_registerMenuCommand
    // @grant        GM_getValue
    // @grant        GM_setValue
    // @grant        unsafeWindow
    // @run-at       document-start
    // ==/UserScript==
      var _GM_registerMenuCommand = /* @__PURE__ */ (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0)();
    // 使用GM_registerMenuCommand注册一个新的菜单项
    _GM_registerMenuCommand("Start Scraping", startScraping);
    function startScraping() {
      // 调用你的函数,设置变量为true
      myFunction()
    }
    function myFunction() {
        console.log(1111);
    //$(document).ready(async function(){
       $(document).ready( function(){
          console.log(2222);
        // 获取指定 ID 的元素
        const parentElement = document.getElementById('treeDemo');
        // 获取所有子元素
        const childElements = parentElement.children;
        // 遍历所有子元素
        for (let i = 0; i < childElements.length; i++) {
          // 判断当前元素是否为 li 标签
          if (childElements.tagName === 'LI') {
            // 获取 li 标签的 ID 并赋值给 document.getElementById()
            const id = childElements.id;
            // 在这里可以执行你需要的操作,例如打印 ID 或其他操作
            console.log(`Element with ID ${id+"_span"} found.`);
            const targetElement = document.getElementById(id + "_span"); // Correct the way to concatenate the string.
            console.log(targetElement);
            // 模拟点击事件
            if (targetElement) {
              const event = new MouseEvent('click', {
                bubbles: true,
                cancelable: true,
                view: unsafeWindow,
              });
              targetElement.dispatchEvent(event);

             // await new Promise((resolve, reject) => {
                 // setTimeout(() => {
                      //debugger
                     monitorDomChange();
                    // }, 0);
                 // });
            } else {
              console.log('目标 ul 元素不存在!');
            }
          }
        }
      });
    }
    function monitorDomChange() {
      // 你的代码在这里,例如:
      const observer = new MutationObserver(function(mutations) {
      // 其它代码
          });
      observer.observe(document.body, { childList: true, subtree: true, attributes: true });
    }
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5959

    回帖

    6758

    积分

    管理员

    非物质文化遗产社会摇传承人

    积分
    6758

    荣誉开发者喜迎中秋油中2周年生态建设者

    发表于 2023-11-10 08:07:52 | 显示全部楼层
    tansuo 发表于 2023-11-10 07:53
    大佬,注释掉你的代码能进去,用你的代码就跑到console.log(1111);,不知道什么原因
    // ==UserScript==
    / ...

    你应该还有其他代码需要同步,async具有传染性的
    这个要哥哥自己理解同步与异步问题了...
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

    入驻了爱发电https://afdian.net/a/lihengdao666
    个人宣言:この世界で私に胜てる人とコードはまだ生まれていません。死ぬのが怖くなければ来てください。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-12-25 06:51
  • 签到天数: 35 天

    [LV.5]常住居民I

    9

    主题

    56

    回帖

    67

    积分

    初级工程师

    积分
    67

    油中3周年

    发表于 2023-11-10 09:01:27 | 显示全部楼层

    李恒道 发表于 2023-11-10 08:07

    你应该还有其他代码需要同步,async具有传染性的
    这个要哥哥自己理解同步与异步问题了... ...

    monitorDomChange()除了这个代码其它代码都是全的,应该没有

    回复

    使用道具 举报

    发表回复

    本版积分规则

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