2009-03-17 4 views

Antwort

0

EDIT: ich noch einmal habe Ihre Frage erneut lesen und erkennen, dass Sie ein Menü aktualisieren mögen, während Sie es zu öffnen, nicht bevor sie geöffnet wird. Es gibt noch ein anderes Ereignis, das Sie anhören können: displaying, aber im Test, den ich mit meiner HTML/JS-Test-App gemacht habe, schien das Ereignis nicht ausgelöst worden zu sein. Wenn Sie Flex verwenden, könnten Sie das untersuchen, oder herauszufinden, ob ich hier etwas falsch gemacht habe:

window.htmlLoader.contextMenu = new air.NativeMenu(); 
    menu1 = new air.NativeMenu(); 
    loading=new air.NativeMenuItem("Loading..."); 
    menu1.addItem(loading); 
    menu1.addEventListener(air.Event.DISPLAYING, addMenu1Items); 
    function addMenu1Items(){ 
     menu1.removeItem(loading); 
     item11 = new air.NativeMenuItem("Item 1"); 
     item11.addEventListener(air.Event.SELECT, function(e){alert("You clicked Menu 1,Item 1");e.preventDefault();}); 

     item12 = new air.NativeMenuItem("Item 2"); 
     item12.addEventListener(air.Event.SELECT, function(e){alert("You clicked Menu 1,Item 2");e.preventDefault();}); 

     menu1.addItem(item11); 
     menu1.addItem(item12); 
    } 

Ich habe gerade einen Test mit einem HTML/Javascript app getan, und scheint die folgende, für die Arbeit Ich (schamlos gerippt und modifiziert von: http://www.adobe.com/devnet/air/ajax/quickstart/adding_menus.html und wenn Sie zufällig Flex verwenden, gibt es auch eine Version dafür: http://www.adobe.com/devnet/air/flex/quickstart/adding_menus.html).

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Context</title> 
    <script src="lib/air/AIRAliases.js" language="JavaScript" type="text/javascript"></script> 
    <script type="text/javascript"> 
     window.htmlLoader.contextMenu = new air.NativeMenu(); 
     menu1 = new air.NativeMenu(); 

     item11=new air.NativeMenuItem("Item 1"); 
     item11.addEventListener(air.Event.SELECT,function(e){alert("You clicked Menu 1,Item 1");e.preventDefault();}); 

     item12=new air.NativeMenuItem("Item 2"); 
     item12.addEventListener(air.Event.SELECT,function(e){alert("You clicked Menu 1,Item 2");e.preventDefault();}); 

     menu1.addItem(item11); 
     menu1.addItem(item12); 

     menu2 = new air.NativeMenu(); 
     item21=new air.NativeMenuItem("Item 1"); 
     item21.addEventListener(air.Event.SELECT,function(e){alert("You clicked Menu 2,Item 1");e.preventDefault();}); 

     item22=new air.NativeMenuItem("Item 2"); 
     item22.addEventListener(air.Event.SELECT,function(e){alert("You clicked Menu 2,Item 2");e.preventDefault();}); 

     menu2.addItem(item21); 
     menu2.addItem(item22); 

     window.htmlLoader.contextMenu.addSubmenu(menu1,"Menu 1"); 
     window.htmlLoader.contextMenu.addSubmenu(menu2,"Menu 2"); 

     //Displays the context menu 
     function showContextMenu(event){ 
      event.preventDefault(); 
      window.htmlLoader.contextMenu.display(window.nativeWindow.stage, event.clientX, event.clientY); 
     } 

     function addItemToContextMenu(){ 
      menux = new air.NativeMenu(); 
      item=new air.NativeMenuItem("Item &1"); 
      item.addEventListener(air.Event.SELECT,function(e){alert("You clicked Menu X,Item 1");e.preventDefault();}); 
      menux.addItem(item); 
      menux.addItem(new air.NativeMenuItem("Item &2")); 
      window.htmlLoader.contextMenu.addSubmenu(menux,"Menu X"); 
     } 


     function clearAndAdd() { 
      window.htmlLoader.contextMenu = new air.NativeMenu(); 
      addItemToContextMenu(); 
     } 
    </script> 
</head> 
<body id="body"> 
<div id="contextDiv" oncontextmenu="showContextMenu(event)"> 
Right click to bring up the context menu.<br><br> 
<input type="button" value="Add Item To Context Menu" onclick="addItemToContextMenu()"><input type="button" value="Clear Menu and Add Item to Context Menu" onclick="clearAndAdd();"> 
</div> 
</body> 
</html> 
+0

Peter, Danke für die gründliche Erklärung. Jetzt ist das Problem, dass das Menü Ihnen sagt, dass es angezeigt wird und Sie die Elemente sofort einstellen müssen. Es gibt anscheinend keine Möglichkeit, es * warten * zu sagen, bis eine asynchrone Antwort eintrifft, was in meinem Fall der Fall ist. Menüpunkte sind dynamisch und hängen von externer Logik ab. –