关于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)
ZYMKJ 发表于 2023-2-20 08:24
> (forum.php?mod=redirect&goto=findpost&pid=51741&ptid=4123)
> ...
应该是你脚本match地址的问题,估计对主页面和iframe同时生效了,第二遍是在iframe内执行的,此时获取iframe当然是没有的,所以报错。解决方法把match改详细点,或者加个判断ifr是否存在。后面fun()的没看懂什么意思。 f12里能找到不是找错作用域了吧
按道理contentWindow被禁是cors问题
李恒道 发表于 2023-2-15 11:35
f12里能找到不是找错作用域了吧
按道理contentWindow被禁是cors问题
不是,一样的代码,控制台正确执行,JS脚本就报错。现在替代方法是,把iframe中的url用window.open打开。 ZYMKJ 发表于 2023-2-15 13:45
不是,一样的代码,控制台正确执行,JS脚本就报错。现在替代方法是,把iframe中的url用window.open打开。 ...
最好来个demo看看 可能是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: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-20 08:24
> (forum.php?mod=redirect&goto=findpost&pid=51741&ptid=4123)
> ...
明白了。谢谢 cxxjackie 发表于 2023-2-15 09:27
应该是你脚本match地址的问题,估计对主页面和iframe同时生效了,第二遍是在iframe内执行的,此时获取ifr ...
我重现改写了判断语句,增加了对iframe URL的判断。果然没在出现二次执行报错的问题。就像你说的,应该就是iframe加载后又执行了一次脚本。因为域不一样,报错。
页:
[1]