Bugün Gmail vb sitelerden de alışık olduğumuz shift ile çoklu seçim özelliğini geliştirmemiz gerekiyor.
Projenin demosu : Demo
Başlangıç dosyalarını bulabileceğiniz repom: js-30 | github
Amaç
Örneğin birinci checkbox'ı işaretledik ve sonra Shift
tuşuna basarak 5. checkbox'a tıklandığında 2.,3.,4 ve 5. checkbox'ların işaretlenmesini istiyoruz.
Çözümüm
< script >
// Tüm input elementlerini seçiyoruz.
// Burada spread operatör yardımıyla NodeList'i Array'e çevirdik çünkü bunu yapmasaydık findIndex metodunu kullanamazdık.
const allInputs = [ ... document . querySelectorAll ( ` input ` )] ;
// İşaretlemeye başlayacağımız checkbox'un başlangıç değerini saklamak için değişken oluşturuyoruz.
let startingIndex ;
function handleCheck ( e ) {
// Son tıklanan checkbox'un indexini allInputs arrayinde buluyoruz.
const currentIndex = allInputs . findIndex (( input ) => input === e . target ) ;
// Eğer shift tuşuna basılmamışsa yalnızca startingIndex değerini güncelliyoruz ve fonksiyondan çıkıyoruz.
if ( ! e . shiftKey ) {
startingIndex = currentIndex ;
return ;
}
// Eğer son tıklanan checkbox ilk tıklanandan sonraysa ilk tıklanandan başlayarak son tıklanana kadar tüm checkboxları işaretliyoruz.
if ( startingIndex < currentIndex ) {
allInputs . forEach (( input , index ) => {
if ( index < currentIndex && index > startingIndex ) {
input . checked = true ;
}
}) ;
}
// Eğer son tıklanan checkbox ilk tıklanandan önceyse son tıklanandan başlayarak ilk tıklanana kadar tüm checkbox'ları işaretliyoruz.
else {
allInputs . forEach (( input , index ) => {
if ( index > currentIndex && index < startingIndex ) {
input . checked = true ;
}
}) ;
}
}
// Her input elementine bir tıklama olayı (click event) ekliyoruz ve tıklama işlemi handleCheck() fonksiyonunda yönetiliyor.
allInputs . forEach (( input ) => input . addEventListener ( " click " , handleCheck )) ;
</ script >