function GetDefaultConn() { if(document.location.href.toLowerCase().indexOf("https") == -1) return 'ws://wrl.zorrosoft.com:83?sid=' + getrandom(5).toLocaleString() + '&flag=1'; else return 'wss://wrl.zorrosoft.com:443?sid=' + getrandom(5).toLocaleString() + '&flag=1'; } // 判断是否IE浏览器,用于区别使用Web Socket连接组件 function isIE() { if (!!window.ActiveXObject || "ActiveXObject" in window) return true; else return false; } // 判断是否为Firefox,用于区别处理页面滚动和页面切换可见性 function isFirefox() { if (navigator.userAgent.toLowerCase().indexOf("firefox") != -1) return true; else return false; } function hasVerticalScrollbar() { if(document.documentElement.clientHeight) return document.body.scrollHeight > document.documentElement.clientHeight; return document.body.scrollHeight > window.innerHeight; } function hasHorizontalScrollbar() { if(document.documentElement.clientWidth) return document.body.scrollWidth > document.documentElement.clientWidth; return document.body.scrollWidth > window.innerWidth; } function getScrollbarWidth() { var scrollDiv = document.createElement("div"); scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;'; document.body.appendChild(scrollDiv); var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth; document.body.removeChild(scrollDiv); return scrollbarWidth; } // 获取随机数 function getrandom(nums) { return ('000000'+ Math.floor(Math.random() * 999999)).slice(-6); } (function (window, undefined) { $(function () { ////////////////////// 目前脚本只支持一个网页内启动单个小程序 ///////////////////////// var $win = $('body'); var PluginOKSocket; // WebSocket主连接对象 var appletsocket; // WebSocket连接小程序对象 var nRequstAppletID = 0; // 请求启动小程序的序号 var nAppletRunID = 0; // 小程序启动后的实例序号 var bIsSendScrollInfo = false; // 是否已发送滚动条信息 var bRunInCurrentPage = true; // 是否为当前页面加载的小程序 var nScrollLeftOld = 0; // 原横向滚动位置 var nScrollTopOld = 0; // 原纵向滚动位置 showmessage = function (msg, type) { var datetime = new Date(); var tiemstr = datetime.getHours() + ':' + datetime.getMinutes() + ':' + datetime.getSeconds() + '.' + datetime.getMilliseconds(); if (type) { var $p = $('
').appendTo($('body').find('#div_msg')); var $type = $('').text('[' + tiemstr + ']' + type + ':').appendTo($p); var $msg = $('').addClass('thumbnail').css({ 'margin-bottom': '5px' }).text(msg).appendTo($p); } else { var $center = $('
').text(msg + '(' + tiemstr + ')').css({ 'font-size': '12px' }).appendTo($('body').find('#div_msg')); } }; WrlVisibilityListener = function (AddEvent) { if(bRunInCurrentPage) { if(AddEvent) document.addEventListener('visibilitychange',PageVisibilityState,false); else document.removeEventListener('visibilitychange',PageVisibilityState,false); } } WrlScrollListener = function (AddEvent) { if(!isFirefox()) { if(AddEvent) { if(window.pageXOffset != undefined) document.onscroll = scrollFunc; else window.onscroll = scrollFunc; } } else { if(AddEvent) document.addEventListener("scroll",scrollFunc,false); else document.removeEventListener("scroll",scrollFunc); } } // 滚动内嵌小程序 scrollFunc = function (e) { if(!nAppletRunID || !bRunInCurrentPage) return; var nOffsetX = 0,nScrollLeft = 0; var nOffsetY = 0,nScrollTop = 0; if(window.pageXOffset != undefined) nScrollLeft = Math.round(window.pageXOffset); else { //获取页面的scrollTop,scrollLeft(兼容写法) nScrollLeft = Math.round(document.documentElement.scrollTop || document.body.scrollTop); } if(window.pageYOffset != undefined) nScrollTop = Math.round(window.pageYOffset); else { //获取页面的scrollTop,scrollLeft(兼容写法) nScrollTop = Math.round(document.documentElement.scrollTop || document.body.scrollTop); } nOffsetX = nScrollLeftOld - nScrollLeft; nOffsetY = nScrollTopOld - nScrollTop; nScrollLeftOld = nScrollLeft; nScrollTopOld = nScrollTop; if(nOffsetX || nOffsetY) WrlScrollApplet(nScrollLeft,nScrollTop,nOffsetX,nOffsetY); } function SendScrollInfo() { if(nAppletRunID) { var nScrollTop = 0,nScrollLeft = 0,BarCode = 0; var bHorizontalBar = hasHorizontalScrollbar(); var bVerticalBar = hasVerticalScrollbar(); if(bHorizontalBar) { if(window.pageXOffset != undefined) nScrollLeft = Math.round(window.pageXOffset); else { //获取页面的scrollLeft(兼容写法) nScrollLeft = Math.round(document.documentElement.scrollLeft || document.body.scrollLeft); } nScrollLeftOld = nScrollLeft; } if(bVerticalBar) { if(window.pageYOffset != undefined) nScrollTop = Math.round(window.pageYOffset); else { //获取页面的scrollTop(兼容写法) nScrollTop = Math.round(document.documentElement.scrollTop || document.body.scrollTop); } nScrollTopOld = nScrollTop; } var msg = '{"req":"Wrl_ScrollBar","rid":'; msg += getrandom(5).toLocaleString(); msg += ',"para":{"ID":'; msg += nAppletRunID; msg += ',"BarH":'; if(bHorizontalBar) BarCode = 1; msg += 0; // 有水平滚动条,可设置预留底部高度 msg += ',"BarW":'; if(bVerticalBar) BarCode += 2; msg += 0; // 有垂直滚动条,可设置预留右侧宽度 msg += ',"Code":'; msg += BarCode; // 滚动条是否存在信息 msg += ',"Top":'; msg += nScrollTop; // 垂直滚动位置 msg += ',"Left":'; // 水平滚动位置 msg += nScrollLeft; msg += '}}'; if(!isIE()) { PluginOKSocket.send(msg); } else { PluginOKSocket = document.getElementById("WrlWS"); PluginOKSocket.send(msg); } bIsSendScrollInfo = true; console.log(msg); } } // 监听窗口大小改变事件,使滚动状况匹配 $(window).resize(function () { SendScrollInfo(); }); // 处理接收到的JSON数据包 DealRecMessage = function (Data) { var jsondata = $.parseJSON(Data); if(jsondata.rid == nRequstAppletID) { if(0 == jsondata.ret) { nAppletRunID = jsondata.data.ID; $win.find('#btn_max').attr('disabled', false); $win.find('#btn_fitpage').attr('disabled', false); } else { if(undefined == jsondata.err) showmessage(Data, 'receive'); else showmessage('小程序请求错误:' + jsondata.err); } } else { if(bRunInCurrentPage && jsondata.aid == nAppletRunID && jsondata.event == 'Wrl_Listen') { // 小程序启动成功,发送页面滚动信息 SendScrollInfo(); } if(jsondata.req == 'Wrl_AppletScroll' || jsondata.req == 'Wrl_ScrollBar' || jsondata.req == 'Wrl_AppletResize') { console.log(Data); } else { showmessage(Data, 'receive'); } } } // 处理发送的JSON数据包 DealSendMessage = function (Data) { var jsondata = $.parseJSON(Data); if(jsondata.req == "Wrl_IEApplet" || jsondata.req == "Wrl_IETab" || jsondata.req == "Wrl_VLCApplet" || jsondata.req == "Wrl_VLCWebPlayer" || jsondata.req == "Wrl_FlashApplet" || jsondata.req == "Wrl_OfficeApplet" || jsondata.req == "Wrl_ACADApplet" || jsondata.req == "Wrl_TXWebApplet" || jsondata.req == "Wrl_AppletStart") { nRequstAppletID = jsondata.rid; if(1 == (1 & jsondata.para.Flag) || 16 == (16 & jsondata.para.Flag)) bRunInCurrentPage = false; // 新标签或新窗口加载小程序 } } // 处理小程序连接接收的JSON数据包 DealAppletRecMsg = function (Data) { } // 处理小程序连接发送的JSON数据包 DealAppletSendMsg = function (Data) { } WrlScrollApplet = function (nScrollLeft,nScrollTop,nOffsetX,nOffsetY) { if(nAppletRunID) { var nCode = 0; if(nOffsetX && nOffsetY) nCode = 3; // 同时滚动 else { if(nOffsetX) nCode = 1; // 横向滚动 if(nOffsetY) nCode = 2; // 纵向滚动 } var msg = '{"req":"Wrl_AppletScroll","rid":'; msg += getrandom(5).toLocaleString(); msg += ',"para":{"ID":'; msg += nAppletRunID; msg += ',"Top":'; msg += nScrollTop; msg += ',"Left":'; msg += nScrollLeft; msg += ',"Code":'; msg += nCode; // 滚动方向 msg += ',"NoLog":1'; // 不输出日志 msg += '}}'; if(!isIE()) { PluginOKSocket.send(msg); } else { PluginOKSocket = document.getElementById("WrlWS"); PluginOKSocket.send(msg); } console.log(msg); } } PageVisibilityState = function () { if(nAppletRunID < 1) return;// 未启动小程序 // 控制小程序显示、仅对当前网页内加载的小程序 var msg = '{"req":"Wrl_AppletControl","rid":'; msg += getrandom(5).toLocaleString(); msg += ',"para":{"ID":'; msg += nAppletRunID; if (document.visibilityState == 'visible') { /// 恢复显示 msg += ',"Code":'; msg += 8; } else if (document.visibilityState == 'hidden') { /// 需要隐藏 msg += ',"Code":'; msg += 4; } msg += '}}'; PluginOKSocket.send(msg); showmessage(msg, 'send'); } $win.find('#btn_conn').attr('disabled', false); $win.find('#btn_send').attr('disabled', true); $win.find('#btn_close').attr('disabled', true); $win.find('#btn_max').attr('disabled', true); $win.find('#btn_fitpage').attr('disabled', true); $win.find('#btn_restore').attr('disabled', true); $win.find('#btn_conn').click(function () { $win.find('#btn_conn').attr('disabled', true); $win.find('#btn_close').attr('disabled', false); var url = $win.find('#inp_url').val(); if(!isIE()) { // 创建一个Socket实例 PluginOKSocket = new WebSocket(url); showmessage('开始连接'); // 打开Socket PluginOKSocket.onopen = function (event) { // 发送一个初始化消息 showmessage(url + ' 连接成功'); $win.find('#btn_send').attr('disabled', false); WrlVisibilityListener(true); WrlScrollListener(true); }; // 监听消息 PluginOKSocket.onmessage = function (eve) { DealRecMessage(eve.data); }; // 监听Socket的关闭 PluginOKSocket.onclose = function (event) { WrlVisibilityListener(false); WrlScrollListener(false); nAppletRunID = 0; nRequstAppletID = 0; showmessage('连接已断开'); $win.find('#btn_conn').attr('disabled', false); $win.find('#btn_send').attr('disabled', true); $win.find('#btn_close').attr('disabled', true); $win.find('#btn_max').attr('disabled', true); $win.find('#btn_fitpage').attr('disabled', true); $win.find('#btn_restore').attr('disabled', true); }; } else { PluginOKSocket = document.getElementById("WrlWS"); if(PluginOKSocket) { // 设置是否输出日志 PluginOKSocket.EnableLog = false; //PluginOKSocket.EnableLog = true; if(PluginOKSocket.ReadyState > 1) { // 还未连接 PluginOKSocket.Connect(url); } } } }); $win.find('#btn_close').click(function () { if(!isIE()) { if (PluginOKSocket) { PluginOKSocket.close(); } } else { PluginOKSocket = document.getElementById("WrlWS"); if(PluginOKSocket) { PluginOKSocket.close(); } } }); $win.find('#btn_send').click(function () { var msg = $win.find('#inp_send').val(); if(!isIE()) { if (PluginOKSocket && msg) { $win.find('#inp_send').val(''); PluginOKSocket.send(msg); DealSendMessage(msg); showmessage(msg, 'send'); } } else { PluginOKSocket = document.getElementById("WrlWS"); if (PluginOKSocket && msg) { $win.find('#inp_send').val(''); PluginOKSocket.send(msg); DealSendMessage(msg); showmessage(msg, 'send'); } } }); $win.find('#inp_send').keyup(function () { if (event.ctrlKey && event.keyCode == 13) { $win.find('#btn_send').trigger('click'); } }); $win.find('#btn_clear').click(function () { $win.find('#div_msg').empty(); }); $win.find('#btn_max').click(function () { if(nAppletRunID < 1) return;// 未启动小程序 if(!bIsSendScrollInfo) SendScrollInfo(); var msg; var W = $(window).width(); var H = $(window).height(); // 小程序显示到整个客户区 msg = '{"req":"Wrl_AppletResize","rid":'; msg += getrandom(5).toLocaleString(); msg += ',"para":{"ID":'; msg += nAppletRunID; msg += ',"X":18,"Y":293,"Width":';// 这里X和Y可分别实现视图区左侧和顶部预留局域 msg += W; msg += ',"Height":'; msg += H; msg += '}}'; PluginOKSocket.send(msg); $win.find('#btn_restore').attr('disabled', false); showmessage(msg, 'send'); }); $win.find('#btn_fitpage').click(function () { if(nAppletRunID < 1) return;// 未启动小程序 if(!bIsSendScrollInfo) SendScrollInfo(); var msg; // 小程序自动适配网页大小显示切换 msg = '{"req":"Wrl_AppletControl","rid":'; msg += getrandom(5).toLocaleString(); msg += ',"para":{"ID":'; msg += nAppletRunID; msg += ',"Code":'; msg += 16; msg += '}}'; PluginOKSocket.send(msg); showmessage(msg, 'send'); }); $win.find('#btn_restore').click(function () { if(nAppletRunID < 1) return;// 未启动小程序 var msg; msg = '{"req":"Wrl_AppletResize","rid":'; msg += getrandom(5).toLocaleString(); msg += ',"para":{"ID":'; msg += nAppletRunID; msg += ',"X":10,"Y":70,"Width":'; msg += 600; msg += ',"Height":'; msg += 450; msg += '}}'; PluginOKSocket.send(msg); showmessage(msg, 'send'); }); }); })(window);