2015-07-01 26 views
5

Próbuję zapobiec cofnięciu się przycisku Backspace o jedną stronę w każdej przeglądarce. Na razie używam tego kodu:menu rozwijane jquery select ignoruje zdarzenie keydown, gdy jest otwarte?

$(document).on("keydown", function (e) { 
    if (e.which === 8 && !$(e.target).is("input, textarea")) { 
     e.preventDefault(); 
    } 
}); 

To działa dobrze na wszystko z wyjątkiem, gdy lista rozwijanej wybierz pole jest otwarte, to wydarzenie jest ignorowany i cofania o jedną stronę zajmuje mi z powrotem i tak. Jak mogę rozwiązać ten problem? Dziękuję Ci za Twoje odpowiedzi.

Odpowiedz

2

tylko dla informacji, to jest Google Chrome specyficzny ponieważ Twój kod działa poprawnie w IE i FF.

Jeśli naprawdę potrzebujesz tego do pracy, możesz wyrenderować fałszywe menu rozwijane, a następnie ustawić programowo wybrane.

Można zmienić rozmiar listy rozwijanej pojawiać jak to było otwarte, coś takiego: https://jsfiddle.net/yzr2cmqv/

<div clas="select-wrap"> 
    <div class="fake-select"></div> 
    <select class="select"> 
     <option value="1">one</option> 
     <option value="2">two</option> 
     <option value="3">three</option> 
    </select> 
</div> 

$(".fake-select").on("click", function() { 
    var numOfOpen = $("select.select option").size(); 
    $(".select").attr("size", numOfOpen).css("overflow", "hidden"); 
    $(this).hide(); 
}); 

$(".select").on("click", function() { 
    $(".select").attr("size", 1); 
    $(".fake-select").show(); 
}); 

Poza tym nie sądzę, można zrobić wszystko od wydarzeń Chrome nie strzelają gdy rozwijanie jest otwarte.

+1

Wygląda na to, że jest to błąd w Chrome. Zgłosiłem to. Dziękuję za pomoc. – Silko

+0

Fajna technika zmiany "rozmiaru", chociaż niestety łamie nawigację po klawiaturze ... –

+1

Możesz zaimplementować dodatkowe zdarzenia klawiszem w górę/w dół, aby odtworzyć tę samą logikę, coś podobnego do tego fidle: https://jsfiddle.net/yzr2cmqv/15 / – Shark4109

-2

Wystarczy dodać tag select do selektora:

$(document).on("keydown", function (e) { 
    if (e.which === 8 && !$(e.target).is("input, textarea, select")) { 
     e.preventDefault(); 
    } 
}); 
+0

Nie zrozumiałeś mojego qustiona. To, co zrobiłeś, pogarsza sytuację. Domyślne zdarzenie w select to powrót do strony i jeśli dodaję ją tam, gdzie ją zasugerujesz, nie będzie działać również z zamkniętym menu. – Silko

-2

Musisz sprawdzić keyDown na $ (wybierz) już teraz, jeśli dodać

console.log(e.which) 
console.log(e.target) 

będziesz zauważ, że nie dostaniesz zdarzenia keydown po kliknięciu i naciśnięciu klawisza, gdy aktywne jest rozwijane menu wyboru.

to zrobi to za

$(document).on("keydown", $('select'), function (e) { 
    if (e.which === 8) { 
     e.preventDefault(); 
    } 
}); 
+1

hmm, zauważyłem, że mój kod działa tylko wtedy, gdy zaznaczenie jest aktywne, gdy jest skupione, ale musi zostać zamknięte. Zdałem sobie sprawę, że to nie działa podczas otwierania selekcji. –

+0

Już to wypróbowałem. To nie pomaga. Jak już powiedziałem, mój kod działa w trybie select po zamknięciu listy rozwijanej. Problem pojawia się, gdy rozwijane jest menu rozwijane. I ten sam problem dotyczy twojej sugestii. – Silko