2013-08-01 14 views
6

Zakładki jQuery UI mają tę "funkcję", w której, gdy naciska się strzałki w górę/w lewo lub w dół/w prawo, przełączają zakładki i ładują tę zakładkę.Wyłącz nawigację za pomocą klawiszy strzałek

Ogólnie dla zakładek poziomych użytkownicy lepiej znają klawisze "w górę" i "w dół" przewijają karty stron w ruchu. Czy można wyłączyć nawigację po kartach tylko za klawisze góra i dół?

UPDATE

podstawie sugestii Konstantin za Próbowałem następujący kod. Blokuje zdarzenie po kliknięciu klawisza w górę lub w dół, zaraz po kliknięciu zakładki zakotwiczenia. Jeśli uderzę w inny klawisz, jak lewy/prawy klawisz, a następnie ponownie naciśnij klawisz w górę/w dół. Rejestruje zdarzenie, ale wydaje się, że nie zatrzymuje ono propagacji. Czy zdarzenie mogło wystrzelić z innego elementu? Oto mój kod:

$('#tabs').keydown(function (event) { 
     console.log("in tabs"); 
     if (event.keyCode == 40 || event.keyCode == 38) { 
      event.stopPropagation(); 
      event.preventDefault(); 
      return false; 
     }; 
    }); 
    $('.ui-tabs-anchor').keydown(function (event) { 
     console.log("in ui tabs anchor"); 
     if (event.keyCode == 40 || event.keyCode == 38) { 
      event.stopPropagation(); 
      event.preventDefault(); 
      return false; 
     }; 
    }); 

    $('.ui-tabs-nav').keydown(function (event) { 
     console.log("in ui tabs nav"); 
     if (event.keyCode == 40 || event.keyCode == 38) { 
      event.stopPropagation(); 
      event.preventDefault(); 
      return false; 
     }; 
    }); 
+0

Czy używasz cdn dla jQuery-UI? – apaul

+0

Hmm ... myślisz, że to jest problem z wersją? Czy wskazywałbyś na sprawę CDN? –

+0

Jeśli hostujesz go sam, pokażę ci, gdzie edytować plik jQuery-ui, na przykład – apaul

Odpowiedz

3

Szukaj następującego kodu w pliku jQuery UI i wykomentuj case $.ui.keyCode.DOWN: i case $.ui.keyCode.UP:

Dość dużo będzie usunięcie niechcianych funkcjonalność u źródła.

_tabKeydown: function(event) { 
     var focusedTab = $(this.document[0].activeElement).closest("li"), 
      selectedIndex = this.tabs.index(focusedTab), 
      goingForward = true; 

     if (this._handlePageNav(event)) { 
      return; 
     } 

     switch (event.keyCode) { 
      case $.ui.keyCode.RIGHT: 
//IMPORTANT BIT case $.ui.keyCode.DOWN: 
       selectedIndex++; 
       break; 
//IMPORTANT BIT case $.ui.keyCode.UP: 
      case $.ui.keyCode.LEFT: 
       goingForward = false; 
       selectedIndex--; 
       break; 
      case $.ui.keyCode.END: 
       selectedIndex = this.anchors.length - 1; 
       break; 
      case $.ui.keyCode.HOME: 
       selectedIndex = 0; 
       break; 
      case $.ui.keyCode.SPACE: 
       // Activate only, no collapsing 
       event.preventDefault(); 
       clearTimeout(this.activating); 
       this._activate(selectedIndex); 
       return; 
      case $.ui.keyCode.ENTER: 
       // Toggle (cancel delayed activation, allow collapsing) 
       event.preventDefault(); 
       clearTimeout(this.activating); 
       // Determine if we should collapse or activate 
       this._activate(selectedIndex === this.options.active ? false : selectedIndex); 
       return; 
      default: 
       return; 
     } 
+0

Rockstar! Dzięki za to. Kolejny powód, dla którego powinienem patrzeć kodu źródłowego częściej.Z ciekawości, czy istnieje sposób, aby to zrobić bez bezpośredniego dotykania jquery-ui? –

+0

@KaushikGopal Jestem pewien, że jest ... Grałem z nim przez kilka godzin, aż to mnie zmusiło Myślę, że trudność ma coś wspólnego ze sposobem, w jaki jQuery zmienia kod dostępu, w końcu zrezygnowałem z tego pomysłu, ponieważ wydawało mi się trochę czystsze i wydajniejsze, aby usunąć niepożądany kod niż dodać kod do usunięcia innego kodu, jeśli to ma jakiś sens, – apaul

+1

Schludne, ponieważ to rozwiązanie może mieć wartość nominalną, widzę zasadniczą wadę: co stanie się po uaktualnieniu interfejsu jQuery ?, wtedy będę musiał wrócić i poszukać tych linii i ponownie skomentować ich, tak często, jak ja ocena i tyle baz kodów, ile jest! –

4

Tak, możesz sobie poradzić ze zdarzeniem keydown i temu zapobiec. Jest przywiązany do kotwicy ui-karty:

$('.ui-tabs-anchor').keydown(function (event) { 
    return false; 
}); 
+0

To bardzo pomocne. Mimo to znajduję dziwne zachowanie. Po kliknięciu zakotwiczenia, a następnie spróbuj nacisnąć klawisz w górę/w dół (śledząc kody klawiszy, zapobiega to wystrzeleniu zdarzenia). Jeśli jednak uderzę w dowolny inny klawisz, taki jak lewy/prawy, a następnie uderzę w górę/dół, zezwoli na to zdarzenie. Prowadzi mnie to do przekonania, że ​​zdarzenie wystrzeliwuje z innego miejsca teraz, a nie z (".ui-tabs-anchor") Zaktualizowałem wpis moim kodem. Pozdrawiam –

1

Po prostu musiałem to zrobić sam. To właśnie zadziałało dla mnie:

$.widget("ui.tabs", $.ui.tabs, { 
    _tabKeydown: function (event) { 
     if (event.keyCode !== 38 && event.keyCode !== 40) { 
      this._super(event); 
     } 
    } 
}); 
+1

Wydaje się, że jest to o wiele lepsze niż wejście do zhackowania kodu źródłowego! –

Powiązane problemy