ZYMKJ 发表于 2023-2-15 09:27:23

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

本帖最后由 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'))
```

!(data/attachment/forum/202302/17/140605szrvwqrrpzva1rvu.png)
!(data/attachment/forum/202302/17/140627cuvjy31z31w0v23j.png)
!(data/attachment/forum/202302/17/140648evpm5qq15vhohm11.png)

cxxjackie 发表于 2023-2-15 09:27:24

ZYMKJ 发表于 2023-2-20 08:24
> (forum.php?mod=redirect&goto=findpost&pid=51741&ptid=4123)
> ...

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

李恒道 发表于 2023-2-15 11:35:22

f12里能找到不是找错作用域了吧
按道理contentWindow被禁是cors问题

ZYMKJ 发表于 2023-2-15 13:45:28

李恒道 发表于 2023-2-15 11:35
f12里能找到不是找错作用域了吧
按道理contentWindow被禁是cors问题

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

李恒道 发表于 2023-2-15 15:39:35

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

最好来个demo看看

cxxjackie 发表于 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

ZYMKJ 发表于 2023-2-20 08:24:37

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

> (forum.php?mod=redirect&goto=findpost&pid=51741&ptid=4123)
> > 可能是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)
```
可以正常打印,但是会再次执行 一遍,第二遍就报错。!(data/attachment/forum/202302/20/081545bmbbpcxo49ro977q.png)
,报错位置var iwin = ifr.contentWindow

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

ZYMKJ 发表于 2023-2-21 09:10:26

ZYMKJ 发表于 2023-2-20 08:24
> (forum.php?mod=redirect&goto=findpost&pid=51741&ptid=4123)
> ...

明白了。谢谢

ZYMKJ 发表于 2023-2-21 13:20:24

cxxjackie 发表于 2023-2-15 09:27
应该是你脚本match地址的问题,估计对主页面和iframe同时生效了,第二遍是在iframe内执行的,此时获取ifr ...

我重现改写了判断语句,增加了对iframe URL的判断。果然没在出现二次执行报错的问题。就像你说的,应该就是iframe加载后又执行了一次脚本。因为域不一样,报错。
页: [1]
查看完整版本: 关于iframe下 元素选取错误的求助