Отключение jQuery UI Accordion с переключением пробела - PullRequest
5 голосов
/ 01 апреля 2011

Я вижу в jQuery UI accordian вы можете использовать пробел для переключения активных заголовков.Как можно это отключить?Я не хочу, чтобы пользователь использовал клавиатуру для взаимодействия с аккордеоном.

Ответы [ 3 ]

6 голосов
/ 10 августа 2011

если вам вообще не нужна функция "_keydown", я думаю, вы можете просто удалить ее.

delete($.ui.accordion.prototype._keydown);

, если вы хотите изменить или переопределить функции функции "_keydown" ине хочу взламывать исходный файл, который вы можете сделать:

$.ui.accordion.prototype._keydown = function( event ) {
    // your new code for the "_keydown" function
};

надеюсь, что это поможет

3 голосов
/ 07 ноября 2014

Я разработал ответ, чтобы просто включить пробел, но его можно расширить для других событий нажатия клавиш, которые вы хотите переопределить.

/*
 * Detect spacebar and return immediately, otherwise call standard behaviour
 * The 'solution' of deleting the event handler caused other errors
 * http://stackoverflow.com/a/7008791
*/
$.ui.accordion.prototype._originalKeyDown = $.ui.accordion.prototype._keydown;
$.ui.accordion.prototype._keydown = function( event ) {
    var keyCode = $.ui.keyCode;

    if (event.keyCode == keyCode.SPACE) {
        return;
    }
    // call the original method
    this._originalKeyDown(event);
};
1 голос
/ 21 апреля 2011

Я нашел рабочее решение, но я не уверен в последствиях.

В jquery.ui.accordion.js:

_keydown: function( event ) {
    if ( this.options.disabled || event.altKey || event.ctrlKey ) {
        return;
    }

    var keyCode = $.ui.keyCode,
        length = this.headers.length,
        currentIndex = this.headers.index( event.target ),
        toFocus = false;

    switch ( event.keyCode ) {
        case keyCode.RIGHT:
        case keyCode.DOWN:
            toFocus = this.headers[ ( currentIndex + 1 ) % length ];
            break;
        case keyCode.LEFT:
        case keyCode.UP:
            toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
            break;
        case keyCode.SPACE:
        case keyCode.ENTER:
            this._clickHandler( { target: event.target }, event.target );
            event.preventDefault();
    }

    if ( toFocus ) {
        $( event.target ).attr( "tabIndex", -1 );
        $( toFocus ).attr( "tabIndex", 0 );
        toFocus.focus();
        return false;
    }

    return true;
},

Обратите внимание на "провал" из космоса, чтобы войти. Я добавил перерыв:

_keydown: function( event ) {
    if ( this.options.disabled || event.altKey || event.ctrlKey ) {
        return;
    }

    var keyCode = $.ui.keyCode,
        length = this.headers.length,
        currentIndex = this.headers.index( event.target ),
        toFocus = false;

    switch ( event.keyCode ) {
        case keyCode.RIGHT:
        case keyCode.DOWN:
            toFocus = this.headers[ ( currentIndex + 1 ) % length ];
            break;
        case keyCode.LEFT:
        case keyCode.UP:
            toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
            break;
        case keyCode.SPACE:
            break;
        case keyCode.ENTER:
            this._clickHandler( { target: event.target }, event.target );
            event.preventDefault();
    }

    if ( toFocus ) {
        $( event.target ).attr( "tabIndex", -1 );
        $( toFocus ).attr( "tabIndex", 0 );
        toFocus.focus();
        return false;
    }

    return true;
},

Вы по-прежнему получаете закрывающее поведение при нажатии «enter», так что не стесняйтесь прорваться туда, если это необходимо. Я думаю, что проблема в

this._clickHandler( { target: event.target }, event.target );

но я не увидел его при первом прочтении. Это редактирование работает для меня.

Надеюсь, это поможет

...