2009-11-16 31 views
0

我想用jquery右鍵菜單來增強我的頁面,但是在構建正確的結構時很容易出現問題。在jquery中的對象的Javascript語法

當前我的頁面包含(除其他外)供用戶審閱的項目列表。 (一個html表格)根據用戶角色以及行的當前狀態和上下文,用戶可以對每行數據採取各種操作之一。 (批准,拒絕,把它轉給其他人等)。如果該選項可用,我的ASP.Net頁面通過將該行內的圖像按鈕的可見性設置爲true來處理此問題。我可以控制每個按鈕的Cssclass,並將例如「批准」按鈕的類設置爲「approvebtn」。

現在我想用正確的菜單來增強我的網站。 我在擴大我的網站與Cory S.N. LaViska的jQuery上下文菜單插件 - http://abeautifulsite.net/notebook/80

該插件允許任何元素的默認鼠標行爲被用戶控制的上下文菜單覆蓋。該菜單作爲無序列表插入到您的頁面中,並在需要時顯示。

  <ul id="rightMenu" class="contextMenu"> 
       <li class="details"><a href="#details">Details</a> </li> 
       <li class="addnote"><a href="#addnote">AddNote</a> </li> 
       <li class="listnote"><a href="#listnote">ShowNotes</a> </li> 
       <li class="approve"><a href="#approve">Approve</a> </li> 
       <li class="reject"><a href="#reject">Reject</a> </li> 
       <li class="release"><a href="#release">Release</a> </li> 
       <li class="takeover"><a href="#takeover">Takeover</a> </li> 
      </ul> 

您的應用程序得到一個回調點擊右鍵菜單上的東西時,你可以詢問操作(僞造的href元素)看是哪個項目。 我真的很喜歡這個菜單,因爲它使用簡單,完全是CSS風格。

但是,我需要做的事情,這個插件不天真似乎支持。我需要在行中更改菜單上的哪些項目可用。基本上,如果圖像按鈕(用於批准)在該行中可用,則其對應的菜單項也應存在。

我能夠訪問之前它是通過改變插件咯,打電話給我的功能顯示在右鍵菜單之前顯示的菜單。 這是有效的,但我必須寫的邏輯看起來非常強悍,所以必須有更好的方式......。

在我的回調:

function jimsbuggeredfunction(menu,el) 

「厄爾尼諾」是被右擊的元素(通常是一個表格單元格),和「菜單」是這個右鍵勢必菜單。 (所以我應該使用這個名稱,而不是硬編碼到#rightMenu')

因此,「if」行會發現包含「右鍵單擊」元素的錶行是否包含特定按鈕(通過它的類名稱)如果它啓用了菜單項,否則它被禁用。這個過程繼續爲每一個我想成爲行對行的菜單項。

function jimsbuggeredfunction(menu,el) { 

if($(el).parents("tr:eq(0)").find('.approvebtn').length > 0) 
    $('#rightMenu').enableContextMenuItems('#approve'); 
else 
    $('#rightMenu').disableContextMenuItems('#approve'); 

if($(el).parents("tr:eq(0)").find('.rejectbtn').length > 0) 
    $('#rightMenu').enableContextMenuItems('#reject'); 
else 
    $('#rightMenu').disableContextMenuItems('#reject'); 

if($(el).parents("tr:eq(0)").find('.releasebtn').length > 0) 
    $('#rightMenu').enableContextMenuItems('#release'); 
else 
    $('#rightMenu').disableContextMenuItems('#release'); 

if($(el).parents("tr:eq(0)").find('.takeoverbtn').length > 0) 
    $('#rightMenu').enableContextMenuItems('#takeover'); 
else 
    $('#rightMenu').disableContextMenuItems('#takeover'); 

if($(el).parents("tr:eq(0)").find('.revertbtn').length > 0) 
    $('#rightMenu').enableContextMenuItems('#revert'); 
else 
    $('#rightMenu').disableContextMenuItems('#revert'); 

if($(el).parents("tr:eq(0)").find('.removebtn').length > 0) 
    $('#rightMenu').enableContextMenuItems('#remove'); 
else 
    $('#rightMenu').disableContextMenuItems('#remove'); 

if($(el).parents("tr:eq(0)").find('.addnotebtn').length > 0) 
    $('#rightMenu').enableContextMenuItems('#addnote'); 
else 
    $('#rightMenu').disableContextMenuItems('#addnote'); 

if($(el).parents("tr:eq(0)").find('.listnotebtn').length > 0) 
    $('#rightMenu').enableContextMenuItems('#listnote'); 
else 
    $('#rightMenu').disableContextMenuItems('#listnote'); 
}; 

必須有一個更好的方式來設置的,因此,它也只是忽略我要顯示所有的時間菜單項),但它是在瞬間逃離我。有沒有更好的方法來完成這一點?

感謝,

吉姆

回答

3

我會找到某種方式來創建兩個ID,並找到相關的按鈕的一些更系統的方式之間的映射。例如,如果按鈕始終具有一流的某些細胞內所屬,讓我們說「buttonclass」,那麼這樣的事情應該工作:

var mapping = { 
    takeoverbtn: '#takeover', 
    listnotebtn: '#listnote' 
    // ... 
}; 


function jimsbuggeredfunction(menu,el) { 
    var buttontype = $(el).parents("tr:eq(0)").find('.buttonclass').children().attr("class"); 
    $('#rightMenu').disableContextMenuItems(mapping[buttontype]); 
} 

我jQuery是一個有點生疏,有可能是一個更清潔的方式檢索按鈕類型,但該總體思路應該工作。