Есть несколько способов сделать это, вот один из вариантов:
- найти все недействительные числа и присвоить им класс
- проверить, есть ли элементы с этим классом
это можно объединить, но для простоты рассмотрите их как две различные проверки:
$(".numbers").each(function() {
$(this).toggleClass("notvalid", !$.isNumeric($(this).text()));
});
if ($(".numbers.notvalid").length === 0)
// ok to continue
Демонстрационный фрагмент:
$(".numbers").each(function() {
$(this).toggleClass("notvalid", !$.isNumeric($(this).text()));
});
// Example usage
if ($(".numbers.notvalid").length === 0)
$("#out").text("all pass");
else
$("#out").text("not all passed");
.notvalid { background-color: red; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
<tr><td>Line1</td><td class='numbers'>123</td></tr>
<tr><td>Line2</td><td class='numbers'>abc</td></tr>
<tr><td>Line3</td><td class='numbers'>456</td></tr>
<tr><td>Line4</td><td class='numbers'>789</td></tr>
<table>
<hr/>
<div id="out"></div>
Чтобы обновить вашу попытку, .filter
может использоваться для возврата отфильтрованного списка, возвращая true (сохранить в списке) / false (удалить из списка). Так как вам не нужно проверять, сколько их было, чтобы сравнить, вы можете вернуть, сколько не удалось (аналогично приведенному выше), давая:
$("#clickit").click(function() {
if ($(".numbers").filter(function() {
if ($.isNumeric($(this).text()) === false) {
$(this).css("background-color", "red");
return true;
} else {
// reset the "red" ones - this is easier with add/remove class
$(this).css("background-color", "white");
return false;
}
})).length === 0) {
// none have an error, ok to continue
}
});