Конечно не будет работать. Вы сначала определили
var select = document.getElementById('p23');
, а потом
var select = document.getElementById('p22');
И при вызове обработчиков будет использовать актуальное значение select, т.е. последнее. Когда вы пишите
document.getElementById('selectFilter2').onkeyup = function(e)
, вы просто сообщаете, что при событии надо вызывать эту функцию. А работать она будет в контексте и с теми значениями глобальных переменных, какие будут на момент срабатывания события.
И вообще тут всё надо переписать.
UPD:
Без jQ:
document.querySelectorAll( '.search' ).forEach( function( searchInput, number ) {
// Передаём input-элемент и его порядковый номер на странице (первый - нулевой)
this.onkeyup = function( e ) {
if ( e.ctrlKey || e.altKey || e.metaKey ) return;
var select = document.querySelectorAll( 'select' )[ number ]; // Работаем с группой select с порядковыи номером на странице таким же, как у input, на котором произошло событие
select.options.forEach( function() {
// Если option соответствует поиску, то делаем видимым, если нет — скрываем
if ( this.innerHTML.test( searchInput.value ) )
this.style.display = 'inline';
else
this.style.display = 'none';
} )
}
} )
UPD2:
На jQ:
<input class = 'search' id = '1' onkeyup = 'search( this )'... >
<select id = '1' ...>
...
<input class = 'search' id = '2' onkeyup= 'search( this )'... >
<select id = '2' ...>
...
function search( i ) {
$( 'select#' + i.attr( 'id' ) + ' option' ).forEach( $( this ).toggle( $( this ).html().test( i.value ) ) )
}