Это довольно сложный селектор для соответствия jQuery. Вы просите сделать немало ненужной работы.
В то время как стандартные селекторы CSS могут позволить вам использовать быструю реализацию соответствия браузеров CSS в новых браузерах с querySelectorAll
, пользовательские селекторы jQuery всегда будут работать медленно. Я бы предположил, что если у вас проблемы со скоростью, вам, вероятно, лучше написать соответствующий код в виде явного JavaScript, а не вводить его в селекторы.
Использование явного совпадающего кода также означает, что вы можете потерять уродливость конкатенации строк в селекторе Contains('" + forenameVal + "')
, что пойдет не так, если во входном имени присутствуют специальные символы, такие как '
. '
довольно часто встречается в реальных именах.
например. (Непроверенные):
var forenameVal= $('#txtForename').val().toUpperCase();
var surnameVal= $('#txtSurname').val().toUpperCase();
var table= document.getElementById('table');
for (var i= table.rows.length; i-->0;) {
var row= table.rows[i];
row.className= (
row.cells[0].firstChild.data.toUpperCase().indexOf(forenameVal)!==-1 &&
row.cells[1].firstChild.data.toUpperCase().indexOf(surnameVal)!==-1
)? '' : 'hidden';
}
Обратите внимание, что для получения data
каждая ячейка имени имеет один дочерний узел Text. Если это не так (ячейка имени может содержать другое содержимое или вообще не содержать его, даже пробелы), вам придется использовать вместо него $(row.cells[0]).text()
, но это также будет медленнее.
Он также использует className для скрытия ключа (вы бы поместили .hidden { display: none; }
в таблицу стилей), чтобы избежать некоторых трудностей с сокрытием строк таблицы. Вместо этого вы могли бы превратить его в if (...) $(row).show(); else $(row).hide();
, но опять-таки это заставляет jQuery выполнять немного больше работы.