2011-10-03 78 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有选择元素没有选项,而不是它是一个大问题。