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

[油猴开发指南]关于脚本如何处理iframe的碎碎念

[复制链接]
  • TA的每日心情
    开心
    2022-3-7 09:47
  • 签到天数: 1 天

    [LV.1]初来乍到

    22

    主题

    104

    回帖

    170

    积分

    中级工程师

    积分
    170
    发表于 2022-8-16 22:38:05 | 显示全部楼层
    哥哥太厉害了,以前看postMessage,总是搞不清楚谁发给谁,这样一看感觉明了了
    回复
    订阅

    使用道具 举报

  • TA的每日心情
    开心
    2022-6-2 15:24
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    13

    主题

    56

    回帖

    79

    积分

    初级工程师

    积分
    79

    油中2周年

    发表于 2022-10-11 16:29:13 | 显示全部楼层
    1. <blockquote>// ==UserScript==
    复制代码

    跨标签页没成功,想要实现在打开搜狗后百度页面改成“打开了搜狗”,不知到那里错了
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

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

    发表于 2022-10-11 20:33:00 | 显示全部楼层
    ozon 发表于 2022-10-11 16:29
    跨标签页没成功,想要实现在打开搜狗后百度页面改成“打开了搜狗”,不知到那里错了 ...

    你代码没显示出来,是不是顺序错了?应由搜狗向百度发消息:
    1. // ==UserScript==
    2. // [url=home.php?mod=space&uid=23356]@name[/url]         跨标签页交互
    3. // @description  ...
    4. // @namespace    ...
    5. // @author       ...
    6. // @version      1.0
    7. // [url=home.php?mod=space&uid=52134]@match[/url]        https://www.baidu.com/*
    8. // @match        https://www.sogou.com/*
    9. // @grant        none
    10. // @run-at       document-idle
    11. // ==/UserScript==

    12. (function() {
    13.     'use strict';
    14.     if (location.href.includes('baidu')) {
    15.         window.open('https://www.sogou.com/');
    16.         window.addEventListener('message', e => {
    17.             if (e.data.myMessage) {
    18.                 alert(e.data.myMessage);
    19.             }
    20.         });
    21.     }
    22.     if (location.href.includes('sogou') && window.opener) {
    23.         window.opener.postMessage({
    24.             myMessage: '打开了搜狗'
    25.         }, 'https://www.baidu.com');
    26.     }
    27. })();
    复制代码
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-6-2 15:24
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    13

    主题

    56

    回帖

    79

    积分

    初级工程师

    积分
    79

    油中2周年

    发表于 2022-10-12 10:04:52 | 显示全部楼层
    cxxjackie 发表于 2022-10-11 20:33
    你代码没显示出来,是不是顺序错了?应由搜狗向百度发消息:
    1. // ==UserScript==
    2. // [url=home.php?mod=space&uid=23356]@name[/url]         跨域交互
    3. // @description  ...
    4. // @namespace    ...
    5. // @author       ...
    6. // @version      1.0
    7. // [url=home.php?mod=space&uid=52134]@match[/url]        https://www.baidu.com/*
    8. // @match        https://www.sogou.com/*
    9. // @grant        none
    10. // @run-at       document-idle
    11. // ==/UserScript==
    12. //
    13. (function() {
    14.     'use strict';
    15.     if (location.href.includes('baidu')) {
    16.         window.open('https://www.sogou.com/')
    17.         window.addEventListener('message', e => {
    18.             if (e.data.magic === true) {
    19.                 document.body.innerHTML = '打开了搜狗';
    20.             }
    21.         });
    22.     }
    23.     setTimeout(()=>{
    24.         if (location.href.includes('sogou.com')) {
    25.             window.top.postMessage({
    26.                 magic: true
    27.             }, 'https://www.baidu.com');
    28.         }
    29.     },3500)

    30. })();
    复制代码


    昨天下午修改回复后,一提交网页就卡死,访问不了网站,现在好了。对比大佬的代码我知道怎么回事了。感谢c大
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-1-30 10:43
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    1

    主题

    17

    回帖

    18

    积分

    助理工程师

    积分
    18

    新人报道

    发表于 2022-11-9 15:23:27 | 显示全部楼层
    有时候油猴会Hook两次页面,也是由于存在iframe的原因。
    回复

    使用道具 举报

    该用户从未签到

    3

    主题

    15

    回帖

    48

    积分

    初级工程师

    积分
    48

    新人报道油中2周年

    发表于 2023-2-27 14:58:52 | 显示全部楼层
    很有用,感谢分享
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2023-2-28 23:59
  • 签到天数: 191 天

    [LV.7]常住居民III

    637

    主题

    5196

    回帖

    6078

    积分

    管理员

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

    积分
    6078

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

    发表于 2023-2-27 16:20:48 | 显示全部楼层
    突然发现这标题风格极其像我的习惯起名
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

  • TA的每日心情
    无聊
    2023-10-24 23:55
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    2

    主题

    7

    回帖

    15

    积分

    助理工程师

    积分
    15
    发表于 2023-4-5 22:23:20 | 显示全部楼层

    本帖最后由 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秒加载后的,这不是引用类型嘛?

    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    862

    回帖

    1361

    积分

    荣誉开发者

    积分
    1361

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

    发表于 2023-4-6 22:19:47 | 显示全部楼层
    xiedaolin 发表于 2023-4-5 22:23
    [md]> 如果你还不知道什么是同源跨域,请先阅读此文。同源的交互是比较简单的,所有代码可以全放在主页面下 ...

    是不是因为iframe的src改变了?比如脚本刚执行时src为空,后面才被赋值,这样的话contentDocument确实会变。
    回复

    使用道具 举报

    该用户从未签到

    0

    主题

    1

    回帖

    2

    积分

    助理工程师

    积分
    2
    发表于 2023-7-14 22:27:49 | 显示全部楼层
    非常感谢,帮我解决了iframe问题
    回复

    使用道具 举报

    发表回复

    本版积分规则

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