Keydown działa idealnie po wybraniu document, *, body lub dowolny konkretny element.

Ale kiedy dodaję .not('.some-class'), kieliszek działa jak ten .not() nie istnieje. Może ze względu na sposób wpływa na elementy dzieci, ale nie jestem pewien:

$('*').not('.some-class').on('keydown',function(e){ 
    var key = e.charCode || e.keyCode;
    if(key == 33 || key == 34 || key == 35 || key == 36 || key == 37 || key == 38 || key == 39 || key == 40 ) {
        e.preventDefault();
    } else {}
});

Jak wyłączyć te klawisze dla całego dokumentu z wyjątkiem 1 klasy dziecka?

Edytuj: http://jsfiddle.net/uml139xW/2/

Jak powstrzymać tego niepożądanego przewijania, zachowując zdolność do przenoszenia caret ze strzałkami?

edytuj2: Kompletne rozwiązanie dzięki Jason P i Kaiido

http://jsfiddle.net/uml139xw/5/

1
astx123 12 sierpień 2014, 21:26

2 odpowiedzi

Najlepsza odpowiedź

Możesz użyć detektora położenia kursora z Ta odpowiedź , a następnie preventDefault() tylko wtedy, gdy jesteś na końcu.

$(document).on('keydown',function(e){
    console.log(this, e.target);
    var key = e.charCode || e.keyCode;
    if(key == 16 || key == 32 || key == 33 || key == 34 || key == 35 || key == 36 || key == 37 || key == 38 || key == 39 || key == 40 ) {
        e.preventDefault();
    } else {}
});
$('.b').on('keydown', function(e) {
  e.stopPropagation(); 
  var key = e.charCode || e.keyCode;
   //Above part comes from https://stackoverflow.com/questions/7451468/contenteditable-div-how-can-i-determine-if-the-cursor-is-at-the-start-or-end-o/7478420#7478420
    range = window.getSelection().getRangeAt(0)
    post_range = document.createRange();
    post_range.selectNodeContents(this);
    post_range.setStart(range.endContainer, range.endOffset);
    next_text = post_range.cloneContents();

    if( next_text.textContent.length === 0 && key == 39 ){
        e.preventDefault();
    }
});

Porozmawiający skrzypce

1
Community 23 maj 2017, 11:33

Bańka imprez (cóż, dobra liczba z nich). Oznacza to, że strzelają do celu wydarzenia, a następnie na każdym elemencie w górę drzewa Dom, więc nawet jeśli nie wiążysz przewodu handlarza do .some-class, będzie strzelał do przodków tego elementu. Ponadto, wiązanie obsługiwania zdarzeń do * jest ogólnie dobrego pomysłu. Może coś takiego byłoby dla ciebie działało?

http://jsfiddle.net/j3wqpdow/

$(document).on('keydown',function(e){ 
    console.log(this, e.target);
});

$('.some-class').on('keydown', function(e) {
   e.stopPropagation(); 
});
1
Jason P 12 sierpień 2014, 17:31