本帖最后由 xiedaolin 于 2023-4-5 22:25 编辑
如果你还不知道什么是同源跨域,请先阅读此文。同源的交互是比较简单的,所有代码可以全放在主页面下处理。主页面先获取iframe所在的元素,iframe.contentWindow即目标window,iframe.contentDocument即目标document,可以用-ment会取到null。解决方法很简单,监听一下iframe的load事件即可,为便于处理,我们可以把这个过程封装一下:
function getIframeDocument(iframe) {
return new Promise(resolve => {
if (iframe.contentDocument) {
resolve(iframe.contentDocument);
} else {
iframe.addEventListener('load', e => {
resolve(iframe.contentDocument);
});
}
});
}
这里在实际运行我有一个疑问,我获取了iframe 里面的document,可是这个对象只是这一时刻的,也就是说此后的过程中document里面的正在加载别的内容和之前设传递的变量optDocument无关了,难道对象不是引用的?
` function getOptDocument(iframe) {
console.log("有没有iframe元素了???", iframe);
if (iframe) {
return new Promise((resolve, reject) => {
// if (iframe.contentDocument) {
// resolve(iframe.contentDocument);
// // resolve(iframe.contentWindow.document);
// console.log("Run here !!!");
// } else {
// 监听一下iframe的load事件即可
iframe.addEventListener('load', e => {
resolve(iframe.contentDocument);
});
// }
});
} else {
return new Promise((resolve, reject) => {
resolve(document);
});
}
}..then((optDocument) => {
console.log("#main-content ",optDocument.querySelector("#main-content"),
}
在接下来的输出中怎么都获取不到这个元素,就是setTimeout 10秒也不行,后面上半段注释了,使用加载事件可以了
我的疑问是,我延迟10秒为什么也不行,从日志输出来看 这个iframe里面的document对象,就是我获取的那一瞬时间的document,为什么不是10秒加载后的,这不是引用类型嘛?