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

求助:判断用户关闭浏览器-beforeunload事件

[复制链接]

该用户从未签到

1

主题

4

回帖

5

积分

助理工程师

积分
5
发表于 2022-10-31 10:38:46 | 显示全部楼层 | 阅读模式
悬赏15油猫币未解决

我这里有一个视频连续播放的网页,每段视频播放结束就自动弹窗是否选择下个视频,

2.jpg

我已经实现了自动默认选择是,但是接着又会弹窗另一个window窗体

4.jpg

点击离开后,才能接着播放下一个视频。这个弹窗是window窗体,弹出时,浏览器无法点击操作。

查看后台JS,发现是调用beforeunload事件
1.jpg
3.jpg

这个beforeunload事件附带有其他必须的操作,所以无法避免,有没有什么办法自动化这个窗体的选择,非常感谢交流!

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5966

    回帖

    6763

    积分

    管理员

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

    积分
    6763

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

    发表于 2022-10-31 10:45:03 | 显示全部楼层
    window窗体那个叫模态框
    一般由window.alert/window.confirm之类的触发的
    看他用的哪个函数直接hook掉返回特定的默认值就好了
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    回帖

    5

    积分

    助理工程师

    积分
    5
    发表于 2022-10-31 11:04:48 | 显示全部楼层
    李恒道 发表于 2022-10-31 10:45
    window窗体那个叫模态框
    一般由window.alert/window.confirm之类的触发的
    看他用的哪个函数直接hook掉返回 ...

    这个hook掉,具体是怎么操作呢!?

    我还是脚本小白。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 08:54
  • 签到天数: 812 天

    [LV.10]以坛为家III

    31

    主题

    552

    回帖

    1556

    积分

    荣誉开发者

    积分
    1556

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2022-10-31 11:14:35 | 显示全部楼层
    把$(window).bind……这段代码复制一遍,然后去掉最后一行return
    写进脚本就行
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-10-28 07:07
  • 签到天数: 193 天

    [LV.7]常住居民III

    712

    主题

    5966

    回帖

    6763

    积分

    管理员

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

    积分
    6763

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

    发表于 2022-10-31 11:19:37 | 显示全部楼层
    hibanz 发表于 2022-10-31 11:04
    这个hook掉,具体是怎么操作呢!?

    我还是脚本小白。

    steven026解答了
    我刚才说错了
    直接卸载掉原函数然后重新复写一遍就好了
    混的人。
    ------------------------------------------
    進撃!永遠の帝国の破壊虎---李恒道

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

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    回帖

    5

    积分

    助理工程师

    积分
    5
    发表于 2022-10-31 14:21:53 | 显示全部楼层
    本帖最后由 hibanz 于 2022-10-31 14:30 编辑
    steven026 发表于 2022-10-31 11:14
    把$(window).bind……这段代码复制一遍,然后去掉最后一行return
    写进脚本就行

    (function() {
        'use strict';
        // Your code here...

        var vBtn = document.querySelector('.ccH5PlayBtn');

        console.log("1ccH5PlayBtn is: "+$('ccH5PlayBtn').length);
        console.log("1video is: "+$('video').length);

        function AutoClick(vBtn) {
            var tm = window.setInterval(() => {
                vBtn.click();
                window.clearInterval(tm);
            }, 1000);
        }

        setTimeout(() => {
            AutoClick($('.ccH5PlayBtn'));
            console.log("3video is: "+$('video').length);

            var v = document.querySelector('video');

                v.addEventListener("ended", function () { //结束
                    console.log("播放结束");

                    setTimeout(() => {
                        console.log($('.layui-layer-btn0').length);

                        var btn = document.querySelector('.layui-layer-btn0');
                        
                        var tm2 = window.setInterval(() => {
                            btn.click();
                            window.clearInterval(tm2);
                        }, 1000);
                        
                        $(window).bind("beforeunload", function (e) {
                            console.log("beforeunload");
                            var isRes = saveHistory();
                            e.returnValue = false;
                            sleep(100);//延迟 保证先保存记录再刷新或者关闭页面
                            //return isRes;
                        });
                    }, 1000);

                }, false);// end of addEventListener

        }, 1000);//end of setTimeout

    })();//end of function()



    以上是我的代码,添加了没有return的段,但是还是先执行了后台的js,再执行这段。
    请问是代码插入的位置不对吗!?
    5.jpg
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 08:54
  • 签到天数: 812 天

    [LV.10]以坛为家III

    31

    主题

    552

    回帖

    1556

    积分

    荣誉开发者

    积分
    1556

    荣誉开发者新人进步奖油中2周年生态建设者新人报道挑战者 lv2油中3周年喜迎中秋

    发表于 2022-10-31 14:30:12 | 显示全部楼层
    hibanz 发表于 2022-10-31 14:21
    (function() {
        'use strict';
        // Your code here...

    我试了下jQuery的bind有点怪……
    你写成这样吧
    1.                     window.onbeforeunload= function () {
    2.                         console.log("beforeunload");
    3.                         var isRes = saveHistory();
    4.                         sleep(100);//延迟 保证先保存记录再刷新或者关闭页面
    5.                     });
    复制代码
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    回帖

    5

    积分

    助理工程师

    积分
    5
    发表于 2022-10-31 15:13:10 | 显示全部楼层
    我再次尝试了,依然不行。

    我又再次查看了后台JS代码,其中:
    //刷新、关闭浏览器和切换视频(因为切换视频会刷重新定向到studyduration/index)会执行beforeunload方法,浏览器弹出离开提示,
    //执行顺序为保存看课记录并且浏览器弹出离开的提示框,点击确定后刷新或关闭或切换。
    //如果浏览器打开没有做任何操作,这时候刷新、关闭浏览器,chrome不会弹出离开的提示框,会造成先执行跳转,再保存看课记录
    //也就是必须交互一下浏览器才会触发离开提示,因为有了提示才会先SaveHistory再执行a标签的href
    $(window).bind("beforeunload", function (e) {
        console.log("beforeunload");
        var isRes = saveHistory();
        e.returnValue = false;
        sleep(500);//延迟 保证先保存记录再刷新或者关闭页面
        return isRes;
    });

    好像不是代码插入的问题
    回复

    使用道具 举报

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

    [LV.1]初来乍到

    22

    主题

    881

    回帖

    1379

    积分

    荣誉开发者

    积分
    1379

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

    发表于 2022-10-31 20:51:36 | 显示全部楼层
    jQuery处理比较简单,先unbind解绑原事件,再自己重新绑一个上去,重点是去掉returnValue这一行:
    1. $(window).unbind('beforeunload').bind('beforeunload', e => {
    2.     console.log("beforeunload");
    3.     var isRes = saveHistory();
    4.     sleep(500);
    5.     return isRes;
    6. });
    复制代码
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    回帖

    5

    积分

    助理工程师

    积分
    5
    发表于 2022-11-1 15:03:52 | 显示全部楼层

    以上重写bind的方式都试过了,还是不行,不知道是什么原因。

    我又重新查看了页面元素,第一个选择页面

    image.png

    “是”有一个事件监听器,我使用事件拦截,也无法拦截这个事件

    btn.addEventListener("click",(e)=>{
     e.preventDefault()
    console.log("click on this");
    })

    7.jpg

    我已经不知道要怎么进行下去了,有点想放弃了!!!

    回复

    使用道具 举报

    发表回复

    本版积分规则

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