监听页面异常 + 监听页面跳转 +监听页面销毁 :监听并记录当前页面停留的时间

news2024/12/23 22:20:34

        首先描述一下应用场景:播放视频,记录观看时长移动端左划动,右滑动,页面跳转,页面销毁[页面销毁主要是指使用中控台直接销毁])

        说一下我的思路:

     1.长链接 :

        使用websocket来实现(实际上是用心跳来检测链接是否已经断开(销毁),这个理论上来说可以,奈何这个项目使用的是Websocket+Mongo来实现观看时间的记录,原始数据放在SqlMongoSql数据同步又是使用的定时任务,要去重新做有些麻烦,但是项目又是非常紧急的,所以我把思路放到了第二种方法上,使用js

        2.JS:

        使用JS最开始的时候是想使用定时器,但是开销太大了,如果设置间隔过大,数据记录又会出现偏差,所以去掉了使用定时器的方法,那不是没有办法了吗? 其实还有其他办法的,使用监听事件,那么我们结合实际情况来分别讲一下使用js原生和js的封装方法来分别实现

        2.1 使用js原生来实现:video 标签播放i视频

        //HTML部分
                <video id="video-active" class="video-active" width="640"                         height="390"controls="controls">
                    <source src="视频播放地址" type="video/mp4">
                </video>

        //JS部分
        <script>
        //定义容器
        var times='';
        //页面初始化方法
        $(document).ready(function(){
                //监听时长
                $("#video-active").on(
                        "timeupdate",
                        function(event){
                               times = this.currentTime
                        },
                    );
               //监听跳转事件
               window.onunload = function() {
                        //发送ajax请求(duty,修改数据)
                           var url = "请求地址";
                          $.post(url,{times :times }function (res) {

                           }, 'json');

                         //必须要有返回值(返回值为空也可以)
                return "";
               }

   });
</script>

原生JS的监听就发生在onunload事件中

      2.2 使用addEventListener 侦听事件来实现:阿里视频点播

        为什么需要这个事件来监听?有同学一定会问!那是因为我视频播放的是阿里云的视频点播,所以前面的onunload事件失效,那么我们先介绍下addEventListener参数:


  1、type:String(事件的类型)
  2、listener:Function
  侦听到事件后处理事件的函数。 此函数必须接受 Event 对象作为其唯一的参数,并且不能返回任何结果,如以下示例所示: 访问修饰符function函数名(evt:Event):void
  3、useCapture:Boolean (default = false)
  这里牵扯到“事件流”的概念。侦听器在侦听时有三个阶段:捕获阶段、目标阶段和冒泡阶段。顺序为:捕获阶段(根节点到子节点检查是否调用了监听函数)→目标阶段(目标本身)→冒泡阶段(目标本身到根节点)。此处的参数确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。如果将 useCapture 设置为 true,则侦听器只在捕获阶段处理事件,而不在目标或冒泡阶段处理事件。 如果useCapture 为false,则侦听器只在目标或冒泡阶段处理事件。 要在所有三个阶段都侦听事件,请调用两次 addEventListener,一次将 useCapture 设置为true,第二次再将useCapture 设置为 false。
  4、priority:int (default = 0)
  事件侦听器的优先级。 优先级由一个带符号的 32 位整数指定。 数字越大,优先级越高。 优先级为 n 的所有侦听器会在优先级为 n -1的侦听器之前得到处理。 如果两个或更多个侦听器共享相同的优先级,则按照它们的添加顺序进行处理。 默认优先级为 0。
  5、useWeakReference:Boolean (default = false)
  确定对侦听器的引用是强引用,还是弱引用。 强引用(默认值)可防止您的侦听器被当作垃圾回收。 弱引用则没有此作用。

前面说完了概念那么我们直接上代码,代码分为两个部分,一部分是阿里云视频点播,第二部分是监听部分:

HTML部分

<div class="prism-player" id="J_prismPlayer"></div>

JS部分

<script>
    //播放容器
    var skinLayout = [
        {name: "bigPlayButton", align: "cc"},
        {name: "H5Loading", align: "cc"},
        {name: "errorDisplay", align: "tlabs", x: 0, y: 0},
        {name: "infoDisplay"},
        {name:"tooltip", align:"blabs",x: 0, y: 56},
        {name: "thumbnail"},
        {name: "controlBar", align: "blabs", x: 0, y: 0,
            children: [
                {name: "progress", align: "blabs", x: 0, y: 44},
                {name: "playButton", align: "tl", x: 15, y: 12},//播放/暂停按钮
                {name: "timeDisplay", align: "tl", x: 10, y: 7},//播放时间
                {name: "fullScreenButton", align: "tr", x: 25, y: 12},//全屏
                {name: "volume", align: "tr", x: 18, y: 10},//音量
            ]
        }
    ];

    //区分播放载体(Window,Mac,Linux)
    function validataOS(){
        if(navigator.userAgent.indexOf("Window")>0){
            return "Windows";
        }else if(navigator.userAgent.indexOf("Mac OS X")>0) {
            return "Mac" ;
        }else if(navigator.userAgent.indexOf("Linux")>0) {
            return "Linux";
        }else{
            return NUll;
        }
    }
    var computer_type = validataOS();
    //视频id
    var vid= 视频凭证ID
    //播放器配置
    var player_config={
        id: 'J_prismPlayer',
        width: '100%',
        height:'50%',
        skinLayout: skinLayout,
        autoplay:true,   //禁止自动播放
        isLive:true,//禁止进度条
        rePlay:true,//禁止自动循环播放
        preload:true,
        components: [
            {name: 'MemoryPlayComponent', type: AliPlayerComponent.MemoryPlayComponent},
            {name: 'RateComponent',type: AliPlayerComponent.RateComponent},//倍数播放组件
        ],
        cover:视频播放页面(就是上面图片示例里面的蓝色的部分),
    };
    //分配
    if(player_config.isLive){
        player_config.source = 播放地址;
        player_config.components=[ {name: 'MemoryPlayComponent', type: AliPlayerComponent.MemoryPlayComponent},]
    }else if(computer_type != 'Windows' || !vid){
        player_config.source = 播放地址;
    }else{
        player_config.encryptType = 1;
        player_config.vid = vid;
        player_config.playauth ='播放模式';
    }
    //初始化
    var player = new Aliplayer(player_config, function (player) {
        player.on('timeupdate',function() {
            //获取时间
            look_time = Math.round(player.getCurrentTime());
        });
    });

    $(document).ready(function(){
        document.addEventListener('visibilitychange', function logData() {
            if (document.visibilityState === 'hidden') {
                navigator.sendBeacon('请求地址');
            }
        });
    })

</script>

post请求记录方法:提供示例为php:

public function ajaxvedio(){

    //创建文件夹
    if(!is_dir(FCPATH."/vediotest")){
            mkdir(FCPATH."/vediotest",0777);
    }
    file_put_contents ( FCPATH."/vediotest/".date('Y-m-d').".txt", "【".date ( "Y-m-d H:i:s" ) . "】\r\n \t" . "记录" . "\r\n", FILE_APPEND );
}

监听结果:

        至此监听页面异常 + 监听页面跳转 +监听页面销毁 :监听并记录当前页面停留的时间功能讲解完成,至于还有没有其他方法,欢迎大家指教

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/957381.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鲁棒优化入门(7)—Matlab+Yalmip两阶段鲁棒优化通用编程指南(下)

0.引言 上一篇博客介绍了使用Yalmip工具箱求解单阶段鲁棒优化的方法。这篇文章将和大家一起继续研究如何使用Yalmip工具箱求解两阶段鲁棒优化(默认看到这篇博客时已经有一定的基础了&#xff0c;如果没有可以看看我专栏里的其他文章)。关于两阶段鲁棒优化与列与约束生成算法的原…

1654. 到家的最少跳跃次数

文章目录 Tag题目来源题目解读解题思路实现细节实现代码复杂度分析 写在最后 Tag 【广搜】【上限证明】【图论】 题目来源 1654. 到家的最少跳跃次数. 题目解读 找到从位置 0 跳跃到位置 x 的最小跳跃次数&#xff0c;跳跃规则如下&#xff1a; 前进方向跳 a 个位置&…

OJ练习第156题——带因子的二叉树

带因子的二叉树 力扣链接&#xff1a;823. 带因子的二叉树 题目描述 给出一个含有不重复整数元素的数组 arr &#xff0c;每个整数 arr[i] 均大于 1。 用这些整数来构建二叉树&#xff0c;每个整数可以使用任意次数。其中&#xff1a;每个非叶结点的值应等于它的两个子结点…

LC315. 计算右侧小于当前元素的个数(归并排序 - java)

计算右侧小于当前元素的个数 题目描述归并排序代码演示: 上期经典 题目描述 难度 - 困难 原题链接 - 计算右侧小于当前元素的个数 给你一个整数数组 nums &#xff0c;按要求返回一个新数组 counts 。数组 counts 有该性质&#xff1a; counts[i] 的值是 nums[i] 右侧小于 nums…

【OJ比赛日历】快周末了,不来一场比赛吗? #09.03-09.09 #12场

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-09-03&#xff08;周日&#xff09; #5场比赛2023-09-04…

代码随想录笔记--字符串篇

目录 1--反转字符串 2--反转字符串II 3--反转字符串中的单词 4--KMP算法 5--重复的子字符串 1--反转字符串 主要思路&#xff1a; 双指针算法&#xff0c;交换两个指针的字符&#xff1b; #include <iostream> #include <vector>class Solution { public:void…

Unity ShaderGraph教程——进阶shader

1.水面&#xff08;一&#xff09; 公式&#xff1a;场景深度 节点深度 — 屏幕空间位置的W向量 半透明物体与不透明物体的相交边缘 原理&#xff1a;场景深度 节点深度包含透明像素&#xff0c;屏幕空间w向量不包含透明像素。 注意&#xff1a;需要在UniversalRP-xxxQuali…

PHP旅游管理系统Dreamweaver开发mysql数据库web结构php编程计算机网页

一、源码特点 PHP 旅游管理系统是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 PHP 旅游管理系统 源码下载地址&#xff1a; https://download.csdn.net/download/qq_41…

linux centos7 系统之编程:求水仙花数

在Python编程中&#xff0c;有列表、元组和字典三类变量可以使用&#xff0c;方便数据的存储与处理&#xff0c;而bash中仅有字符串变量、数组、函数可用&#xff0c;方法运用上受到限制&#xff0c;这与bash基于C语言&#xff0c;注重语法结构的严谨有关。而Python等高级语言更…

JS数组原理探究!

JavaScript 数组的 API 经常会被 JS 开发者频繁使用&#xff0c;在整个 JavaScript 的学习过程中尤为重要。 数组作为一个最基础的一维数据结构&#xff0c;在各种编程语言中都充当着至关重要的角色&#xff0c;你很难想象没有数组的编程语言会是什么模样。特别是 JavaScript&…

Stable Diffusion 提示词技巧

文章目录 背景介绍如何写好提示词提示词的语法正向提示词负向提示词 随着AI技术的不断发展&#xff0c;越来越多的新算法涌现出来&#xff0c;例如Stable Diffusion、Midjourney、Dall-E等。相较于传统算法如GAN和VAE&#xff0c;这些新算法在生成高分辨率、高质量的图片方面表…

可控生成:ControlNet原理

论文&#xff1a;Adding Conditional Control to Text-to-Image Diffusion Models 代码&#xff1a;lllyasviel/ControlNet 简单来说ControlNet希望通过输入额外条件来控制大型图像生成模型&#xff0c;使得图像生成模型根据可控。 1. 动机 当前文生图任务中会出现如下问题&…

【LeetCode】剑指 Offer Ⅱ 第5章:哈希表(6道题) -- Java Version

题库链接&#xff1a;https://leetcode.cn/problem-list/e8X3pBZi/ 类型题目解决方案哈希表的设计剑指 Offer II 030. 插入、删除和随机访问都是O(1) 的容器HashMap ArrayList ⭐剑指 Offer II 031. LRU 缓存HashMap 双向链表 ⭐哈希表的应用剑指 Offer II 032. 有效的变位…

pytorch中 nn.Conv2d的简单用法

torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue,padding_modezeros)参数介绍&#xff1a; in_channels&#xff1a;卷积层输入通道数 out_channels&#xff1a;卷积层输出通道数 kernel_size&#xff1a;卷积层的…

AZ900备考

文章目录 云服务的概念云服务模型云服务类型消费的模型云服务的好处可靠性和可预测性的优势云中的管理 Azure 体系结构和服务核心结构组件物理基础结构组件 Azure计算和网络服务Azure 存储服务身份认证AD身份认证 Azure 管理和治理成本管理治理合规性的功能和工具管理和部署Azu…

Java设计模式:四、行为型模式-05:备忘录模式

文章目录 一、定义&#xff1a;备忘录模式二、模拟场景&#xff1a;备忘录模式三、改善代码&#xff1a;备忘录模式3.1 工程结构3.2 备忘录模式模型结构图3.3 备忘录模式定义3.3.1 配置信息类3.3.2 备忘录类3.3.3 记录者类3.3.4 管理员类 3.4 单元测试 四、总结&#xff1a;备忘…

如何构建自己的技术博客

本文相关知识点&#xff1a; markdownVuepress/vitepressGitHub pages 托管服务 为什么建议搭建个人博客网站 拥有自己的技术博客&#xff0c;不仅可以提升自己的技术能力&#xff0c;还可以提升自己的影响力&#xff0c;未来也可能带来一些“睡后”收益。 对于我们职场新人…

QTday2(登录界面+跳转——小黄人篇)

1.完成登录框的按钮操作&#xff0c;并在登录成功后进行界面跳转 form.h&#xff1a; #ifndef FORM_H #define FORM_H#include <QWidget> #include <QPushButton> #include <QDebug> #include <QLineEdit> //行编辑器 #include <QLab…

W5500-EVB-PICO主动PING主机IP检测连通性(十)

前言 上一章我们用W5500_EVB_PICO 开发板做UDP组播数据回环测试&#xff0c;那么本章我们进行W5500_EVB_PICO Ping的测试。 什么是PING&#xff1f; Ping &#xff08;Packet Internet Groper&#xff09;是一种因特网包探索器&#xff0c;用于测试网络连接量的程序 。Ping是…

python读取图像小工具

一、和图像交互获得图像的坐标和像素值 import cv2 import numpy as np import signal import threading import timeif __name__ __main__:img cv2.imread(XXX,0)#读取图片font_face,font_scale,thicknesscv2.FONT_HERSHEY_SIMPLEX,0.5,1#鼠标交互def mouseHandler(event,x…