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

关于iframe下 元素选取错误的求助

[复制链接]
  • TA的每日心情
    擦汗
    2023-4-18 13:55
  • 签到天数: 34 天

    [LV.5]常住居民I

    11

    主题

    38

    回帖

    67

    积分

    初级工程师

    积分
    67
    发表于 2023-2-15 09:27:23 | 显示全部楼层 | 阅读模式
    悬赏5油猫币已解决

    本帖最后由 ZYMKJ 于 2023-2-17 14:06 编辑

    暂时找到了,iframe下,获取元素显示Cannot read property 'contentDocument' of null 的错误原因了。
    iframe下的document 未加载完全。
    但之后又对 var iwindow = iframe1.contentWindow 循环报错

        var iframe1 = document.getElementById("mainFrame");
        var iwindow = iframe1.contentWindow;
        var idoc = iwindow.document;
        console.log(iframe1);
        console.log(iwindow);
        console.log(idoc);
        console.log(idoc.querySelectorAll('td>font'))

    1.png
    2.png
    3.png

    最佳答案

    查看完整内容

    应该是你脚本match地址的问题,估计对主页面和iframe同时生效了,第二遍是在iframe内执行的,此时获取iframe当然是没有的,所以报错。解决方法把match改详细点,或者加个判断ifr是否存在。后面fun()的没看懂什么意思。
  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-2-15 09:27:24 | 显示全部楼层
    ZYMKJ 发表于 2023-2-20 08:24
    [md]> [cxxjackie 发表于 2023-2-15 21:05](forum.php?mod=redirect&goto=findpost&pid=51741&ptid=4123)
    > ...

    应该是你脚本match地址的问题,估计对主页面和iframe同时生效了,第二遍是在iframe内执行的,此时获取iframe当然是没有的,所以报错。解决方法把match改详细点,或者加个判断ifr是否存在。后面fun()的没看懂什么意思。
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    712

    主题

    5966

    回帖

    6763

    积分

    管理员

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

    积分
    6763

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

    发表于 2023-2-15 11:35:22 | 显示全部楼层
    f12里能找到不是找错作用域了吧
    按道理contentWindow被禁是cors问题
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-4-18 13:55
  • 签到天数: 34 天

    [LV.5]常住居民I

    11

    主题

    38

    回帖

    67

    积分

    初级工程师

    积分
    67
    发表于 2023-2-15 13:45:28 | 显示全部楼层
    李恒道 发表于 2023-2-15 11:35
    f12里能找到不是找错作用域了吧
    按道理contentWindow被禁是cors问题

    不是,一样的代码,控制台正确执行,JS脚本就报错。现在替代方法是,把iframe中的url用window.open打开。
    回复

    使用道具 举报

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

    [LV.7]常住居民III

    712

    主题

    5966

    回帖

    6763

    积分

    管理员

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

    积分
    6763

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

    发表于 2023-2-15 15:39:35 | 显示全部楼层
    ZYMKJ 发表于 2023-2-15 13:45
    不是,一样的代码,控制台正确执行,JS脚本就报错。现在替代方法是,把iframe中的url用window.open打开。 ...

    最好来个demo看看
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2022-3-8 11:41
  • 签到天数: 2 天

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

    荣誉开发者卓越贡献油中2周年生态建设者油中3周年挑战者 lv2

    发表于 2023-2-15 21:05:05 | 显示全部楼层
    可能是iframe元素本身加载较慢,ElementGetter的get方法可以解决此类问题。如需异步获取iframe内的元素(必须是同源),先用get获取到iframe,再用get/each获取其下的元素,父节点设置为iframe.contentDocument即可。
    处理iframe更推荐改match地址,参考:https://bbs.tampermonkey.net.cn/thread-2895-1-1.html
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-4-18 13:55
  • 签到天数: 34 天

    [LV.5]常住居民I

    11

    主题

    38

    回帖

    67

    积分

    初级工程师

    积分
    67
    发表于 2023-2-20 08:24:37 | 显示全部楼层

    本帖最后由 ZYMKJ 于 2023-2-20 08:34 编辑

    cxxjackie 发表于 2023-2-15 21:05

    可能是iframe元素本身加载较慢,ElementGetter的get方法可以解决此类问题。如需异步获取iframe内的元素(必 ...

    大佬,求助,

        function sx(){
            var ifr = document.getElementById('mainFrame');
            var iwin = ifr.contentWindow;
            var idoc = iwin.document;
            console.log('*****************2');
            console.log(ifr)
            console.log('*****************2');
            console.log(iwin)
            console.log('*****************2');
            console.log(idoc)
            console.log('*****************2');
            console.log(idoc.querySelectorAll('td>font'))
            console.log('*****************2');
            console.log(idoc.getElementById('myCourse'))
            console.log('*****************2');
            }
            setTimeout(sx,1000)

    可以正常打印,但是会再次执行 一遍,第二遍就报错。1.png
    ,报错位置var iwin = ifr.contentWindow

    另外如果在fun sx中 判断语句 if(){}中加入fun(),不继续执行,不加fun(),可以正常判断,但没有延迟。求解

    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-4-18 13:55
  • 签到天数: 34 天

    [LV.5]常住居民I

    11

    主题

    38

    回帖

    67

    积分

    初级工程师

    积分
    67
    发表于 2023-2-21 09:10:26 | 显示全部楼层
    ZYMKJ 发表于 2023-2-20 08:24
    [md]> [cxxjackie 发表于 2023-2-15 21:05](forum.php?mod=redirect&goto=findpost&pid=51741&ptid=4123)
    > ...

    明白了。谢谢
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2023-4-18 13:55
  • 签到天数: 34 天

    [LV.5]常住居民I

    11

    主题

    38

    回帖

    67

    积分

    初级工程师

    积分
    67
    发表于 2023-2-21 13:20:24 | 显示全部楼层
    cxxjackie 发表于 2023-2-15 09:27
    应该是你脚本match地址的问题,估计对主页面和iframe同时生效了,第二遍是在iframe内执行的,此时获取ifr ...

    我重现改写了判断语句,增加了对iframe URL的判断。果然没在出现二次执行报错的问题。就像你说的,应该就是iframe加载后又执行了一次脚本。因为域不一样,报错。
    回复

    使用道具 举报

    发表回复

    本版积分规则

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