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

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

[复制链接]
  • TA的每日心情
    开心
    2024-9-29 15:06
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    9

    主题

    81

    回帖

    87

    积分

    初级工程师

    积分
    87
    发表于 2024-9-30 09:38:56 | 显示全部楼层
    cxxjackie 发表于 2024-9-29 22:32
    [md]你这个例子不太好,点击搜索后页面会发生刷新,连带着iframe也被刷掉了,导致交互效果看不出来,我给 ...


    打两个页面应该是没有问题,相当于油猴把执行代码注入sogou页面内,但是如果一个页面,嵌入另外一个页面,似乎不行。

    那如何修改为输入13800138000,点击百度搜索,不实际执行百度的搜索(实际为不刷新影响嵌入的页面)。实际将参数到sogou的输入框后点击搜索。 主要是sogou执行操作(在不打开新标签页面的情况下),我最终目的,也跨域页面执行操作。
    回复
    订阅

    使用道具 举报

  • TA的每日心情
    开心
    2024-9-29 15:06
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    9

    主题

    81

    回帖

    87

    积分

    初级工程师

    积分
    87
    发表于 2024-9-30 11:53:12 | 显示全部楼层
    if (location.href.includes('sogou')   if (location.href.includes('baidu'))  这个两判断有什么用? 一般来说,sogou不是嵌入的吗,document.querySelector('input#query').value 这个路径应该获取不到值, document.querySelector('input#stb').click(); 这个也不能操作吧。
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2024-9-30 22:40:37 | 显示全部楼层

    szzxc 发表于 2024-9-30 11:53

    if (location.href.includes('sogou') if (location.href.includes('baidu')) 这个两判断有什么用? 一 ...

    本质上iframe也是一个新页面,原理是完全一样的:

    // ==UserScript==
    // @name         跨域交互
    // @description  ...
    // @namespace    ...
    // @author       ...
    // @version      1.0
    // @match        https://www.baidu.com/*
    // @match        https://www.sogou.com/*
    // @grant        none
    // @run-at       document-idle
    // ==/UserScript==
    
    (function() {
        'use strict';
        if (location.href.includes('baidu')) {
            const iframe = document.createElement('iframe');
            iframe.src = 'https://www.sogou.com/';
            iframe.id = 'aabbcc';
            //iframe.style.display = 'none';
            iframe.style.width = '100%'; // 根据需要调整宽度
            iframe.style.height = '600px'; // 根据需要调整高度
            document.body.appendChild(iframe);
            window.addEventListener('message', e => {
                if (e.data.loaded) {
                    console.log('搜狗已加载。');
                    document.querySelector('input#su').addEventListener('click', e2 => {
                        e2.preventDefault();
                        e2.stopImmediatePropagation();
                        e.source.postMessage({
                            search: true,
                            value: document.querySelector('input#kw').value
                        }, 'https://www.sogou.com');
                    }, true);
    
                }
            });
        }
        if (location.href.includes('sogou')) {
            window.top.postMessage({
                loaded: true
            }, 'https://www.baidu.com');
            window.addEventListener('message', e => {
                if (e.data.search) {
                    document.querySelector('input#query').value = e.data.value;
                    document.querySelector('input#stb').click();
                }
            });
        }
    })();

    你对iframe的理解似乎有点问题,iframe被嵌入后视作一个新页面,与原页面隔离,脚本也会注入一个新的实例在这个iframe页面内,此时location.href会变成iframe.src,所以判断location.href可以区分当前在主页面还是iframe作用域下,也就是说,上下两段代码每次只有一段会生效,这就是为什么我多次强调,你要把他看作2个脚本,主页面的脚本做主页面的事,iframe的脚本做iframe的事,postMessage起一个传递信息的作用。

    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-9-29 15:06
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    9

    主题

    81

    回帖

    87

    积分

    初级工程师

    积分
    87
    发表于 2024-10-8 14:54:49 | 显示全部楼层

    本帖最后由 szzxc 于 2024-10-8 16:45 编辑

    本帖最后由 szzxc 于 2024-10-8 15:32 编辑

    本帖最后由 szzxc 于 2024-10-8 15:14 编辑

    本帖最后由 szzxc 于 2024-10-8 14:59 编辑

    本质上iframe也是一个新页面,原理是完全一样的:

    如果嵌套的网页是本来跨域的iframe ,要如何操作?

    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2024-10-8 22:03:45 | 显示全部楼层
    szzxc 发表于 2024-10-8 14:54
    [md]> 本帖最后由 szzxc 于 2024-10-8 15:32 编辑

    > 本帖最后由 szzxc 于 2024-10-8 15:14 编辑

    我例子里不是已经写了吗?百度和搜狗就是跨域的呀,最后那段代码已经改成iframe了。
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-9-29 15:06
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    9

    主题

    81

    回帖

    87

    积分

    初级工程师

    积分
    87
    发表于 2024-10-9 09:46:13 | 显示全部楼层
    cxxjackie 发表于 2024-10-8 22:03
    我例子里不是已经写了吗?百度和搜狗就是跨域的呀,最后那段代码已经改成iframe了。 ...

    嗯。已经改好了。真是套中套,一层套一层,每一层都是跨域的。直接改到最后一层好像也可以。现在又遇到一个问题,不过不是iframe的问题了。
    回复

    使用道具 举报

    发表回复

    本版积分规则

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