页面树结构
转至元数据结尾
转至元数据起始

该宏示例在 V10.5上 验证通过

提示:本文档的示例代码仅适用于本文档中的示例报表/场景。若实际报表/场景与示例代码无法完全适配(如使用功能不一致,或多个宏代码冲突等),需根据实际需求开发代码。

需求背景

 由于客户系统中的数据比较敏感,避免泄漏出去,故提出禁止复制粘贴的功能(针对各个类型的报表)。

实现方案

通过宏资源包的形式实现,针对每个类型报表添加一个宏资源包(透视分析目前不支持资源包,需要在报表上直接添加)

以下宏在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 == 86) { // Ctrl + V
            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