Как предотвратить проверку скрытого поля? [Дубликат]

Это фактически не имеет ничего общего с значениями по умолчанию, кроме того, что часто возникает неожиданное поведение при записи функций с изменяемыми значениями по умолчанию.

>>> def foo(a):
    a.append(5)
    print a

>>> a  = [5]
>>> foo(a)
[5, 5]
>>> foo(a)
[5, 5, 5]
>>> foo(a)
[5, 5, 5, 5]
>>> foo(a)
[5, 5, 5, 5, 5]

В этом нет значений по умолчанию код, но вы получаете точно такую ​​же проблему.

Проблема в том, что foo является изменением изменчивой переменной, переданной от вызывающего, когда вызывающий объект не ожидает этого , Код, подобный этому, был бы хорош, если бы функция была вызвана как-то вроде append_5; то вызывающий абонент будет вызывать функцию, чтобы изменить значение, которое они передают, и поведение будет ожидаться. Но такая функция вряд ли примет аргумент по умолчанию и, вероятно, не вернет список (поскольку у вызывающего уже есть ссылка на этот список, тот, который он только что передал).

Ваш оригинал foo с аргументом по умолчанию не должен изменять a, был ли он явно передан или получил значение по умолчанию. Ваш код должен оставлять изменчивые аргументы отдельно, если из контекста / имени / документации не ясно, что аргументы должны быть изменены. Использование измененных значений, передаваемых в качестве аргументов, таких как локальные временные файлы, является крайне плохой идеей, независимо от того, находимся ли мы на Python или нет, и есть ли задействованные аргументы по умолчанию.

Если вам нужно разрушить локальное временное в процессе вычисления чего-то, и вам нужно начать свою манипуляцию из значения аргумента, вам нужно сделать копию.

162
задан Shaman 11 December 2011 в 21:08
поделиться

8 ответов

Автор плагина говорит, что вы должны использовать квадратные скобки без кавычек , []

http://bassistance.de/2011/10/ 07 / release-validation-plugin-1-9-0 /

Release: Validation Plugin 1.9.0: «... Еще одно изменение должно сделать установку форм со скрытыми Элементы проще, теперь они игнорируются по умолчанию (опция «ignore» теперь имеет значение «: hidden» по умолчанию). Теоретически это может нарушить существующую настройку. В маловероятном случае, что это действительно так, вы можете исправить это, установив ignore-option to "[]" (квадратные скобки без кавычек).

Чтобы изменить эту настройку для всех форм:

$.validator.setDefaults({ 
    ignore: [],
    // any other default options and/or rules
});

(Это не что .setDefaults() находится внутри функции document.ready)

ИЛИ для одной конкретной формы:

$(document).ready(function() {

    $('#myform').validate({
        ignore: [],
        // any other options and/or rules
    });

});

EDIT:

См. этот ответ о том, как включить проверку некоторых скрытых полей, но все равно игнорировать другие.


EDIT 2:

Перед тем как оставить комментарии, что " это не работает », продолжайте в виду, что OP просто спрашивает о плагине jQuery Validate , и его вопрос не имеет никакого отношения к тому, как ASP.NET, MVC или любая другая инфраструктура Microsoft могут изменить нормальное ожидаемое поведение этого плагина. Если вы используете фреймворк Microsoft, функционирование плагина jQuery Validate по умолчанию перезаписывается плагином Microsoft unobtrusive-validation.

Если вы боретесь с плагином unobtrusive-validation, пожалуйста, обратитесь вместо этого: https://stackoverflow.com/a/11053251/594235

283
ответ дан Community 21 August 2018 в 07:25
поделиться
  • 1
    Возможно, нисходящий может дать мне конструктивную обратную связь. В противном случае ответ полностью самодостаточен, правильно подготовлен, дает примеры кода и технически корректен в соответствии с автором плагина. – Sparky 17 March 2013 в 02:41
  • 2
    @StijnVanBael, нет, это ложь. Смотрите: jsfiddle.net/F4w92/1 , а также см. Мой второй комментарий к ответу jerick . – Sparky 11 July 2013 в 15:57
  • 3
    Хорошо сказал @ Спарки. Понижение голосов - это, скорее всего, месть, я столкнулся с тем же. – Omar 22 July 2013 в 12:02
  • 4
    JSFiddle больше не работает, потому что библиотеки загружаются в HTTP вместо HTTPS. Обновленная версия: jsfiddle.net/F4w92/31 – hotips 5 June 2015 в 14:55
  • 5
    Я также остановился, так как это не работает для меня с использованием последней версии, пришлось использовать: $ (& quot; form & quot;). Data (& quot; валидатор & quot;). Settings.ignore = & quot; как другой ответ от @James ниже – Mark Homer 9 October 2015 в 14:07

Итак, я собираюсь немного глубже понять, почему это не работает, потому что я такой человек, который не может спать по ночам, не зная ха-ха. Я использую jQuery validate 1.10 и Microsoft jQuery Unobtrusive Validation 2.0.20710.0, который был опубликован в 1/29/2013.

Я начал с поиска метода setDefaults в jQuery Validate и нашел его в строке 261 unminified file. Вся эта функция действительно объединяет ваши настройки json в существующие $.validator.defaults, которые инициализируются с использованием свойства ignore, которое установлено как «: hidden», а также другие значения по умолчанию, определенные в jQuery Validate. Поэтому в этот момент мы переопределили игнорирование. Теперь давайте посмотрим, на что ссылается это свойство по умолчанию.

Когда я прорисовывал код, чтобы увидеть, где ссылается $.validator.defaults. Я заметил, что это используется только конструктором для валидатора формы, строка 170 в jQuery проверяет unminified файл.

// constructor for validator
$.validator = function( options, form ) {
    this.settings = $.extend( true, {}, $.validator.defaults, options );
    this.currentForm = form;
    this.init();
};

На этом этапе валидатор объединит все установленные по умолчанию настройки, которые были установлены и прикреплены к валидатору формы. Когда вы смотрите на код, который выполняет проверку, подсветку, подсвечивание и т. Д., Все они используют объект validator.settings, чтобы вытащить свойство ignore. Поэтому нам нужно убедиться, что мы должны установить игнорирование с помощью метода setDefaults, тогда он должен произойти до $ («form»). Вызывается функция validate ().

Если вы используете Asp .net MVC и ненавязчивый плагин, тогда вы поймете, посмотрев на javascript, который validate вызывается в документе .ready. Я также назвал свои setDefaults в блоке document.ready, который будет выполняться после скриптов, jquery проверяет и ненавязчив, потому что я определил эти сценарии в html перед тем, у кого есть вызов в нем. Таким образом, мой вызов, очевидно, не повлиял на функциональность по умолчанию пропуска скрытых элементов во время проверки. Здесь есть пара вариантов.

Вариант 1 - Вы могли бы, как указал Хуан Мелладо, вызвать вызов за пределами документа. Уже выполнив его, как только скрипт будет загружен. Я не уверен в сроках этого, так как браузеры теперь могут выполнять параллельную загрузку скрипта. Если я просто буду осторожен, то, пожалуйста, поправьте меня. Кроме того, возможно, есть способы обойти это, но для моих нужд я не пошел по этому пути.

Вариант 2a - Безопасная ставка в моих глазах - просто заменить $.validator.setDefaults({ ignore: '' }); внутри события document.ready с $("form").data("validator").settings.ignore = "";. Это изменит свойство ignore, которое фактически используется проверкой jQuery при выполнении каждой проверки на ваших элементах для данной формы.

Параметры 2b - После просмотра кода немного больше вы также можете использовать $("form").validate().settings.ignore = ""; как способ установки свойства ignore. Причина в том, что при просмотре функции validate он проверяет, был ли объект-валидатор уже сохранен для элемента формы с помощью функции $.data(). Если он находит объект валидатора, хранящийся в элементе формы, он просто возвращает объект validator вместо создания другого.

26
ответ дан AaronLS 21 August 2018 в 07:25
поделиться
  • 1
    вариант 2 работает. – SSA 31 January 2013 в 15:17
  • 2
    Спасибо за подробный ответ! – davidallyoung 20 February 2015 в 18:47
  • 3
    Хорошая работа, поскольку ответ OP не работал для меня в MVC 5 – Mark Homer 9 October 2015 в 14:36
  • 4
    ваш анализ помог мне в исправлении одной моей проблемы с проверкой. +1 – Prasoon 3 May 2016 в 06:11

Это работало для меня на сайте ASP.NET. Чтобы включить проверку в некоторых скрытых полях, используйте этот код

$("form").data("validator").settings.ignore = ":hidden:not(#myitem)";

Чтобы включить проверку для всех элементов формы, используйте эту $("form").data("validator").settings.ignore = "";

. Обратите внимание: используйте их в $(document).ready(function() { })

6
ответ дан angela.mirjalili 21 August 2018 в 07:25
поделиться

Просто добавленный ignore: [] на конкретную страницу для конкретной формы, это решение сработало для меня.

$("#form_name").validate({
        ignore: [],
        onkeyup: false,
        rules: {            
        },      
        highlight:false,
    });
7
ответ дан Benno 21 August 2018 в 07:25
поделиться

Обязательно установите

 $.validator.setDefaults({ ignore: '' });

НЕ внутри $(document).ready

62
ответ дан Hakam Fostok 21 August 2018 в 07:25
поделиться
  • 1
    Отличный ответ. Ссылка на документацию хороша для людей, чтобы учиться, но прямой ответ более ценен. Он был на правильном пути, но поставил его за пределы $ (документа). Уже трюк. – Kevin Zych 2 February 2013 в 03:39
  • 2
    @KevinZych, По-видимому, совершенно неважно, находится ли $.validator.setDefaults() внутри или снаружи готового ручного DOM. Сравните этот jsFiddle с этим jsFiddle . – Sparky 9 April 2013 в 21:40
  • 3
    Интересный @Sparky, ваши скрипки - отличное доказательство. Я должен вернуться и посмотреть на код, который я исправил с помощью этого решения, и выяснить, почему я пришел к выводу, что он должен быть внутри готового обработчика DOM. Должно быть, была другая причина. – Kevin Zych 10 April 2013 в 04:26
  • 4
    Так же, как вы, ребята, в моем коде, который не работает внутри DOM, готов ... – molokoloco 18 April 2013 в 12:48
  • 5
    Джастин объясняет, почему запуск внутри документа вызывает проблемы. Однако этот ответ не является хорошим вариантом, потому что трудно гарантировать, что что-то вне готового документа будет работать до того, как документ готов. Doc.ready не будет ждать запуска скриптов за его пределами. Ничего личного, но это не надежный ответ. – AaronLS 9 September 2013 в 19:55

Это работало для меня на узле ASP.NET MVC3, где я оставил структуру для настройки ненавязчивой проверки и т. д., если это полезно кому угодно:

$("form").data("validator").settings.ignore = "";
66
ответ дан James Morcom 21 August 2018 в 07:25
поделиться
  • 1
    Этот работал для меня. Благодарю. – peterorum 28 August 2012 в 07:08
  • 2
    Мне также нравится этот, поскольку это означает, что я могу сделать это при определенных обстоятельствах, вместо того, чтобы изменять поведение по умолчанию. – Steve Owen 29 October 2012 в 17:40
  • 3
    Я должен был сделать это так, потому что использование .validate () для изменения параметров не работало. – Farinha 4 April 2014 в 14:01
  • 4
    Чемпион! Спасибо за это, работал в MVC5 – m.t.bennett 10 November 2015 в 07:04
  • 5
    это правильное решение для ненавязчивой проверки, я пробовал все другие решения, они могли бы работать в случае НЕ использования ненавязчивого. Если вы используете ненавязчивое место, это правильное место. – Hakam Fostok 30 November 2016 в 09:32

Просто найдите текст ignore: ": hidden" в файле проверки jquery и прокомментируйте его. После комментариев это никогда не потеряет никаких скрытых элементов для проверки ...

Спасибо

-12
ответ дан user835525 21 August 2018 в 07:25
поделиться
  • 1
    Никогда не рекомендуется просто случайно комментировать код в сторонней библиотеке. – Jacques 12 October 2015 в 13:45

Это работает для меня.

jQuery("#form_name").validate().settings.ignore = "";
0
ответ дан Waqas Bukhary 21 August 2018 в 07:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: