// 刷新CDN路径 // https://staging-teach.cdn.ireadabc.com/h5template/h5-static-lib/js/air.js // https://teach.cdn.ireadabc.com/h5template/h5-static-lib/js/air.js const commonPostMessage = function (messageObj) { const obj = {...messageObj, urlParams: window.location.search} window.parent.postMessage(obj, '*'); }; const commonPostMessageWithCallback = function (messageObj, callback) { const onMessage = (e) => { let msgData = e.data; if(msgData && msgData.action === messageObj.action){ window.removeEventListener("message", onMessage); callback && callback(msgData.data); } }; window.addEventListener("message", onMessage); commonPostMessage(messageObj); }; const realAir = { uploadUrl: null, uploadData: null, getDataCallback: null, setDataCallback: null, getUploadCallback: null, pageLoaded: false, isCourseInScreen: false, hideAirClassLoading: function(templateName,loadData){ // 隐藏页面加载时候的loading if (deleteHistory && typeof (deleteHistory) == 'function') { deleteHistory(); } window.parent.postMessage({ action: "course-ready", data: {template:templateName,loadData:loadData,urlParams: window.location.search}, urlParams: window.location.search}, '*'); window.air.pageLoaded = true; window.courseware.next(); var cc = window.cc; if (cc && cc.director && cc.director._scene) { try { const canvas = cc.find("Canvas"); canvas.on("mousemove", function () {}); cc.director._scene.on("mousemove", function () { window.parent.postMessage({ action: "mousemove" }, "*"); }); cc.director._scene.on("touchmove", function () { window.parent.postMessage({ action: "mousemove" }, "*"); }); if (cc.systemEvent && cc.SystemEvent) { cc.systemEvent.on(cc.SystemEvent.EventType.KEY_DOWN, (event) => { switch (event.keyCode) { case cc.KEY.left: window.parent.postMessage({ action: "ArrowLeft" }, "*"); break; case cc.KEY.right: window.parent.postMessage({ action: "ArrowRight" }, "*"); break; } }); } } catch (e) { console.log("====cc.director._scene绑定事件===="); } } }, }; const uploadCallbackQueue = []; try{ window.air = new Proxy(realAir, { set: function (target, key, value, receiver) { if (key=="getUploadCallback") { uploadCallbackQueue.push(value); } return Reflect.set(target, key, value, receiver); }, get: function (target, key, receiver) { return Reflect.get(target, key, receiver); }, deleteProperty: function(target, key){ return Reflect.deleteProperty(target, key); } }); }catch(e){ console.error("浏览器不支持ES6新特性Proxy/Reflect,请使用谷歌浏览器!"); } function deleteHistory() { const disableBack = () => { window.history.pushState(null, "", document.URL); window.addEventListener("popstate", () => { window.history.pushState(null, "", document.URL); }); } disableBack(); window.addEventListener("load", disableBack); } deleteHistory(); if (window.self !== window.top) { window.addEventListener("message", function (e) { let msgData = e.data; // console.log("子页面接收到了消息", msgData); if(msgData.type === "webpackWarnings" || msgData.type === "webpackOk") { return; } if(msgData.action==="airEvents"){ return; } if (msgData.action === "getUpload" && msgData.uploadUrl) { window.air.uploadUrl = msgData.uploadUrl; window.air.uploadData = msgData.uploadData; for (let i = 0; i < uploadCallbackQueue.length; i++) { uploadCallbackQueue[i](msgData.uploadUrl, msgData.uploadData); } return; } if (msgData.action === "pauseCocos") { let cc = window.cc; if (cc && cc.game) { cc.game.pause(); console.log('pause了'); } return; } if (msgData.action === "resumeCocos") { let cc = window.cc; if (cc && cc.game) { cc.game.resume(); console.log('resume了'); } return; } if (msgData.action === "restartCocos") { let cc = window.cc; if (cc && cc.game) { cc.audioEngine.stopAll(); // cc.game.restart(); console.log('restart了'); } return; } if (msgData.action === "setData") { window.air.setDataCallback && window.air.setDataCallback(); return; } if (msgData.action === "getData") { try { const res = JSON.parse(msgData.data); if (res.msg !== "success") { console.log('数据加载失败!'); return; } if (res.data && res.data != 'null') { window.air.callData = JSON.parse(res.data); } window.air.callDataFlag = true; return; } catch (e) { console.log('数据加载失败!'); } } }); window.parent.postMessage({ action: "getUpload" }, '*'); document.onmousemove = function(){ window.parent.postMessage({ action: "mousemove" }, '*'); }; document.ontouchmove = function(){ window.parent.postMessage({ action: "mousemove" }, '*'); }; document.onkeydown = (event) => { switch(event.key) { case "ArrowLeft": window.parent.postMessage({ action: "ArrowLeft" }, '*'); break; case "ArrowRight": window.parent.postMessage({ action: "ArrowRight" }, '*'); break; } } document.oncontextmenu = function(){ return false; } } window.courseware = (function () { let obj = { airEvents: {}, eventQueue: [], eventLock: false, next: () => { let exe = obj.eventQueue.splice(0,1); if(exe.length>0){ obj.eventLock = true; let evtName = exe[0].evtName; let data = exe[0].data; if(obj.airEvents[evtName]){ if(evtName === "course-in-screen"){ if(window.air.isCourseInScreen){ return; } window.air.isCourseInScreen = true; } console.log(`evtName==${evtName}的方法被执行`); obj.airEvents[evtName](data, obj.next); } else { console.warn(`airclass教室交互事件 ${evtName} 没有被捕获,请确认监听事件的先后顺序2`); obj.next(); } }else{ obj.eventLock = false; } } }; if (window.self !== window.top) { window.addEventListener("message", function (e) { let msgData = e.data; if(msgData.action!=="airEvents"){ return; } let evtName = msgData.evt; let res = msgData.data; if (evtName === "course-out-screen"){ console.log(`evtName==${evtName}的方法被执行`); window.location.reload(); return; } if (res&&evtName!='userchange') { //userchange事件传过来的值不需要转换 res = JSON.parse(res); } if(!window.air.pageLoaded){ //如果页面还没有加载完成 obj.eventQueue.push({"evtName": evtName, data: res}); }else{ if (obj.eventQueue.length === 0 && !obj.eventLock) { //如果没有消息积压并且事件锁未锁定 obj.eventLock = true; if(obj.airEvents[evtName]){ if(evtName === "course-in-screen"){ if(window.air.isCourseInScreen){ return; } window.air.isCourseInScreen = true; } console.log(`evtName==${evtName}的方法被执行`); obj.airEvents[evtName](res, obj.next); } else { console.warn(`airclass教室交互事件 ${evtName} 没有被捕获,请确认监听事件的先后顺序1`); obj.next(); } } else { obj.eventQueue.push({"evtName": evtName, data: res}); } } }); obj.getData = function (callback, key = '') { window.parent.postMessage({ action: "getData", data: window.location.search, urlParams: window.location.search }, '*'); window.air.callDataFlag = false; const liuintval = setInterval(()=>{ if(window.air.callDataFlag){ console.log("========我进来了========="); clearInterval(liuintval); setTimeout(() => { console.log("执行回调,回调数据为:"); console.log(window.air.callData); callback(window.air.callData); }, 100); } }, 100); }; obj.setData = function (data, callback, key = '') { let str = JSON.stringify(data); console.log("==setData==", str); window.parent.postMessage({ action: "setData", data: str, urlParams: window.location.search }, '*'); window.air.setDataCallback = callback; }; obj.uploadUrl = function () { // return net.getUploadFileURL(); return window.air.uploadUrl; }; obj.uploadData = function () { // return net.getAjaxData("uploadFile",""); return window.air.uploadData; }; obj.beganRecording = function(){ commonPostMessage({ action: "beganRecording" }); }; obj.endRecording = function(callback){ commonPostMessageWithCallback({ action: "endRecording" }, callback); }; obj.speakPoints = function(audioUrl, evalText, callback){ const obj = {audioUrl, evalText}; commonPostMessageWithCallback({ action: "speakPoints", data: JSON.stringify(obj) }, callback); }; obj.startRecord = function(testText){ commonPostMessage({ action: "startRecord", data: testText }); }; obj.stopRecord = function(callback){ commonPostMessageWithCallback({ action: "stopRecord" }, callback); }; obj.startTest = function(testText){ commonPostMessage({ action: "startTest", data: testText }); }; obj.stopTest = function(callback){ commonPostMessageWithCallback({ action: "stopTest" }, callback); }; obj.getTemplates = function(callback){ commonPostMessageWithCallback({ action: "getTemplates" }, callback); }; obj.getTemplateUrl = function(templateName, callback){ commonPostMessageWithCallback({ action: "getTemplateUrl", data: templateName}, callback); }; obj.sendEvent = function(evtName,data,key = ''){ if(evtName==="reconnect"){ console.error("reconnect是内置的断线重连事件名称,请勿使用此名称作为事件名"); return; } if(evtName==="userchange"){ console.error("userchange是内置的用户变更事件名称,请勿使用此名称作为事件名"); return; } let str = null; if(data){ str = JSON.stringify(data); } window.parent.postMessage({ action: "airEvents",evt: evtName, data: str, urlParams: window.location.search }, '*'); }; obj.onEvent = function(evtName,callback){ obj.airEvents[evtName] = callback; }; obj.removeEvent = function(evtName){ if(obj.airEvents[evtName]){ delete obj.airEvents[evtName]; } }; obj.sendErrorLog = function (error) { // todo 这块预留后面采集模板的报错信息 // window.parent.postMessage({ action: "errorlog", data: error.stack }, '*'); }; } else { obj.getData = function (callback, key = '') { let data = localStorage.getItem("courseware_data_" + key); if (data) { data = JSON.parse(data); } callback && callback(data); }; obj.setData = function (data, callback, key = '') { console.log("******local********"); localStorage.setItem("courseware_data_" + key, JSON.stringify(data)); callback && callback(); }; obj.uploadUrl = function () { var protocolStr = document.location.protocol; return `${protocolStr}//staging-teach.ireadabc.com/fileUpload`; }; obj.uploadData = function () { return {}; }; obj.beganRecording = function(){ console.log("******beganRecording********"); }; obj.endRecording = function(callback){ console.log("******endRecording********"); callback&&callback(""); }; obj.speakPoints = function(audioUrl, evalText, callback){ console.log("******speakPoints********"); callback&&callback(""); }; obj.startRecord = function(){ console.log("******startRecord********"); }; obj.stopRecord = function(callback){ console.log("******stopRecord********"); callback&&callback(""); }; obj.startTest = function(testText){ console.log("******startTest********"); }; obj.stopTest = function(callback){ console.log("******stopTest********"); callback&&callback(""); }; obj.getTemplates = function(callback){ callback&&callback(""); }; obj.getTemplateUrl = function(templateName, callback){ const obj = { play_url: "", form_url: "", }; callback&&callback(JSON.stringify(obj)); }; obj.sendEvent = function(evtName, data, key = ''){ if(evtName==="reconnect"){ console.error("reconnect是内置的断线重连事件名称,请勿使用此名称作为事件名"); return; } if(evtName==="userchange"){ console.error("userchange是内置的用户变更事件名称,请勿使用此名称作为事件名"); return; } return; }; obj.onEvent = function(evtName,callback){ console.warn("==本地测试用,onEvent的监听事件会直接触发==", "事件名:"+ evtName); callback && callback("", function(){}); }; obj.removeEvent = function(evtName){ }; obj.sendErrorLog = function (error) { }; } return obj; })();