zoukankan      html  css  js  c++  java
  • 利用JS重写Cognos右键菜单

    我写了一个利用JS禁用Cognos右键菜单,下面的JS可以实现重写Cognos的右键菜单。只要将下面的代码拷到一个HTML项里即可

    代码
    <!--菜单样式-->
    <STYLE type=text/css>
    .cMenu
    {
    BORDER-RIGHT
    : #000000 1px solid;
    BORDER-TOP
    : #000000 1px solid;
    FONT-WEIGHT
    : normal;
    FONT-SIZE
    : 14px;
    VISIBILITY
    : hidden;
    BORDER-LEFT
    : #000000 1px solid;
    WIDTH
    : 150px;
    CURSOR
    : default;
    COLOR
    : #000000;
    LINE-HEIGHT
    : 20px;
    BORDER-BOTTOM
    : #000000 1px solid;
    FONT-FAMILY
    : Verdana, Arial, Helvetica, sans-serif;
    POSITION
    : absolute;
    BACKGROUND-COLOR
    : #eeeeff
    }
    .menuitems
    {
    PADDING-RIGHT
    : 5px;
    PADDING-LEFT
    : 5px
    }
    </STYLE>
    <DIV class=cMenu id="contextMenu" onmouseover=highLightMenu() onmouseout=lowLightMenu()>
    <DIV class=menuitems clickcall="alert('查看历史执行情况');">查看历史执行情况</DIV>
    <DIV class=menuitems clickcall="alert('查看批注');">查看批注</DIV>
    <DIV class=menuitems clickcall="alert('插入/修改批注');">插入/修改批注</DIV>
    <HR color=#aaaaaa size="0">
    <DIV class=menuitems clickcall="alert('关于');">关于</DIV>
    </DIV>
    <SCRIPT type="text/javascript">
    var contextMenu = document.getElementById("contextMenu");
    function getObjectName()
    {
    return document.getElementById("cv.id").value;
    }
    function getRVContent()
    {
    var objName = getObjectName();
    return eval("document.getElementById('RVContent" + objName + "');");
    }
    function overWriteRightClick()//重写弹出菜单
    {
    var objName = getObjectName();
    eval(
    "oCV" + objName + ".rvMainWnd.displayContextMenu = displayContextMenu;");
    }
    function disableRightClick()
    {
    var objName = getObjectName();
    eval(
    "oCV" + objName + ".bCanUseCognosViewerContextMenu = false;");
    }
    /* 菜单相关函数 start*/
    function displayContextMenu(evt) {
    evt
    = (evt) ? evt : ((event) ? event : null);
    hideContextMenu();
    var rightedge = getRVContent().clientWidth - evt.clientX;
    var bottomedge = getRVContent().clientHeight - evt.clientY;
    if (rightedge < contextMenu.offsetWidth)
    contextMenu.style.left
    = getRVContent().scrollLeft + evt.clientX - contextMenu.offsetWidth - getRVContent().offsetLeft;
    else
    contextMenu.style.left
    = getRVContent().scrollLeft + evt.clientX - getRVContent().offsetLeft;
    if (bottomedge < contextMenu.offsetHeight)
    contextMenu.style.top
    = getRVContent().scrollTop + evt.clientY - contextMenu.offsetHeight - getRVContent().offsetTop;
    else
    contextMenu.style.top
    = getRVContent().scrollTop + evt.clientY - getRVContent().offsetTop;
    contextMenu.style.visibility
    = "visible";
    return false;
    }
    function hideContextMenu() {
    var object = event.srcElement;
    contextMenu.style.visibility
    = "hidden";
    if (object.className == "menuitems") {
    eval(object.clickcall);
    }
    }
    function highLightMenu() {
    var object = event.srcElement;
    if (object.className == "menuitems") {
    object.style.backgroundColor
    = "highlight";
    object.style.color
    = "white";
    }
    }
    function lowLightMenu() {
    var object = event.srcElement;
    if (object.className == "menuitems") {
    object.style.backgroundColor
    = "";
    object.style.color
    = "black";
    }
    }
    /*菜单相关函数 end*/
    overWriteRightClick();
    document.body.onclick
    = hideContextMenu;
    </SCRIPT>
    下面我来着介绍一下这段代码,前面的style和div主要是定义菜单的现实样式,其中引用样式为menuitems的div中有个clickcall属性,这个属性就是当点击此菜单项时调用的JS函数,可以将其改为自己的函数,我这里只是简单的调用了个alert。
    getObjectName函数中有个cv.id的对象,之前也有人问过这个问题,“cv.id”是干什么用的?cognos报表在ReportStudio运行生成的对象和用URL请求生成的对象名称是不一样的,但是有规律可循,比如利用ReportStudio运行生成的报表中CognosViewer的对象名为oCVRS,而用URL请求生成的cognosViewer对象名为oCV_NS_,大家可以查看两次运行结果的源文件来进行比较,就比较直观了。发现前缀都一样(oCV)只是后面“RS”和“_NS_”不同,页面中很多对象都是用的此规则,而cv.id存储到正是后缀。这样就可以拼凑出当前运行模式下的对象名了。
    getRVContent函数获取的是id为RVContent_NS_或RVContentRS的DIV对象,RVContent是展现用ReportStudio定义报表的内容,不包含CognosViewer工具栏和标题栏。
    overWriteRightClick函数是将cognos右键调用的函数改为自己定义的函数。
    disableRightClick函数已经说过了,禁用右键菜单。
    displayContextMenu、hideContextMenu、highLightMenu、lowLightMenu这几个函数都是和菜单操作先关的,可以根据实际要求进行改造。
    效果图如下:

    效果图

  • 相关阅读:
    3.Appium运行时出现:Original error: Android devices must be of API level 17 or higher. Please change your device to Selendroid or upgrade Android on your device
    3.Python连接数据库PyMySQL
    2.Python输入pip命令出现Unknown or unsupported command 'install'问题解决
    2.Linux下安装Jenkins
    5.JMeter测试mysql数据库
    Android 4学习(7):用户界面
    Android 4学习(6):概述
    Android 4学习(5):概述
    Android 4学习(4):概述
    Android 4学习(3):概述
  • 原文地址:https://www.cnblogs.com/interboy/p/1708751.html
Copyright © 2011-2022 走看看