一个表中包含一些输入和选择字段。我想检查一行的所有输入和选择字段是否都有值。这就是我的想法,但是我必须使用closest
和find
吗?我认为这不是最佳选择。
HTML
<table>
<tr>
<td><select><option></option><option>Select anything</option></td>
<td><input type="text" name="field1"></td>
<td><input type="text" name="field2"></td>
</tr>
<tr>
<td><select><option></option><option>Select something</option></td>
<td><input type="text" name="field3"></td>
<td><input type="text" name="field4"></td>
</tr>
</table>
JS
'change #table input, change #table select': function(event) {
var $this = $(event.currentTarget),
$row = $this.closest('tr'),
$elements = $row.find('input, select');
var empty = false;
$elements.each(function(index) {
if (!$(this).val()) empty = true;
});
if (empty)
console.log('some value is missing')
else {
console.log('valide');
// do something with values
}
}
答案 0 :(得分:2)
对于第一个问题,有一个潜意识方面。确保它是一个输入,然后在更改的输入的当前行的上下文中选择它。
首先,jQuery使用Sizzle(https://sizzlejs.com/)引擎进行选择。需要注意的一件事是该引擎对选择器字符串的“从右到左”处理。
因此,最佳选择在某种程度上取决于浏览器,但最快的选择方式是在类的现代浏览器中遵循的ID。一些较旧的浏览器也没有按类别进行选择,但让我们将其留给您进行研究。
因此,让我们看看你可能会使用的复杂选择器:
'div.mycontainer div.mytablecontainer>table#mytable.mytableclass tr td select, div.mycontainer div.mytablecontainer>table#mytable.mytableclass tr td input'
首先关闭不要使用。现在探讨为什么不:记得我们谈过“从右到左”的选择器处理?为了讨论,让我们将选择器缩小到最后一部分:
"div.mycontainer div.mytablecontainer>table#mytable.mytableclass tr td input"
从右侧开始,这是做什么的:
td
元素td
元素,找到tr
tr
元素中找到所有.mytableclass
mytable
的元素中的所有内容(请记住此ID必须是唯一的)table
元素的单个元素ID mytablecontainer
div
mycontainer
div
那里有很多工作。但我们还没有完成!我们必须为那里的OTHER选择器做同样的事情。
现在让我们做得更好;首先,让我们通过在所有“范围”输入中添加一个类来利用现代浏览器类选择器 - 我们要检查输入的内容。
<input class="myinput" />
它确实需要type=""
属性,但暂时忽略它。让我们用它。
$('#mytable').find('.myinput');
这是做什么的:
'mytable'
的元素,它是所有浏览器中的FASTEST选择器;我们已经删除了DOM中的其他47个表。class="myinput"
的所有元素; 该表格;在现代浏览器中,这也非常快DONE。哇!这远远不够工作。
.find()
而非"#mytable input"
还记得我们再次离开的权利吗?查找DOM中的所有输入,然后缩小到我们在该表中找到的那些输入现在没有停止。
或(更有可能)"#mytable .myinput"
所以我们选择一组元素的“规则”是:
.find()
或.children()
会更好吗?在一个小型DOM中,维护可能会更容易,但也可以在4年内更容易理解?您不能简单地全局使用!$(this).val()
作为输入。
对于无效的复选框。单选按钮怎么样?那个<input type="button" >
之后有人添加到行中呢? UGH。
所以,只需在您希望验证并由以下人员选择的所有“输入”中添加一个类:
<input type="text" class="validateMe" />
<select class="validateMe" >...
旁注你可能想要嗅探输入的TYPE并根据它进行验证:How to get input type using jquery?
编辑:请记住您的验证输入MIGHT有一个“真/假”值,因此可能会失败:!$(this).val()
(单选按钮,复选框在这里出现)
<table id="mytable">
<tr>
<td>
<select class="myinput">
<option></option>
<option>Select anything</option>
</select>
</td>
<td>
<input class="myinput" type="text" name="field1" />
</td>
<td>
<input class="myinput" type="text" name="field2" />
</td>
</tr>
<tr>
<td>
<select class="myinput">
<option></option>
<option>Select something</option>
</select>
</td>
<td>
<input class="myinput" type="text" name="field3" />
</td>
<td>
<input class="myinput" type="text" name="field4" />
</td>
</tr>
</table>
<div id="results">
</div>
可能不想要全局(名称空间为“选择器”)
var selectors = '.myinput';
$('#mytable').on('change', selectors, function(event) {
var $this = $(event.currentTarget),
$row = $this.closest('tr'),
$elements = $row.find(selectors);
var $filledElements = $elements.filter(function(index) {
return $(this).val() || this.checked;
});
var hasEmpty = $filledElements.length !== $elements.length
var rowIndex = $row.index();
$('#results').append("Row:" + rowIndex + " has " + $filledElements.length + ' of ' + $elements.length + ' and shows ' + hasEmpty + '<br />');
if (hasEmpty)
console.log('some value is missing');
else {
console.log('valide');
// do something with values
}
});
答案 1 :(得分:0)
如果您只是在知道要选择哪个父元素的情况下选择特定元素,则应尝试使用.filter()
仅过滤掉没有如下值的元素:
$('button').click(function() {
var h = $('table :input').filter(function() {
return $(this).val() == "" && $(this);
}).length;
alert(h);
});
答案 2 :(得分:0)
我做了这个插件
https://plnkr.co/edit/q3iXSbvVWEQdLSR57nEi
$(document).ready(function() {
$('button').click(function() {
var table = $('table');
var rows = table.find('tr');
var error = 0;
for (i = 0; i < rows.length; i++) {
var cell = rows.eq(i).find('td');
for (a = 0; a < cell.length; a++) {
var input = cell.eq(a).find(':input');
if (input.val() === "") {
input.css("border", "solid 1px red");
error++;
} else {
input.css("border", "solid 1px rgb(169, 169, 169)");
}
}
}
if (error > 0){
alert('Errors in the form!')
return false;
} else {
alert('Form Ok!')
return true;
}
})
})
简单的Jquery验证,搜索所有输入(包括选择),如果它为null,则递增错误计数器并更改类。如果错误计数器是> 0,警告错误并返回false;
也许不是最好的解决方案,但它确实可以帮助你开始。