Итак, я собираюсь немного глубже понять, почему это не работает, потому что я такой человек, который не может спать по ночам, не зная ха-ха. Я использую 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 вместо создания другого.
Не используйте цель, если вам это не нужно. Это не объект jQuery, поэтому не имеет методов jQuery
Вместо этого используйте $(this)
(объект jQuery)
$('body').on('change', 'select', function(event) {
var $sel = $(this), // the select changed
id = this.id, // or $(this).attr("id");
val = $(this).val();
if (id.indexOf("couche") >= 0) {
$.ajax({
url: "{{ redir2 }}",
type: "POST",
data: {
ident: id,
value: val,
iscouche: "True"
},
}).done(function(msg) {
if (msg.nothing == 1) {
var what = $sel.closest('tbody')
$(what).find("tr:gt(0)").remove();
} else {
var add = $sel.closest('tr');
var toremove = msg.toremove.split(" ")
for (var i = 0; i < toremove.length; i++) {
if (toremove[i].length > 0) {
jQuery(toremove[i]).remove();
}
}
jQuery(add).after(msg.ret);
}
});
} else {
$.ajax({
url: "{{ redir2 }}",
type: "POST",
data: {
ident: id,
value: val;,
iscouche: "False"
},
}).done(function(msg) {});
}
});
или neater:
$('body').on('change', 'select', function(event) {
var $sel = $(this), // the select changed
id = this.id,
isCouche = id.indexOf("couche") != -1,
val = $(this).val();
$.ajax({
url: "{{ redir2 }}",
type: "POST",
data: {
ident: id,
value: val,
iscouche: isCouche ? "True" : "False";
},
}).done(function(msg) {
if (isCouche) {
if (msg.nothing == 1) {
var what = $sel.closest('tbody')
$(what).find("tr:gt(0)").remove();
} else {
var add = $sel.closest('tr');
var toremove = msg.toremove.split(" ")
for (var i = 0; i < toremove.length; i++) {
if (toremove[i].length > 0) {
$(toremove[i]).remove();
}
}
$(add).after(msg.ret);
}
} else {
// handle not couche
}
});
});
Вы должны включить его в $()
, поскольку event.target
не является элементом jQuery
$(event.target).closest('tr')
closest()
определен в прототипе jQuery, его нельзя использовать для обычного объекта JavaScript.
event.target
является элементом DOM, на котором произошло событие, используйте jQuery-методы на нем, элемент должен быть обернут в jQuery.
Измените
var what = event.target.closest('tbody')
на
var what = $(event.target).closest('tbody')
$(this)
, я не буду добавлять это в ответ. :). Использование this
является правильным способом.
– Tushar
22 March 2016 в 15:57