我有一个设置,有点令人困惑:
<ListView>
<ItemTemplate>
<div id="Content">
<asp: TextBox ID="OuterTextBox" />
<div id="Controls">
<asp: ComboBox ID="InnerComboBox"/>
</div>
<div>
<asp: Button ID="Submit" />
</div>
</div>
</ItemTemplate>
<ListView>
Wonky我知道,这只是一个模型。真实情况更糟。这是一个ItemTemplate,因此显然会在编译页面时动态生成ID。我要做的是使用jquery创建一个对象,该对象从标记为“Content”的div级别开始,然后搜索所有子级(递归)以查找每个指定控件的值。在此示例中,它们是OuterTextBox和InnerComboBox。令我困惑的是元素的荒谬层次。我如何最有效地完成这项工作?我只能假设在不久的将来会有div的层次结构发生变化,所以我希望得到一些东西,一旦我移动东西就不会破坏,所以控制的明确路径不会上班。以下是我目前正在尝试扩展的概念:
function ClientIDS(obj) {
var txt = $(obj).prevAll('input[id*="txtTextBox"]:first');
alert($(txt).val());
return false;
}
然后我会在服务器控件中执行类似OnClientClick =“ClientIDS(this)”的操作。
这段代码简单而干净,并且当所有控件都在同一个div(作为兄弟姐妹)时工作得很好。当控件被像这样的div分解时,有没有人能想出一种方法来以类似的,简单的方式找到控件?
答案 0 :(得分:3)
通常的方法是在同一个容器中找到与您相同的其他项目,但不一定是兄弟姐妹是使用.closest()
找到所需的共同祖先constainer,然后使用.find()
找到您的实际元素'正在使用类名在该容器中查找。
我不确定你的点击开始的确切位置,但是假设你有多个来自这个itemTemplate的项目我已修改为有几个类:
<ListView>
<ItemTemplate>
<div class="Content">
<asp: TextBox ID="OuterTextBox" class="textbox"/>
<div id="Controls">
<asp: ComboBox ID="InnerComboBox"/>
</div>
<div>
<asp: Button ID="Submit" />
</div>
</div>
</ItemTemplate>
<ItemTemplate>
<div class="Content">
<asp: TextBox ID="OuterTextBox" class="textbox"/>
<div id="Controls">
<asp: ComboBox ID="InnerComboBox"/>
</div>
<div>
<asp: Button ID="Submit" />
</div>
</div>
</ItemTemplate>
<ListView>
然后,从提交按钮,您可以使用:
$(this).closest(".Content").find(".textbox")
这将为您提供与单击按钮位于同一容器中的文本框。
答案 1 :(得分:0)
如果我理解正确,你可以尝试:
$('#content').find('input').each(function(){
//do something
});
input
选择器显然可以替换为其他选择器,例如某个类。