select-search: herbereken de lijstpositie bij elke filterslag

De lijst is zo breed als haar inhoud, dus ze schuift naar links zodra ze
rechts van het veld niet meer past. position() liep alleen bij het openen,
met de volledige lijst als maat. Na het intypen van een zoekterm bleef die
verschuiving staan terwijl de lijst gekrompen was: drie korte regels ver
links van het veld waar ze bij horen.

Gemeten in test/fixture.html, veld op x=1250 in een venster van 1401px:
gefilterd tot 140px breed bleef de lijst op left 1073 staan, nu springt ze
naar 1250. Past de inhoud nog altijd niet, dan schuift ze zoals voorheen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Glenn Goossens
2026-09-16 14:18:16 +00:00
co-authored by Claude Opus 5
parent f07c4ffb9e
commit 6bb6f7d9cb
4 changed files with 15 additions and 3 deletions
File diff suppressed because one or more lines are too long
+7 -1
View File
@@ -1,7 +1,7 @@
// ==UserScript==
// @name BIPP: doorzoekbare dropdowns
// @namespace https://github.com/glgoose/ua-userscripts
// @version 1.8.2
// @version 1.8.3
// @description Geeft elke <select> met veel opties een zoekveld met substring-zoeken.
// @author glgoose
// @license GPL-3.0-or-later
@@ -528,6 +528,12 @@
var doel = 0;
if (behoud && vorigeActieve > 0) doel = Math.min(vorigeActieve, shown.length - 1);
setActive(shown.length ? doel : -1, false);
// De lijst is zo breed als haar inhoud, dus elke filterslag verandert die breedte en
// daarmee ook hoever ze naar links geschoven moet staan. Zonder deze herberekening blijft
// ze hangen op de plek die bij de volledige lijst hoorde: na het intypen van een zoekterm
// staan er dan drie korte regels ver links van het veld waar ze bij horen. openList roept
// position() zelf aan, en daar staat open nog op false, dus dit verdubbelt niets.
if (open) position();
}
function setActive(i, scroll) {
@@ -512,6 +512,12 @@
var doel = 0;
if (behoud && vorigeActieve > 0) doel = Math.min(vorigeActieve, shown.length - 1);
setActive(shown.length ? doel : -1, false);
// De lijst is zo breed als haar inhoud, dus elke filterslag verandert die breedte en
// daarmee ook hoever ze naar links geschoven moet staan. Zonder deze herberekening blijft
// ze hangen op de plek die bij de volledige lijst hoorde: na het intypen van een zoekterm
// staan er dan drie korte regels ver links van het veld waar ze bij horen. openList roept
// position() zelf aan, en daar staat open nog op false, dus dit verdubbelt niets.
if (open) position();
}
function setActive(i, scroll) {
@@ -1,7 +1,7 @@
// ==UserScript==
// @name BIPP: doorzoekbare dropdowns
// @namespace https://github.com/glgoose/ua-userscripts
// @version 1.8.2
// @version 1.8.3
// @description Geeft elke <select> met veel opties een zoekveld met substring-zoeken.
// @author glgoose
// @license GPL-3.0-or-later