YUI ContextMenu 鼠标左键弹出

    技术2022-05-11  78

    不得不说,YUI的设计结构是蛮奇怪的。用惯了VCL就知道,操作PopupMenu是非常简单的事情,比如有popup(x.y)方法,直接可以指定弹出的目标。但是YUI有的信息,估计要狠看API和源码才能知道它设计在什么地方去了……所以现在还是一个例子。例子说明一切问题。没有例子寸步难行。古人有云:吃饱没事干,上网博客逛……原理:侦听目标DOM对象的单击事件 ,然后在鼠标位置弹出菜单。下面是来自YUI Blog的完整代码:

     

    <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"        "http://www.w3.org/TR/html4/strict.dtd" > < html >      < head >          < meta  http-equiv ="content-type"  content ="text/html; charset=utf-8" >          < title > Context Menu Example </ title >          <!--  Standard reset and fonts  -->          < link  rel ="stylesheet"  type ="text/css"  href ="../../build/reset/reset.css" >          < link  rel ="stylesheet"  type ="text/css"  href ="../../build/fonts/fonts.css" >          <!--  CSS for Menu  -->          < link  rel ="stylesheet"  type ="text/css"  href ="../../build/menu/assets/menu.css" >          <!--  Page-specific styles  -->          < style  type ="text/css" >             #contextmenutarget {                            background-color:#ccc;                width:400px;                height:400px;                        }                     </ style >          <!--  Namespace source file  -->          < script  type ="text/javascript"  src ="../../build/yahoo/yahoo.js" ></ script >          <!--  Dependency source files  -->          < script  type ="text/javascript"  src ="../../build/event/event.js" ></ script >          < script  type ="text/javascript"  src ="../../build/dom/dom.js" ></ script >          <!--  Container source file  -->          < script  type ="text/javascript"  src ="../../build/container/container_core.js" ></ script >          <!--  Menu source file  -->          < script  type ="text/javascript"  src ="../../build/menu/menu.js" ></ script >          <!--  Page-specific script  -->          < script  type ="text/javascript" >             // "load" event handler for the "window" object                   function onWindowLoad(p_oEvent) {                // Create the context menu                var oContextMenu = new YAHOO.widget.Menu("contextmenu1"{ visible: false } );                // Add Items                                oContextMenu.addItem("Item One");                oContextMenu.addItem("Item Two");                oContextMenu.addItem("Item Three");                // Render the context menu                oContextMenu.render(document.body);                // "click" event handler for the "contextmenutarget" DIV                function onContextMenuTargetClick(p_oEvent) {                        var nX = YAHOO.util.Event.getPageX(p_oEvent);                    var nY = YAHOO.util.Event.getPageY(p_oEvent);                                    oContextMenu.cfg.applyConfig( { x:nX, y:nY, visible:true } );                    oContextMenu.cfg.fireQueue();                        YAHOO.util.Event.stopEvent(p_oEvent);                    var oTarget = YAHOO.util.Event.getTarget(p_oEvent);                    alert(oTarget);                                }                                // Add a "click" event handler to the "contextmenutarget" DIV                YAHOO.util.Event.addListener("contextmenutarget""click", onContextMenuTargetClick);                // "click" event handler for the "contextmenutarget" div                function onDocumentClick(p_oEvent) {                                    oContextMenu.hide();                                }                                // Add a "click" event handler to the document                YAHOO.util.Event.addListener(document, "click", onDocumentClick);                            }            // Assign a "load" event handler to the window            YAHOO.util.Event.addListener(window, "load", onWindowLoad);                             </ script >      </ head >      < body >          < div  id ="contextmenutarget" > Click me for a "context menu." </ div >              </ body > </ html >

    各位可能还要问,我不就一个转贴嘛,为什么还要写那么多废话。原因是……有些细节可以描述一下,大虾不入法眼,小虾自己拣。注意这点:var oTarget = YAHOO.util.Event.getTarget(p_oEvent); 是获得Dom对象的关键。因为大部分的ContextMenu还要针对Dom对象(依赖于其上的属性、数据)进行下一步的操作,所以这个时候,只能把它变成一个全局的变量,然后在ContextMenu Item的各自点击中去访问这个对象。接下来又是代码片断啦……

         var  oTarget  =   null  ;                 function  onContextMenuTargetClick(p_oEvent)  {                        var nX = YAHOO.util.Event.getPageX(p_oEvent);                    var nY = YAHOO.util.Event.getPageY(p_oEvent);                                    oContextMenu.cfg.applyConfig( { x:nX, y:nY, visible:true } );                    oContextMenu.cfg.fireQueue();                        YAHOO.util.Event.stopEvent(p_oEvent);                    oTarget = YAHOO.util.Event.getTarget(p_oEvent);                    //alert(oTarget);                                }

    在菜单项的点击事件中,如下:

     

    function  onContextMenuClick(p_sType, p_aArgs, p_oMenu) {//如果右键弹出,下面代码可获得Dom对象var p_oNode = this.contextEventTarget ;//如果左键弹出,就要拿那个全局对象了……            if(p_oNode==null){                p_oNode= oTarget;            }//p_oNode 现在就是Dom对象。//玩命用吧。别浪费了}

    最新回复(0)