Отключение jQuery UI Accordion с переключением пробела

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


person Ali LIshan    schedule 01.04.2011    source источник


Ответы (3)


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

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

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

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

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

person reiner23fx    schedule 10.08.2011
comment
Перепрошивка работает хорошо. Вы не хотите полностью удалять keydown, потому что uicode все еще срабатывает и выдает ошибку. Просто вернитесь; из функции _keydown для обхода - person muck41; 20.08.2012

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

/*
 * 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);
};
person Lance Lavandowska    schedule 07.11.2014

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

В 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;
},

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

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

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

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

person Tyler DeWitt    schedule 21.04.2011
comment
Я работал над аналогичной проблемой (встроенное редактирование заголовка аккордеона - пробел вел себя странно) - я обнаружил, что в более поздних версиях JqueryUI метод обработчика кликов был удален и заменен на: this._eventHandler(event); - person Ian Robertson; 28.12.2013