- 封装插件的两种方式
a.单独创建一个文件,内部定义div 通过使用id 获取当前dom 然后在当前dom 的生命周期中创建插件窗口,定义插件的各个行为,初始化,销毁等其他操作,然后使用该插件时,引用该插件传入插件所需要的参数即可
b.可以在全局引入插件包后,创建一个js 文件,封装好 该插件的各个方法 然后暴露出去,其他页面文件可在自己的页面代码内创建div以及id 然后引入封装好的方法(接口)
a.方法封装
import React, {Component} from 'react';
class HkPlayer extends Component{
constructor(props){
super(props)
}
state = {
oWebControl: null,
pubKey: '', // 公钥
appkey: '29613871',
secret: '41EAYrloufvqEmuFjxkv',
ip: '59.208.84.180',
port: 1443,
width: this.props.playWidth || 2364,
height: this.props.playHeight || 1330, // 弹框高度
playHeight: this.props.playHeight || 1330,
layout: '1x1',
left: '',
top: '',
buttonIDs: '0,16,256,515',
initCount: 0,
playMode: 0, // 0 预览 1回放
playText: '启动中。。。',
cameraIndexCode: this.props.monitorDeviceNo || '' // 监控点编号
}
componentDidMount() {
this.setState({
appkey: '29613871',
secret: '41EAYrloufvqEmuFjxkv',
ip: '59.208.84.180',
port: 1443
}, () => {
this.initPlugin(() => {
this.previewVideo();
});
})
// if (this.props.hidden) {
// console.log(5555)
// this.oWebControl.JS_CuttingPartWindow(0, 0, that.state.width, that.state.height)
// }
// 监听resize事件,使插件窗口尺寸跟随DIV窗口变化
$(window).resize(() => {
// console.log('resize事件',this.state.oWebControl )
if (this.state.oWebControl != null) {
this.state.oWebControl.JS_Resize(this.state.width, this.state.height);
this.setWndCover();
}
});
// 监听滚动条scroll事件,使插件窗口跟随浏览器滚动而移动
$(window).scroll(() => {
if (this.state.oWebControl != null) {
this.state.oWebControl.JS_Resize(this.state.width, this.state.height);
this.setWndCover();
}
});
$(window).unload(() => {
if (this.oWebControl != null) {
this.state.oWebControl.JS_HideWnd(); // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
this.state.oWebControl.JS_Disconnect().then(
() => { // 断开与插件服务连接成功
},
() => { // 断开与插件服务连接失败
}
);
}
});
}
// 标签关闭
componentWillUnmount() {
if (this.state.oWebControl != null){
this.state.oWebControl.JS_HideWnd(); // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
this.state.oWebControl.JS_Disconnect().then(function(){ // 断开与插件服务连接成功
},
function() { // 断开与插件服务连接失败
});
}
}
// 推送消息
cbIntegrationCallBack(oData, t) {
console.log('返回值视频',oData.responseMsg, t );
let mesgData = oData.responseMsg
if (mesgData.type == 7 && mesgData?.msg?.cameraIndexCode) {
console.log('视频放大播放',mesgData)
// this.props.fullPlay(mesgData.cameraIndexCode)
}
}
// RSA加密
setEncrypt (value) {
var encrypt = new JSEncrypt();
encrypt.setPublicKey(this.state.pubKey);
return encrypt.encrypt(value);
}
// 创建播放实例
initPlugin(callback) {
let that = this
let oWebControl = new WebControl({
szPluginContainer: this.props.htmlid, //指定容器id
iServicePortStart: 15900, //指定起止端口号,建议使用该值
iServicePortEnd: 15900,
szClassId: "23BF3B0A-2C56-4D97-9C03-0CB103AA8F11", // 用于IE10使用ActiveX的clsid
cbConnectSuccess: function () {
// setCallbacks();
//实例创建成功后需要启动服务
// that.state.oWebControl.JS_StartService("window", {
oWebControl.JS_StartService("window", {
dllPath: "./VideoPluginConnect.dll"
}).then(function () {
// that.state.oWebControl.JS_SetWindowControlCallback({ // 设置消息回调
oWebControl.JS_SetWindowControlCallback({ // 设置消息回调
// cbIntegrationCallBack: cbIntegrationCallBack(onData,taht)
cbIntegrationCallBack: function (onData) {
console.log('ondata', onData,)
let mesgData = onData.responseMsg
if (mesgData.type == 7 && mesgData?.msg?.cameraIndexCode) {
console.log('视频放大播放',mesgData)
that.props.fullPlay(mesgData.msg.cameraIndexCode)
}
}
});
// that.state.oWebControl.JS_CreateWnd("playWnd", 1000, 600).then(function () { //JS_CreateWnd创建视频播放窗口,宽高可设定
oWebControl.JS_CreateWnd(that.props.htmlid, that.state.width, that.state.height).then(function () { //JS_CreateWnd创建视频播放窗口,宽高可设定
console.log("JS_CreateWnd success");
that.init(callback); //创建播放实例成功后初始化
// oWebControl.JS_CuttingPartWindow(0, 0, that.state.width, that.state.height)
});
}, function () {
});
},
cbConnectError: function () {
console.log("cbConnectError");
that.state.oWebControl = null;
$(`#${that.props.htmlid}`).html("插件未启动,正在尝试启动,请稍候...");
WebControl.JS_WakeUp("VideoWebPlugin://"); //程序未启动时执行error函数,采用wakeup来启动程序
that.setState({
initCount: that.state.initCount + 1
}, () => {
if (that.state.initCount < 3) {
setTimeout(function () {
that.initPlugin();
}, 3000)
} else {
$(`#${that.props.htmlid}`).html("插件启动失败,请检查插件是否安装!");
}
})
},
cbConnectClose: function (bNormalClose) {
console.log("cbConnectClose", bNormalClose,);
if (bNormalClose) {
that.setState({
oWebControl: null
}, () => {console.log('先关闭还是先滚动', that.state.oWebControl)})
}
// $(`#${that.props.htmlid}`).html("插件未启动,正在尝试启动,请稍候...");
// WebControl.JS_WakeUp("VideoWebPlugin://");
// that.setState({
// initCount:that.state.initCount + 1
// }, () => {
// if (that.state.initCount < 3) {
// setTimeout(function () {
// that.initPlugin();
// }, 3000)
// } else {
// $(`#${that.props.htmlid}`).html("插件启动失败,请检查插件是否安装!");
// }
// })
}
});
this.setState({
oWebControl
},)
}
//视频预览功能
previewVideo() {
let cameraIndexCode = this.state.cameraIndexCode;
let streamMode = 0; // 主子码流标识:0-主码流,1-子码流
let transMode = 0; // 传输协议:0-UDP,1-TCP
let gpuMode = 0; // 是否启用GPU硬解,0-不启用,1-启用
let wndId = 1; // 播放窗口序号(在2x2以上布局下可指定播放窗口)
// cameraIndexCode = cameraIndexCode?.replace(/(^\s*)/g, "");
// cameraIndexCode = cameraIndexCode?.replace(/(\s*$)/g, "");
this.state.oWebControl.JS_RequestInterface({
funcName: "startPreview",
argument: JSON.stringify({
cameraIndexCode:cameraIndexCode, //监控点编号
streamMode: streamMode, //主子码流标识
transMode: transMode, //传输协议
gpuMode: gpuMode, //是否开启GPU硬解
wndId:wndId //可指定播放窗口
})
})
this.props.getWeb( this.state.oWebControl)
// this.state.oWebControl.JS_CuttingPartWindow(0, 0, this.state.width, this.state.height)
}
//停止全部预览
stopPlayer() {
oWebControl.JS_RequestInterface({
funcName: "stopAllPreview"
});
}
// 获取公钥
getPubKey(callback) {
this.state.oWebControl.JS_RequestInterface({
funcName: "getRSAPubKey",
argument: JSON.stringify({
keyLength: 1024
})
}).then((oData) =>{
console.log('公钥',oData);
if (oData.responseMsg.data) {
this.setState({
pubKey: oData.responseMsg.data
})
callback()
}
})
}
init(callback) {
let that = this
this.getPubKey(() => {
// 请自行修改以下变量值
var appkey = "29613871"; //综合安防管理平台提供的appkey,必填
var secret = that.setEncrypt("41EAYrloufvqEmuFjxkv"); //综合安防管理平台提供的secret,必填
var ip = "59.208.84.180"; //综合安防管理平台IP地址,必填
var playMode = 0; //初始播放模式:0-预览,1-回放
var port = 1443; //综合安防管理平台端口,若启用HTTPS协议,默认443
var snapDir = "D:\\SnapDir"; //抓图存储路径
var videoDir = "D:\\VideoDir"; //紧急录像或录像剪辑存储路径
var layout = "1x1"; //playMode指定模式的布局
var enableHTTPS = 1; //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
var encryptedFields = 'secret'; //加密字段,默认加密领域为secret
var showToolbar =0; //是否显示工具栏,0-不显示,非0-显示
var showSmart = 0; //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
var buttonIDs = ""; //自定义工具条按钮
var reconnectTimes = 2; // 重连次数,回放异常情况下有效
var reconnectTime = 4;
var toolBarButtonIDs = '2049,4098,4099' // 每次重连的重连间隔 >= reconnectTime
// 请自行修改以上变量值
// let { appkey, ip,playMode,layout , buttonIDs } = this.state
that.state.oWebControl.JS_RequestInterface({
funcName: "init",
argument: JSON.stringify({
appkey: appkey, //API网关提供的appkey
secret: secret, //API网关提供的secret
ip: ip, //API网关IP地址
playMode: playMode, //播放模式(决定显示预览还是回放界面)
port: port, //端口
snapDir: snapDir, //抓图存储路径
videoDir: videoDir, //紧急录像或录像剪辑存储路径
layout: layout, //布局
enableHTTPS: enableHTTPS, //是否启用HTTPS协议
encryptedFields: encryptedFields, //加密字段
showToolbar: showToolbar, //是否显示工具栏
showSmart: showSmart, //是否显示智能信息
buttonIDs: buttonIDs,
toolBarButtonIDs:toolBarButtonIDs, //自定义工具条按钮
//reconnectTimes:reconnectTimes, //重连次数
//reconnectDuration:reconnectTime //重连间隔
})
}).then(function (oData) {
that.state.oWebControl.JS_Resize(that.state.width, that.state.height); // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
if (callback) {
callback();
}
});
});
}
// 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
setWndCover() {
const { width, height } = this.state
var iWidth = $(window).width();
var iHeight = $(window).height();
let id = `#${this.props.htmlid}`
var oDivRect = $(id).get(0)?.getBoundingClientRect();
if (oDivRect?.left) {
var iCoverLeft = (oDivRect.left < 0) ? Math.abs(oDivRect.left): 0;
var iCoverTop = (oDivRect.top < 0) ? Math.abs(oDivRect.top): 0;
var iCoverRight = (oDivRect.right - iWidth > 0) ? Math.round(oDivRect.right - iWidth) : 0;
var iCoverBottom = (oDivRect.bottom - iHeight > 0) ? Math.round(oDivRect.bottom - iHeight) : 0;
iCoverLeft = (iCoverLeft > width) ? width : iCoverLeft;
iCoverTop = (iCoverTop > height) ? height : iCoverTop;
iCoverRight = (iCoverRight > width) ? width : iCoverRight;
iCoverBottom = (iCoverBottom > height) ? height : iCoverBottom;
this.state.oWebControl.JS_RepairPartWindow(0, 0, width+ 1, height); // 多1个像素点防止还原后边界缺失一个像素条
if (iCoverLeft != 0) {
this.state.oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, height);
}
if (iCoverTop != 0) {
this.state.oWebControl.JS_CuttingPartWindow(0, 0, width+ 1, iCoverTop); // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
}
if (iCoverRight != 0) {
this.state.oWebControl.JS_CuttingPartWindow(width - iCoverRight, 0, iCoverRight, height);
}
if (iCoverBottom != 0) {
this.state.oWebControl.JS_CuttingPartWindow(0, height - iCoverBottom, width, iCoverBottom);
}
}
}
// 渲染子节点
render(){
return (
<div id={this.props.htmlid} style={{width: this.state.playWidth, height: this.state.playHeight}}></div>
)
}
}
export default HkPlayer;
使用方法:
import HkPlayer from '@/components/HkPlayer/hkPlayer'
//a 方法
<HkPlayer
htmlid={ `${item.cameraCode}` }
monitorDeviceNo={ item.cameraCode }
playWidth={ index < numsType ? 915 : 440 }
playHeight={ index < numsType ? 514 : 240 }
hidden={ item.hoverFlag }
getWeb={ (e) => this.getWebPlug(e, item, index, index < numsType ? 912 : 437, index < numsType ? 514 : 240) }
fullPlay={ this.fullLagePlay }
/>
b.方法封装
//声明公用变量
let initCount = 0
let pubKey = ''
var oWebControl = null
let width = 1000
let height = 600
let cId = ''
let fullPlayCode = ''
// 创建播放实例
const initPlugin = (containerId, w, h, onSuccess, callback) => {
cId = containerId
width = w || 1000
height = h || 6000
oWebControl = new WebControl({
szPluginContainer: containerId, // 指定容器id
iServicePortStart: 15900, // 指定起止端口号,建议使用该值
iServicePortEnd: 15909,
szClassId: '23BF3B0A-2C56-4D97-9C03-0CB103AA8F11', // 用于IE10使用ActiveX的clsid
cbConnectSuccess: () => {
// 创建WebControl实例成功
oWebControl?.JS_StartService('window', {
// WebControl实例创建成功后需要启动服务
dllPath: './VideoPluginConnect.dll' // 值"./VideoPluginConnect.dll"写死
})
.then(
() => {
// 启动插件服务成功
oWebControl.JS_SetWindowControlCallback({
// 设置消息回调
cbIntegrationCallBack: (onData) => {
console.log('onDataPlay', onData)
let mesgData = onData.responseMsg
if (mesgData.type == 7 && mesgData?.msg?.cameraIndexCode) {
callback(mesgData?.msg?.cameraIndexCode)
}
} // 创建播放实例成功后消息回调函数
})
oWebControl.JS_CreateWnd(containerId, width, height).then(() => {
//JS_CreateWnd创建视频播放窗口,宽高可设定
// onSuccess() // 创建播放实例成功后初始化
initForPreview({mplayMode: 1,containerId,width,height })
})
},
() => {
// 启动插件服务失败
}
)
},
cbConnectError: () => {
// 创建WebControl实例失败
oWebControl = null
WebControl.JS_WakeUp('VideoWebPlugin://') // 程序未启动时执行error函数,采用wakeup来启动程序
initCount++
if (initCount < 3) {
setTimeout(() => {
initPlugin(containerId, w, h, onSuccess)
}, 1000)
} else {
document.getElementById(cId).innerHTML = `<a style="color:white;" href="./static/VideoWebPlugin.exe" download="VideoWebPlugin.exe">插件启动失败,请下载插件并安装!</a>`
}
},
cbConnectClose: () => {
// 异常断开:bNormalClose = false
// JS_Disconnect正常断开:bNormalClose = true
console.log('cbConnectClose')
oWebControl = null
}
})
}
const intPluginForPlayback = option => {
return getPubKey().then(() => {
initPlayPlugin({ mplayMode: 1, ...option })
})
}
const initPlayPlugin = option => {
const { mlayout, mplayMode } = option || { mlayout: '1x1', mplayMode: 0 }
// 请自行修改以下变量值
let appkey = '29613871' //综合安防管理平台提供的appkey,必填
let secret = setEncrypt('41EAYrloufvqEmuFjxkv') //综合安防管理平台提供的secret,必填
let ip = "59.208.84.180" //综合安防管理平台IP地址,必填
let playMode = 0 //初始播放模式:0-预览,1-回放
let port = 1443 //综合安防管理平台端口,若启用HTTPS协议,默认443
let snapDir = 'D:\\SnapDir' //抓图存储路径
let videoDir = 'D:\\VideoDir' //紧急录像或录像剪辑存储路径
let layout = '1x1' //playMode指定模式的布局
let enableHTTPS = 1 //是否启用HTTPS协议与综合安防管理平台交互,这里总是填1
let encryptedFields = 'secret' //加密字段,默认加密领域为secret
let showToolbar = 0 //是否显示工具栏,0-不显示,非0-显示
let showSmart = 1 //是否显示智能信息(如配置移动侦测后画面上的线框),0-不显示,非0-显示
let buttonIDs = '' //自定义工具条按钮
// 请自行修改以上变量值
oWebControl.JS_RequestInterface({
funcName: 'init',
argument: JSON.stringify({
appkey: appkey, //API网关提供的appkey
secret: secret, //API网关提供的secret
ip: ip, //API网关IP地址
playMode: playMode, //播放模式(决定显示预览还是回放界面)
port: port, //端口
snapDir: snapDir, //抓图存储路径
videoDir: videoDir, //紧急录像或录像剪辑存储路径
layout: layout, //布局
enableHTTPS: enableHTTPS, //是否启用HTTPS协议
encryptedFields: encryptedFields, //加密字段
showToolbar: showToolbar, //是否显示工具栏
showSmart: showSmart, //是否显示智能信息
buttonIDs: buttonIDs //自定义工具条按钮
})
})
.then(() => {
oWebControl.JS_Resize(width, height) // 初始化后resize一次,规避firefox下首次显示窗口后插件窗口未与DIV窗口重合问题
startPreview(option.containerId, 1)
return Promise.resolve()
})
}
//初始化
const initForPreview = option => {
return getPubKey().then(() => {
initPlayPlugin(option)
})
}
//获取公钥
const getPubKey = () => {
return oWebControl.JS_RequestInterface({
funcName: 'getRSAPubKey',
argument: JSON.stringify({
keyLength: 1024
})
})
.then(oData => {
if (oData.responseMsg.data) {
pubKey = oData.responseMsg.data
return Promise.resolve()
}
})
}
//RSA加密
const setEncrypt = value => {
var encrypt = new JSEncrypt()
encrypt.setPublicKey(pubKey)
return encrypt.encrypt(value)
}
window.onresize = function () {
if (oWebControl != null) {
oWebControl.JS_Resize(width, height)
setWndCover()
}
}
window.onscroll = function () {
if (oWebControl != null) {
oWebControl.JS_Resize(width, height)
setWndCover()
}
}
// window.onmousewheel = function () {
// if (oWebControl != null) {
// console.log('鼠标滚动')
// oWebControl.JS_Resize(width, height)
// setWndCover()
// }
// }
// 设置窗口裁剪,当因滚动条滚动导致窗口需要被遮住的情况下需要JS_CuttingPartWindow部分窗口
const setWndCover = (cw, ch) => {
cw && (width = cw)
ch && (height = ch)
const playDiv = document.getElementById(cId)
if (playDiv) {
if (oWebControl != null) {
oWebControl.JS_Resize(width, height)
}
let iWidth = window.innerWidth
let iHeight = window.innerHeight
let oDivRect = playDiv.getBoundingClientRect()
let iCoverLeft = oDivRect.left < 0 ? Math.abs(oDivRect.left) : 0
let iCoverTop = oDivRect.top < 0 ? Math.abs(oDivRect.top) : 0
let iCoverRight = oDivRect.right - iWidth > 0 ? Math.round(oDivRect.right - iWidth) : 0
let iCoverBottom = oDivRect.bottom - iHeight > 0 ? Math.round(oDivRect.bottom - iHeight) : 0
iCoverLeft = iCoverLeft > width ? width : iCoverLeft
iCoverTop = iCoverTop > height ? height : iCoverTop
iCoverRight = iCoverRight > width ? width : iCoverRight
iCoverBottom = iCoverBottom > height ? height : iCoverBottom
oWebControl.JS_RepairPartWindow(0, 0, width, height) // 多1个像素点防止还原后边界缺失一个像素条
if (iCoverLeft !== 0) {
oWebControl.JS_CuttingPartWindow(0, 0, iCoverLeft, height)
}
if (iCoverTop !== 0) {
oWebControl.JS_CuttingPartWindow(0, 0, width, iCoverTop) // 多剪掉一个像素条,防止出现剪掉一部分窗口后出现一个像素条
}
if (iCoverRight !== 0) {
oWebControl.JS_CuttingPartWindow(width - iCoverRight, 0, iCoverRight, height)
}
if (iCoverBottom !== 0) {
oWebControl.JS_CuttingPartWindow(0, height - iCoverBottom, width, iCoverBottom)
}
}
}
const resizePosition = function (width, height) {
if (oWebControl != null) {
oWebControl.JS_Resize(width, height)
setWndCover()
}
}
const startPreview = (cameraIndexCode, wzId) => {
//获取输入的监控点编号值,必填
let streamMode = 1 //主子码流标识:0-主码流,1-子码流
let transMode = 1 //传输协议:0-UDP,1-TCP
let gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
let wndId = ''
if (undefined === wzId || '' === wzId || null === wzId) {
wndId = -1 //播放窗口序号(在2x2以上布局下可指定播放窗口)
} else {
wndId = wzId //播放窗口序号(在2x2以上布局下可指定播放窗口)
}
// cameraIndexCode = cameraIndexCode.replace(/(^\s*)/g, '')
// cameraIndexCode = cameraIndexCode.replace(/(\s*$)/g, '')
oWebControl.JS_RequestInterface({
funcName: 'startPreview',
argument: JSON.stringify({
cameraIndexCode: cameraIndexCode, //监控点编号
streamMode: streamMode, //主子码流标识
transMode: transMode, //传输协议
gpuMode: gpuMode, //是否开启GPU硬解
wndId: wndId //可指定播放窗口
})
})
}
const startPlayback = cameraIndexCode => {
//获取输入的监控点编号值,必填
let startTimeStamp = new Date().getTime() - 24 * 3600000 //回放开始时间戳,必填
let endTimeStamp = new Date().getTime() //回放结束时间戳,必填
let recordLocation = 1 //录像存储位置:0-中心存储,1-设备存储
let transMode = 1 //传输协议:0-UDP,1-TCP
let gpuMode = 0 //是否启用GPU硬解,0-不启用,1-启用
let wndId = -1 //播放窗口序号(在2x2以上布局下可指定播放窗口)
oWebControl.JS_RequestInterface({
funcName: 'startPlayback',
argument: JSON.stringify({
cameraIndexCode: cameraIndexCode, //监控点编号
startTimeStamp: Math.floor(startTimeStamp / 1000).toString(), //录像查询开始时间戳,单位:秒
endTimeStamp: Math.floor(endTimeStamp / 1000).toString(), //录像结束开始时间戳,单位:秒
recordLocation: recordLocation, //录像存储类型:0-中心存储,1-设备存储
transMode: transMode, //传输协议:0-UDP,1-TCP
gpuMode: gpuMode, //是否启用GPU硬解,0-不启用,1-启用
wndId: wndId //可指定播放窗口
})
})
}
// 标签关闭
const closeVideo = callback => {
if (oWebControl != null) {
oWebControl.JS_HideWnd() // 先让窗口隐藏,规避可能的插件窗口滞后于浏览器消失问题
return oWebControl.JS_Disconnect().then(
() => {
// 断开与插件服务连接成功
setTimeout(callback, 1000)
},
() => {
// 断开与插件服务连接失败
}
)
}
}
const handlDestory = () => {
if (oWebControl != null) {
oWebControl.JS_HideWnd()
oWebControl.JS_RequestInterface({
funcName: 'destroyWnd',
})
}
}
const capture = () => {
oWebControl.JS_RequestInterface({
argument: {
wndId: 1
},
funcName: 'snapShot'
})
return Promise.resolve()
}
export { initPlugin, initForPreview, intPluginForPlayback, startPreview, handlDestory,closeVideo, startPlayback, setWndCover, capture,resizePosition,fullPlayCode }
使用场景
import { initPlugin, setWndCover, closeVideo, resizePosition, handlDestory, fullPlayCode } from '@/components/HkPlayer/palyer'
openCameraVideoNew = (cameraInfo, e, type) => {
this.clearAllOverLays(['cameraDetail'])
const ResourceDetail = `
<div class=${styles.infoModal} >
<div class=${styles.close} id='closeBtn'>X</div>
<div id=${cameraInfo?.DOMAIN_CODE}> </div >
</div>`
if (this.state.playId) {
console.log(888888, this.state.playId)
this.setState({
playId: null
})
handlDestory()
}
initPlugin(cameraInfo?.DOMAIN_CODE, 326, 200, () => { }, (code) => this.getFullPlay(code))
this.setState({
playId: cameraInfo?.DOMAIN_CODE
})
const label = L.marker(L.latLng(cameraInfo?.LATITUDE || cameraInfo.latitude, cameraInfo?.LONGITUDE || cameraInfo?.longitude), {
zIndexOffset: 1000,
id: `cameraDetail_${cameraInfo?.DOMAIN_CODE}`,
icon: L.divIcon({
iconSize: null,
iconAnchor: [105, 250],
html: ResourceDetail
})
});
this.map.addLayer(label);
document.getElementById('closeBtn').addEventListener("click", (e) => {
this.clearAllOverLays(['cameraDetail'])
handlDestory()
this.setState({
playId: null
})
})
}
总结:
总结:A方法的好处是将插件方法都写在一个文件中 想使用该方法时只需要简单引用该组件传入响应参数即可,但是坏处是,当一些地方只能接收原生的html 时无法识别自己的定义的组件(例如地图上通过html 定义弹窗展示某点位视频),那么该组件将无法使用。
b方法的好处是,你只需要定义一个div 绑定id ,引入定义好的接口后即可随意使用暴露出来的插件方法,自定义需要的接口方法然后暴露给当前页面代码即可使用,坏处是 需要在当前页面调用插件方法 可能还要多次使用,
a 方法与b方法正常只需要使用其中一个即可解决插件问题,之所以涉及两种情形是因为 在大屏地图中资源点位 点击展示弹窗时需要通过原生的html 及js渲染样式与交互使用插件无法识别 所以只能通过div 绑定id