需求背景
由于客户系统中的数据比较敏感,避免泄漏出去,故提出禁止复制粘贴的功能。
实现方案
通过宏资源包的形式实现(透视分析目前不支持资源包,需要在报表上直接添加)
以下宏在IE,google,火狐浏览器下测试基本上都可以正常使用
电子表格宏
类型:ClientSide(客户端宏) 对象:spreadsheetReport 事件:onRender
function main(spreadsheetReport) {
preventContextMenu(spreadsheetReport.elemSheetFrame);
}
//设置所有iframe禁止复制粘贴
function preventContextMenu(iframe) {
//获取iframe的Document对象
var doc = iframe.contentWindow.document;
//获取IFRAME标签
var list = doc.getElementsByTagName("IFRAME");
for (var i = 0; i < list.length; i++) {
var subIFrame = list[i];
preventContextMenu(subIFrame);
subIFrame.onload = function() {
preventContextMenu(subIFrame);
};
};
setTimeout(function() {
//设置右键触发事件
doc.documentElement.oncontextmenu = doc.body.oncontextmenu = function() {
return false; //禁止鼠标右键
};
}, 200);
//按下键盘按键后触发
doc.onkeydown = function(e) {
var ev = e || window.event;
if (ev && ev.ctrlKey && ev.keyCode == 67) { // Ctrl + C
return false;
} else if (ev && ev.ctrlKey && ev.keyCode == 45) { // Ctrl +insert
return false;
}
};
//拖拽或选择文本时触发
doc.ondragstart = function() {
return false; //禁止拖拽
};
}
灵活分析宏
类型:ClientSide(客户端宏) 对象:simpleReport 事件:onRender
function main(simpleReport, simpleReportContext) {
//获取Document对象
var doc = simpleReport.content.ownerDocument;
//设置右键触发事件
doc.documentElement.oncontextmenu = doc.body.oncontextmenu = function() {
return false; //禁止鼠标右键
};
//按下键盘按键后触发
doc.onkeydown = function(e) {
var ev = e || window.event;
if (ev && ev.ctrlKey && ev.keyCode == 67) { // Ctrl + C
return false;
}else if (ev && ev.ctrlKey && ev.keyCode == 45){// Ctrl +insert
return false;
}
};
//拖拽或选择文本时触发
doc.ondragstart = function() {
return false; //禁止拖拽
};
}
组合分析宏
类型:ClientSide(客户端宏) 对象:simpleReport 事件:onRender
function main(simpleReport, simpleReportContext) {
//获取Document对象
var doc = simpleReport.content.ownerDocument;
//设置右键触发事件
doc.documentElement.oncontextmenu = doc.body.oncontextmenu = function() {
return false; //禁止鼠标右键
};
//按下键盘按键后触发
doc.onkeydown = function(e) {
var ev = e || window.event;
if (ev && ev.ctrlKey && ev.keyCode == 67) { // Ctrl + C
return false;
}else if (ev && ev.ctrlKey && ev.keyCode == 45){// Ctrl +insert
return false;
}
};
//拖拽或选择文本时触发
doc.ondragstart = function() {
return false; //禁止拖拽
};
}
透视分析宏
类型:ClientSide(客户端宏) 对象:INSIGHT 事件:onRender
function main(insight) {
//获取页面的Ducument对象
var doc = insight.container.ownerDocument;
//设置右键触发事件
doc.documentElement.oncontextmenu = doc.body.oncontextmenu = function() {
return false; //禁止鼠标右键
};
//按下键盘按键后触发
doc.onkeydown = function(e) {
var ev = e || window.event;
if (ev && ev.ctrlKey && ev.keyCode == 67) { // Ctrl + C
return false;
}else if (ev && ev.ctrlKey && ev.keyCode == 45){// Ctrl +insert
return false;
}
};
//拖拽或选择文本时触发
doc.ondragstart = function() {
return false; //禁止拖拽
};
}
多维分析宏
类型:ClientSide(客户端宏) 对象:olapQuery 事件:onRender
function main(olapQuery) {
//获取当前Document对象
var doc = olapQuery.frameViewContainer.ownerDocument;
//设置右键触发事件
doc.documentElement.oncontextmenu = doc.body.oncontextmenu = function() {
return false; //禁止鼠标右键
};
//按下键盘按键后触发
doc.onkeydown = function(e) {
var ev = e || window.event;
if (ev && ev.ctrlKey && ev.keyCode == 67) { // Ctrl + C
return false;
}else if (ev && ev.ctrlKey && ev.keyCode == 45){// Ctrl +insert
return false;
}
};
//拽或选择文本时触发
doc.ondragstart = function() {
return false; //禁止拖拽
};
}
页面宏
类型:ClientSide(客户端宏) 对象:page 事件:onRenderPage
function main(page, pageContext) {
//右键点击触发
document.documentElement.oncontextmenu = document.body.oncontextmenu = function() {
return false; //禁止鼠标右键
};
//键盘按下后触发
document.onkeydown = function(e) {
var ev = e || window.event;
if (ev && ev.ctrlKey && ev.keyCode == 67) { // Ctrl + C
return false;
} else if (ev && ev.ctrlKey && ev.keyCode == 45) { // Ctrl +insert
return false;
}
};
//拖拽或选择文本时触发
document.ondragstart = function() {
return false; //禁止拖拽
};
var pList = page.dashletList;
for (var i = 0; i < pList.length; i++) {
var dashletType = pList[i].dashletType;
if (dashletType == "SPREADSHEET_REPORT") {
spreadsheetReport = pList[i].currentPortlet.queryCmd.spreadsheetReport;
spreadsheetReport.onAfterRefresh.subscribe(function(spreadsheetReport) {
var doc = spreadsheetReport.elemSheetFrame.contentWindow.document;
//右键点击触发
doc.documentElement.oncontextmenu = doc.body.oncontextmenu = function() {
return false; //禁止鼠标右键
};
//键盘按下后触发
doc.onkeydown = function(e) {
var ev = e || window.event;
if (ev && ev.ctrlKey && ev.keyCode == 67) { // Ctrl + C
return false;
}
};
//键盘按下后触发
doc.ondragstart = function() {
return false; //禁止拖拽
};
});
}
}
}
资源下载
报表资源:migrate.xml