Как включить проверку jquery в полях только для чтения?

ребята из http://jqueryvalidation.org/ только что выпущенная версия 1.13.1. Проверяя на своем сайте, я вижу это в журнале изменений:

ядро: * Игнорировать только для чтения, а также отключенные поля. (9f4ba10)

Это ссылка: https://github.com/jzaefferer/jquery-validation/commit/9f4ba10ea79b4cf59225468d6ec29911f0e53a0a

Я использую некоторые шаблоны Bootstrap и один из них теперь использует эту версию. Это приносит мне проблему, я использую атрибут readonly, чтобы запретить пользователям вводить даты вручную, поэтому их единственный вариант-выбрать дату из datepicker.

с этим изменением плагин проверки игнорирует входы readonly, отмеченные по мере необходимости, может ли кто-нибудь помочь мне предложить некоторое исправление для 1.13.1 или будущих версий? я нашел вопрос, чтобы сделать наоборот: Как отключить проверку jquery в полях только для чтения?

4 ответов


Спасибо за ваше предложение Паноптик, добавив readonly on focusin, а затем focusout Это самый чистый способ, огромное спасибо! Я отвечаю сам себе, если у кого-то есть такая же проблема. Надеюсь, это поможет.

$(document).on("focusin", "#someid", function() {
   $(this).prop('readonly', true);  
});

$(document).on("focusout", "#someid", function() {
   $(this).prop('readonly', false); 
});

вы можете переопределить исходную функцию "elements" с реализацией, которая очень похожа на исходную реализацию, за исключением обработки поля readonly. Это не элегантное решение, но оно работает. При обновлении библиотеки проверки jquery также необходимо перепроверить переопределенный метод.
* UpToDate* см. jquery-validate-1.14 изменений: Revert " игнорировать только чтение, а также отключенные поля.":):)

$.validator.prototype.elements = function() {
    var validator = this,
    rulesCache = {};

    return $( this.currentForm )
    .find( "input, select, textarea" )
    .not( ":submit, :reset, :image, [disabled]") // changed from: .not( ":submit, :reset, :image, [disabled], [readonly]" )
    .not( this.settings.ignore )
    .filter( function() {
        if ( !this.name && validator.settings.debug && window.console ) {
            console.error( "%o has no name assigned", this );
        }

        if ( this.name in rulesCache || !validator.objectLength( $( this ).rules() ) ) {
            return false;
        }

        rulesCache[ this.name ] = true;
        return true;
    });         
};

мне не нравилось привязываться к событиям focusin/out. Он также требует, чтобы вы добавили стиль CSS. Приведенный ниже код удаляет атрибут readonly и повторно применяет его при виде не действует.

$('#form').submit(function () {
    var children = $(this).find('input[readonly]');
    children.prop('readonly', false);

    var validform = $(this).valid();
    if (validform) {
        $(this).unbind('submit').submit();
    } else {
        children.prop('readonly', true);
    }

    e.preventDefault();
    e.stopPropagation();
})

решение с установкой readonly атрибут на fired focusin событие хорошее, но требует от нас писать обработчики в <script> блок (почему? Например, Firefox не поддерживает onfocusin attr для входных элементов).

и простой и кросс-платформенное решение на мой взгляд-это набор onkeydown="return false;" атрибут, как:

<input type="text" name="myBean.date" onkeydown="return false;">

это оставляет элемент подходящим для проверки и не позволяет вводить что-либо в него.