• 利用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这几个函数都是和菜单操作先关的,可以根据实际要求进行改造。
    效果图如下:

    效果图

  • 相关阅读:
    django regroup的相关知识点
    python学习
    python os的一点心得
    python字符串替换的2种有效方法
    python的缩进格式真的不好吗?
    django的哲学很耐人回味
    python 抓取网页的方法
    分享一点python 编码设置的知识
    python apply的一点知识
    今天休息真舒服
  • 原文地址:https://www.cnblogs.com/interboy/p/1708751.html
Copyright © 2020-2023  润新知