2012-10-15 64 views
0

previousDiv前值當我運行如下所示的jQuery的遇到問題始終是:[]。我曾嘗試.prev()函數的一些變化,包括.prev(「DIV」),和.prev()都具有相同的結果。遍歷DOM獲得DIV發生的歷史只是另一種元素

這裏是jQuery的:

$('.AddToRole').click(function(evt) { 
var path = document.URL; 
var thisUser = this.value; 
var previousControl = $(this).prev('.AvailableRoles'); 
var newUserRole = previousControl[0].options[previousControl[0].selectedIndex].text; 
var newHTML = "<button id='button_DeleteRole_" + newUserRole +"' class='DeleteRole' value=" + newUserRole + ">X</button>&nbsp;<label id='label_DeleteRole_" + newUserRole + "'>" + newUserRole + "</label><br />"; 
var previousDiv = $(this).prev('#DisplayUserRoles'); 
$(previousDiv).append(newHTML); 

下面是在頁面的HTML /剃刀代碼:

<div> 
        @* Display user email. *@ 
        <h3>@user.Email</h3> 
        <div> 
         <div id="DisplayUserRoles"> 
          @{ 
           @* Display roles user belongs to. *@ 
           foreach (var role in userRoles) 
           { 
            @* Remove user from role button. *@ 
            <button id="[email protected]" value="@role.RoleName" onclick="RemoveUserFromRole(this);">X</button> 
            <label id="[email protected]">@role.RoleName</label> 
            <br /> 
           } 
          } 
         </div> 
         <br />        
        @{              
         @* Create ListBox with roles user does not belong to. *@ 
         var items = rolesUserDoesNotBelongTo.Select(i => new SelectListItem 
         { 
          Value = i.RoleName, 
          Text = i.RoleName 
         }); 

         string listBoxId = "listboxRoles_"; 
         listBoxId = listBoxId + user.Email; 

        }        
         @Html.ListBox(listBoxId, items, new { @class = "AvailableRoles" }) 
         @* Add user to role button. *@ 
         <button id="[email protected]" class="AddToRole" value="@user.Email">Add To Role</button> 
        </div> 
       </div> 

對於最終的結果,我想之前剛剛添加其他按鈕和標籤關閉#DisplayUserRoles的div標記。

+0

可能只是一個錯字:你沒有關閉'click'事件。 '})' – RASG

+1

我們需要看到實際的HTML(從查看/源在瀏覽器),而不是模板語言知道如何遍歷您的HTML。 – jfriend00

+0

我認爲問題在於.prev()只選擇相同元素類型的兄弟姐妹。在你的情況下,$(this)是一個按鈕,所以它沒有其他兄弟,而.prev()返回[]。 –

回答

1

.prev()你如何使用它不起作用。它獲取之前的兄弟元素,然後通過您選擇的過濾器進行過濾。它不會查找任何與選擇器匹配的以前的兄弟。

因此,當你執行這兩項:

$(this).prev('.AvailableRoles'); 
$(this).prev('#DisplayUserRoles'); 

其中至少有一個會,除非前面的兄弟是既.AvailableRoles#DisplayUserRoles我懷疑是你在找什麼不返回任何對象。


我不太確定我知道你在想這些做什麼,但你可以做到這一點,而不是:

$(this).prevAll('.AvailableRoles').first(); 

而對於DisplayUserRoles,因爲永遠只能是在文檔中給定的ID一個對象,你可以這樣做:

$('#DisplayUserRoles'); 

這些將獲得選擇匹配,然後得到的只是第一個所有以前的兄弟姐妹。


正如我在我的評論說,我們可以幫助很多更好,如果你發佈生成的HTML(瀏覽器發現與查看/來源是什麼),而不是你的模板代碼,我們不一定知道什麼HTML它產生。

1

如前所述,如果存在所選擇的元件的無兄弟元素,.prev()返回一個空數組。如果是這種情況,請檢查最近的父元素。

var previousControl = $(this).prev(); 

if (!previousControl.length) { 
    previousControl = $(this).parent(); 
} 

previousControl.toggleClass('bestClass'); // This is just an example function 
              // call on the element