2011-10-03 112 views
5

我想要做的是將數據填充到select元素中。我使用下面的代碼,用戶從一個下拉列表中選擇一個SubjectCategory,然後填充下一個select元素的html。處理程序本身工作得很好,它會返回我需要放置在select元素中的正確html。jQuery - 查找下一個select元素

另外,請記住,我最終克隆了這兩個選擇元素,並需要相應地填充它們。

問題是$elem總是返回null。

我猜它與這行代碼有問題,但不是很確定(記住,我也克隆這兩個選擇元素保持):

var $elem = $this.closest('div').prev().find('select');

$(".SubjectCategory").live("click", function() { 
    var $this = $(this); 
    var $elem = $this.closest('div').next().find('select'); 
    var a = $this.val(); 

    $.get("/userControls/BookSubjectHandler.ashx?category=" + a, {}, function (data) { 
     $elem.html(data); 
    }); 
}); 

<div class="singleField subjectField"> 
    <label id="Category" class="fieldSml">Subject Matter</label> 
    <div class="bookDetails ddl"><select id="ddlSubjectMatter" class="fieldSml SubjectCategory"></select></div> 

    <label id="Subjects" class="fieldSml">Category</label> 
    <div class="bookDetails ddl" id="subjectMatter"><select id="ddlSubjects" class="fieldSml Subjects"></select></div> 
</div> 
+0

恭喜!這絕對是一些代碼,現在真正的問題是什麼? –

+0

@AlastairPitts:呃,'$ elem'總是返回null? – fuzz

+0

優秀的編輯。請記住,如果從未問過這個問題,就很難回答這個問題。 –

回答

12

您正在尋找<label>的內部,而不是下一個<div>如你所願。 next只在當前之後獲得一個元素。

試試這個:它搜索父元素旁邊的第一個div。

var $elem = $this.closest('div').nextAll('div').first().find('select'); 
1

你爲什麼創建一個無關的變量$this?除非你忽略了需要它的代碼,否則只需調用$(this)即可。這也可能導致問題。

+1

Nah,$這是緩存$(this),這是罰款,因爲它使用了兩次。 –

+0

啊所以。從快速搜索它看起來確實很好。你每天學習新的東西! –

+0

不幸的是,這不是'$ this'導致的問題。 – fuzz

2

鑑於源元件具有ddlSubjectMatter和目標選擇元件的ID具有題材的ID,它可能是一個簡單得多大寫所述第二ID的第一個字母(即使題材),那麼你將獲得第二個元素:

var elem = document.getElementById(this.id.replace(/^ddl/,'')); 

它使獨立文檔佈局的要素關係。

順便說一句,無效的HTML有選擇元素沒有選項,而不是它是一個大問題。