jQuery 用于查找包含具有特定值的 TD INPUT 的 TR 的选择器
jQuery selector to find TR that contains TD INPUT with specific value
好吧,这看起来应该是一个简单的问题,但我却找不到答案。我有一个从 JSON 数据构建的表单,我从中构建了一个 table 的 3 行和 14 列,每列包含一个 INPUT 文本控件。
当任何这些控件中的值发生变化时,我需要找到第一列中的输入控件等于特定年份的包含行。
这是标记示例:
<table id="MyTable">
<tr>
<td><input type="text" /></td>
<td><input type="text" class="changeHandled"/></td>
<td><input type="text" class="changeHandled" /></td>
</tr>
</table>
我试过的选择器是:#MyTable tr:has('input[value="{year}"]')
和几十种变体。
我将 {year}
字符串替换为我正在搜索的年份值,因此它最终看起来像:#MyTable tr:has('input[value="2014"]')
我认为这可能是因为值最初是通过代码设置的,因为如果我使用 #MyTable tr:has('input')
它 returns 所有行。
由于可维护性,我不想对路径进行硬编码,只是在 javascript 代码中说 $(this).closest("tr")...
。
知道如何检索对包含具有特定值的输入的 TR 的引用吗?如果我的代码是正确的,通过代码设置值时是否需要做一些不同的事情?
只有 input
元素具有值为 2014
的硬编码 value
属性,select 或 $('#MyTable tr:has(input[value="2014"])')
才会起作用。参见 this example。
如果您尝试 select 没有硬编码 value
属性的 input
元素,那么您可以过滤元素和 return input
值等于 2014
的元素。根据您的需要,您可以收听 input
或 change
事件。
$('#MyTable input').on('input change', function () {
$tr = $('#MyTable tr input:first').filter(function () {
return this.value === '2014' || $(this).attr('value') === '2014';
}).closest('tr');
});
如果您要使用计划 JS 解决方案,它可能看起来像:
function getRowByYear(year) {
var table = document.getElementById('MyTable');
var row, rows = table.rows;
var input;
for (var i=0, iLen=rows.length; i<iLen; i++) {
input = rows[i].cells[0].getElementsByTagName('input')[0];
if (input.value == year) {
return rows[i];
}
}
}
并且可能 运行 比 jQuery 选择器快得多。
但是,由于您说“当任何这些控件中的值更改时...”,那么您可能正在使用更改事件,因此您可以简单地从中获取输入事件已分派(this 在侦听器中)并转到最近的行。
虽然我同意 vanilla JS 会更有效率,但我认为过滤太昂贵了?我会去听更改事件并找到最近的行:
$( 'body' ).on( 'change', 'input[type="text"]', function(){
var theRow = $( this ).closest( 'tr' );
// Do what you need to with theRow
} );
好吧,这看起来应该是一个简单的问题,但我却找不到答案。我有一个从 JSON 数据构建的表单,我从中构建了一个 table 的 3 行和 14 列,每列包含一个 INPUT 文本控件。
当任何这些控件中的值发生变化时,我需要找到第一列中的输入控件等于特定年份的包含行。
这是标记示例:
<table id="MyTable">
<tr>
<td><input type="text" /></td>
<td><input type="text" class="changeHandled"/></td>
<td><input type="text" class="changeHandled" /></td>
</tr>
</table>
我试过的选择器是:#MyTable tr:has('input[value="{year}"]')
和几十种变体。
我将 {year}
字符串替换为我正在搜索的年份值,因此它最终看起来像:#MyTable tr:has('input[value="2014"]')
我认为这可能是因为值最初是通过代码设置的,因为如果我使用 #MyTable tr:has('input')
它 returns 所有行。
由于可维护性,我不想对路径进行硬编码,只是在 javascript 代码中说 $(this).closest("tr")...
。
知道如何检索对包含具有特定值的输入的 TR 的引用吗?如果我的代码是正确的,通过代码设置值时是否需要做一些不同的事情?
只有 input
元素具有值为 2014
的硬编码 value
属性,select 或 $('#MyTable tr:has(input[value="2014"])')
才会起作用。参见 this example。
如果您尝试 select 没有硬编码 value
属性的 input
元素,那么您可以过滤元素和 return input
值等于 2014
的元素。根据您的需要,您可以收听 input
或 change
事件。
$('#MyTable input').on('input change', function () {
$tr = $('#MyTable tr input:first').filter(function () {
return this.value === '2014' || $(this).attr('value') === '2014';
}).closest('tr');
});
如果您要使用计划 JS 解决方案,它可能看起来像:
function getRowByYear(year) {
var table = document.getElementById('MyTable');
var row, rows = table.rows;
var input;
for (var i=0, iLen=rows.length; i<iLen; i++) {
input = rows[i].cells[0].getElementsByTagName('input')[0];
if (input.value == year) {
return rows[i];
}
}
}
并且可能 运行 比 jQuery 选择器快得多。
但是,由于您说“当任何这些控件中的值更改时...”,那么您可能正在使用更改事件,因此您可以简单地从中获取输入事件已分派(this 在侦听器中)并转到最近的行。
虽然我同意 vanilla JS 会更有效率,但我认为过滤太昂贵了?我会去听更改事件并找到最近的行:
$( 'body' ).on( 'change', 'input[type="text"]', function(){
var theRow = $( this ).closest( 'tr' );
// Do what you need to with theRow
} );