312 lines
11 KiB
JavaScript
312 lines
11 KiB
JavaScript
var i=2
|
||
let videostart=true;
|
||
function initDrawReact (id,fn) {
|
||
console.log("入口")
|
||
console.log("id="+id)
|
||
var drawArear = document.getElementById(id); // 获取画布元素
|
||
// 创建矩形框
|
||
var drawReact = document.createElement('div');
|
||
drawReact.id =id+'_box'
|
||
drawReact.style.boxSizing = 'border-box'
|
||
drawReact.style.border = '1px solid red'
|
||
drawReact.style.position = 'absolute'
|
||
drawReact.style.display = 'none'
|
||
drawArear.appendChild(drawReact)
|
||
// 绑定鼠标事件--onmousedown
|
||
drawArear.onmousedown = function ($event) {
|
||
// document.ondblclick=function($event){//双击事件
|
||
// if(i%2==0){
|
||
// i=1;
|
||
// $("#windowbox").fullScreen()
|
||
// }else{
|
||
// i=2;
|
||
// $("#windowbox").exitScreen()
|
||
// }
|
||
// }
|
||
|
||
var is3D=localStorage.getItem("threeD");
|
||
if(is3D=='false'|| is3D=='' || is3D==null){
|
||
return false;
|
||
}
|
||
|
||
if($event.button=='2'){
|
||
return false;
|
||
}
|
||
drawArear = document.getElementById(id); // 获取画布元素
|
||
// 初始化
|
||
var drawReact = document.getElementById(id+'_box'); // 获取矩形框元素
|
||
var areaInfo = drawArear.getBoundingClientRect(); // 返回元素的大小及其相对于视口的位置
|
||
var height=1000/areaInfo.height;//分为100分
|
||
var width=1000/areaInfo.width;
|
||
var reactWidth, reactHeight, reactTop, reactLeft; // 定义矩形框的宽、高、top、left
|
||
// xy坐标是以画布的左上角为原点,方向矢量以向下和向右为正方向。
|
||
var beginPoint = {}; // 标记起点
|
||
var endPoint = {}; // 标记终点
|
||
drawReact.style.zIndex="20000";
|
||
drawReact.style.display = 'block'; // 进入画布按下鼠标显示默认矩形框
|
||
// 鼠标按下的位置作为矩形框的起点,横纵坐标记为 x0, y0
|
||
beginPoint = { x: $event.clientX - areaInfo.x, y: $event.clientY - areaInfo.y }
|
||
// 起点的横坐标
|
||
var x0 = $event.clientX - areaInfo.x;
|
||
// 起点的纵坐标
|
||
var y0 = $event.clientY - areaInfo.y;
|
||
// 绑定鼠标事件--onmousemove
|
||
document.onmousemove = function ($event) {
|
||
// 终点的横坐标
|
||
var x1 = $event.clientX - areaInfo.x;
|
||
// 终点的纵坐标
|
||
var y1 = $event.clientY - areaInfo.y;
|
||
// 对终点相对于起点的位置进行分类讨论
|
||
if (x1 >= x0 && y1 < y0) {
|
||
// x 越界处理
|
||
reactWidth = $event.clientX >= areaInfo.right ? areaInfo.width - x0 : x1 - x0;
|
||
reactLeft = x0;
|
||
// y 越界处理
|
||
reactHeight = $event.clientY <= areaInfo.top ? y0 : y0 - y1;
|
||
reactTop = $event.clientY <= areaInfo.top ? 0 : y1;
|
||
// 终点
|
||
endPoint = { x: x0 + reactWidth, y: y0 - reactHeight };
|
||
} else if (x1 < x0 && y1 < y0) {
|
||
// x 越界处理
|
||
reactWidth = $event.clientX <= areaInfo.left ? x0 : x0 - x1;
|
||
reactLeft = $event.clientX <= areaInfo.left ? 0 : x1;
|
||
// y 越界处理
|
||
reactHeight = $event.clientY <= areaInfo.top ? y0 : y0 - y1;
|
||
reactTop = $event.clientY <= areaInfo.top ? 0 : y1;
|
||
// 终点
|
||
endPoint = { x: x0 - reactWidth, y: y0 - reactHeight };
|
||
} else if (x1 < x0 && y1 >= y0) {
|
||
// x 越界处理
|
||
reactWidth = $event.clientX <= areaInfo.left ? x0 : x0 - x1;
|
||
reactLeft = $event.clientX <= areaInfo.left ? 0 : x1;
|
||
// y 越界处理
|
||
reactHeight = $event.clientY >= areaInfo.bottom ? areaInfo.height - y0 : y1 - y0;
|
||
reactTop = y0;
|
||
// 终点
|
||
endPoint = { x: x0 - reactWidth, y: y0 + reactHeight };
|
||
} else if (x1 >= x0 && y1 >= y0) {
|
||
// x 越界处理
|
||
reactWidth = $event.clientX >= areaInfo.right ? areaInfo.width - x0 : x1 - x0;
|
||
reactLeft = x0
|
||
// y 越界处理
|
||
reactHeight = $event.clientY >= areaInfo.bottom ? areaInfo.height - y0 : y1 - y0;
|
||
reactTop = y0;
|
||
// 终点
|
||
endPoint = { x: x0 + reactWidth, y: y0 + reactHeight };
|
||
}
|
||
drawReact.style.width = reactWidth + 'px'; // 宽
|
||
drawReact.style.height = reactHeight + 'px'; // 高
|
||
drawReact.style.top = reactTop + 'px';
|
||
drawReact.style.left = reactLeft + 'px';
|
||
}
|
||
// 绑定鼠标事件--onmousedown
|
||
document.onmouseup = function ($event) {
|
||
document.onmousemove = null
|
||
document.onmouseup = null
|
||
// 回调
|
||
var options = { reactWidth, reactHeight, reactTop, reactLeft, beginPoint, endPoint ,id}
|
||
|
||
options.beginPoint.x=options.beginPoint.x*width;
|
||
options.beginPoint.y=options.beginPoint.y*height;
|
||
options.endPoint.x=options.endPoint.x*width;
|
||
options.endPoint.y=options.endPoint.y*height;
|
||
// console.log( options.beginPoint.x);
|
||
// console.log( options.beginPoint.y);
|
||
// console.log( options.endPoint.x);
|
||
// console.log( options.endPoint.y);
|
||
fn(options)
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
document.addEventListener('DOMContentLoaded', function() {
|
||
const windowbox = document.getElementById('windowbox');
|
||
const fullscreenElement = document.getElementById('fullscreenElement');
|
||
const contextMenu = document.getElementById('custom-context-menu');
|
||
|
||
// 全屏状态变化检测
|
||
document.addEventListener('fullscreenchange', handleFullscreenChange);
|
||
document.addEventListener('webkitfullscreenchange', handleFullscreenChange);
|
||
document.addEventListener('msfullscreenchange', handleFullscreenChange);
|
||
|
||
function handleFullscreenChange() {
|
||
const isFullscreen = document.fullscreenElement ||
|
||
document.webkitFullscreenElement ||
|
||
document.msFullscreenElement;
|
||
console.log('全屏状态变化:', isFullscreen ? '进入全屏' : '退出全屏');
|
||
}
|
||
|
||
// 自定义右键菜单实现
|
||
let menuTarget = null;
|
||
|
||
// 禁用默认右键菜单
|
||
document.addEventListener('contextmenu', function(e) {
|
||
// 在视频上右键时才显示自定义菜单
|
||
console.log("target",e.target);
|
||
if(videostart){
|
||
$("#start_video").css("display","");
|
||
$("#end_video").css("display","none");
|
||
}else{
|
||
$("#start_video").css("display","none");
|
||
$("#end_video").css("display","");
|
||
}
|
||
|
||
if (e.target === windowbox || e.target === fullscreenElement || e.target === videoPlayer) {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
menuTarget = e.target;
|
||
showContextMenu(e);
|
||
initContextMenu();
|
||
}
|
||
});
|
||
|
||
// 显示自定义菜单(全屏兼容版)
|
||
function showContextMenu(e) {
|
||
const x = e.clientX;
|
||
const y = e.clientY;
|
||
|
||
// 全屏模式下特殊处理坐标
|
||
let adjustedX = x;
|
||
let adjustedY = y;
|
||
|
||
// 检查是否在全屏模式下
|
||
const isFullscreen = document.fullscreenElement ||
|
||
document.webkitFullscreenElement ||
|
||
document.msFullscreenElement;
|
||
|
||
if (isFullscreen) {
|
||
// 全屏模式下使用layerX/layerY获取相对坐标
|
||
adjustedX = e.layerX || e.offsetX || x;
|
||
adjustedY = e.layerY || e.offsetY || y;
|
||
|
||
// 确保菜单不会超出全屏元素边界
|
||
const rect = isFullscreen.getBoundingClientRect();
|
||
const menuWidth = contextMenu.offsetWidth;
|
||
const menuHeight = contextMenu.offsetHeight;
|
||
|
||
if (adjustedX + menuWidth > rect.width) {
|
||
adjustedX = rect.width - menuWidth - 10;
|
||
}
|
||
|
||
if (adjustedY + menuHeight > rect.height) {
|
||
adjustedY = rect.height - menuHeight - 10;
|
||
}
|
||
|
||
// 全屏模式下需要将菜单附加到全屏元素内部
|
||
isFullscreen.appendChild(contextMenu);
|
||
} else {
|
||
// 非全屏模式下附加到body
|
||
document.body.appendChild(contextMenu);
|
||
}
|
||
|
||
contextMenu.style.left = adjustedX + 'px';
|
||
contextMenu.style.top = adjustedY + 'px';
|
||
contextMenu.style.display = 'block';
|
||
}
|
||
|
||
/* // 菜单项点击处理
|
||
contextMenu.addEventListener('click', function(e) {
|
||
console.log(111111111111);
|
||
const menuItem = e.target.closest('.context-menu-item');
|
||
console.log(22222222222);
|
||
console.log("menuItem",menuItem);
|
||
if (!menuItem) return;
|
||
|
||
const action = menuItem.getAttribute('data-action');
|
||
console.log(333333);
|
||
console.log("action",action);
|
||
switch (action) {
|
||
case 'copy':
|
||
console.log('执行copy操作');
|
||
break;
|
||
case 'paste':
|
||
console.log('执行paste操作');
|
||
break;
|
||
case 'exit-fullscreen':
|
||
exitFullscreen();
|
||
break;
|
||
}
|
||
|
||
contextMenu.style.display = 'none';
|
||
});*/
|
||
|
||
// 替换原来的菜单事件处理代码
|
||
function initContextMenu() {
|
||
// 1. 确保菜单元素可以接收事件
|
||
contextMenu.style.pointerEvents = 'auto';
|
||
|
||
// 2. 使用mousedown而不是click(更早捕获事件)
|
||
contextMenu.addEventListener('mousedown', function(e) {
|
||
e.stopImmediatePropagation();
|
||
}, true); // 捕获阶段
|
||
|
||
// 3. 为每个菜单项单独绑定事件
|
||
const items = contextMenu.querySelectorAll('.context-menu-item');
|
||
items.forEach(item => {
|
||
// 阻止所有可能干扰的事件
|
||
['mousedown', 'mouseup', 'click', 'touchstart'].forEach(event => {
|
||
item.addEventListener(event, function(e) {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
e.stopImmediatePropagation();
|
||
|
||
// 只在mouseup或touchend时触发动作
|
||
if (event === 'mouseup' || event === 'touchend') {
|
||
const action = this.getAttribute('data-action');
|
||
handleMenuAction(action);
|
||
contextMenu.style.display = 'none';
|
||
}
|
||
|
||
return false;
|
||
}, true); // 捕获阶段
|
||
});
|
||
|
||
// 特别处理全屏状态
|
||
item.addEventListener('click', function(e) {
|
||
if (document.fullscreenElement) {
|
||
e.preventDefault();
|
||
e.stopPropagation();
|
||
const action = this.getAttribute('data-action');
|
||
handleMenuAction(action);
|
||
contextMenu.style.display = 'none';
|
||
return false;
|
||
}
|
||
});
|
||
});
|
||
|
||
// 4. 全局点击隐藏菜单(使用捕获阶段)
|
||
document.addEventListener('click', function(e) {
|
||
if (!contextMenu.contains(e.target)) {
|
||
contextMenu.style.display = 'none';
|
||
}
|
||
}, true);
|
||
|
||
// 5. 全屏状态变化时重新附加菜单
|
||
document.addEventListener('fullscreenchange', function() {
|
||
if (!document.fullscreenElement) {
|
||
document.body.appendChild(contextMenu);
|
||
}
|
||
});
|
||
}
|
||
|
||
// 处理菜单动作
|
||
function handleMenuAction(action) {
|
||
switch (action) {
|
||
case 'save_image':
|
||
screenshot();
|
||
break;
|
||
case 'start_video':
|
||
videostart=false;
|
||
$("#videoLocal").click()
|
||
break;
|
||
case 'end_video':
|
||
videostart=true;
|
||
$("#videoLocal").click()
|
||
|
||
break;
|
||
default:
|
||
console.log('未知动作:', action);
|
||
}
|
||
}
|
||
}); |