2014-11-10 4 views
19

Ребята из http://jqueryvalidation.org/ только что выпустили версию 1.13.1. Проверка на их веб-сайте я вижу это в сводке изменений:Как включить проверку jquery в полях readonly?

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

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

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

С этим изменением плагин проверки игнорирует введенные вставляемые входы, помеченные как необходимо, может ли кто-нибудь помочь мне предложить некоторое исправление для версий 1.13.1 или будущих версий? i've нашел вопрос, чтобы сделать наоборот: How can I disable jquery validation on readonly fields?

+0

Что нужно для проверки? Неправильная дата выбрана? – Panoptik

+0

Мне нужно, чтобы он был необходим, поэтому он становится красным и все макияж проверки. Он работал нормально до этой версии. –

+0

Возможно, будет лучше установить значение по умолчанию для этого поля? – Panoptik

ответ

37

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

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

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

Вы также можете использовать свой ввод как поле readonly. Таким образом, вы будете иметь «все функции» только для чтения. Что-то вроде: customreadonly {background-color: #eee; cursor: not-allowed;} – Thiago

10

Вы можете переопределить исходную функцию «элементы» с реализацией, которая очень похожа на исходную реализацию, за исключением обработки поля readonly. Это не изящное решение, но оно действительно работает. Если вы обновите свою библиотеку проверки подлинности jquery, вам также необходимо перепроверить свой переопределенный метод.
* UpToDate * См. Jquery-validate-1.14 changeLog: Отменить «Игнорировать только как прочитанные, так и отключенные поля». :) :)

$.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; 
    });   
}; 
+1

+1 Кроме того, '.not (": submit,: reset,: image, [disabled], [readonly]: not (.my-special-input-class) ")' будет более элегантный. – Salar

2

Мне не понравилось привязываться к событиям 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(); 
}) 
+0

Я думаю, что это должна быть функция (e) вместо функции(). К сожалению, SO не позволяет мне фиксировать только один символ. – LucasBr

+0

Не нужно быть функцией (e), если вы ничего не делаете с e. В этом случае событие не используется, поэтому нет необходимости в нем. –

0

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

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

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

Это оставляет элемент, имеющих право на проверки и не позволяет ничего вводить внутрь.

Смежные вопросы