Дальнейшее объяснение из моего комментария: this.method
не определено в строке 7 в вашем файле main.js
, потому что оно используется в функции стрелки. Помните, что функции стрелок в ES6 сохраняют лексический this
, поэтому вы на самом деле не обращаетесь к свойству правильно, потому что this
не указывает на что-либо, открытое перехватчиком в обратном вызове.
Основываясь на документации , кажется, что вы должны использовать resource.method
вместо этого.
Вы можете использовать параметр errorPlacement , чтобы переопределить отображение сообщения об ошибке с помощью небольшого CSS. Потому что одного css будет недостаточно для создания необходимого эффекта.
$(document).ready(function(){
$("#myForm").validate({
rules: {
"elem.1": {
required: true,
digits: true
},
"elem.2": {
required: true
}
},
errorElement: "div",
wrapper: "div", // a wrapper around the error message
errorPlacement: function(error, element) {
offset = element.offset();
error.insertBefore(element)
error.addClass('message'); // add a class to the wrapper
error.css('position', 'absolute');
error.css('left', offset.left + element.outerWidth());
error.css('top', offset.top);
}
});
});
Вы можете поиграть с левым и верхним атрибутами css, чтобы показать сообщение об ошибке вверху, слева, справа или внизу элемента. Например, чтобы показать ошибку вверху:
errorPlacement: function(error, element) {
element.before(error);
offset = element.offset();
error.css('left', offset.left);
error.css('top', offset.top - element.outerHeight());
}
И так далее. Дополнительные параметры можно найти в документации jQuery по css .
Вот CSS, который я использовал. Результат выглядит именно так, как вы хотите. Как можно меньше CSS:
div.message{
background: transparent url(msg_arrow.gif) no-repeat scroll left center;
padding-left: 7px;
}
div.error{
background-color:#F3E6E6;
border-color: #924949;
border-style: solid solid solid none;
border-width: 2px;
padding: 5px;
}
А вот необходимое фоновое изображение:
(источник: scriptiny.com )
Если вы хотите, чтобы сообщение об ошибке отображалось после группы вариантов или полей. Затем сгруппируйте все эти элементы в одном контейнере как «div» или «fieldset». Например, добавьте специальный класс для всех из них 'group'. И добавьте следующее в начало функции errorPlacement:
errorPlacement: function(error, element) {
if (element.hasClass('group')){
element = element.parent();
}
...// continue as previously explained
Если вы хотите обрабатывать только определенные случаи, вы можете вместо этого использовать attr:
if (element.attr('type') == 'radio'){
element = element.parent();
}
Этого должно быть достаточно для отображения сообщения об ошибке рядом с родительским элементом.
Возможно, вам придется изменить ширину родительского элемента, чтобы она была меньше 100%.
Я пробовал ваш код, и он отлично работает. Вот предварительный просмотр:
Я только что немного изменил заполнение сообщения, чтобы оно поместилось в строке:
div.error {
padding: 2px 5px;
}
Вы можете изменить эти числа, чтобы увеличить / уменьшить заполнение сверху / снизу или слева / справа. Вы также можете добавить к сообщению об ошибке высоту и ширину. Если у вас все еще возникают проблемы, попробуйте заменить диапазон на div
<div class="group">
<input type="radio" class="checkbox" value="P" id="radio_P" name="radio_group_name"/>
<label for="radio_P">P</label>
<input type="radio" class="checkbox" value="S" id="radio_S" name="radio_group_name"/>
<label for="radio_S">S</label>
</div>
А затем укажите ширину контейнера (это очень важно)
div.group {
width: 50px; /* or any other value */
}
О пустой странице. Как я уже сказал, я попробовал ваш код, и он у меня работает. Возможно, проблема связана с чем-то другим в вашем коде.
Я использую jQuery BeautyTips , чтобы добиться эффекта маленького пузыря, о котором вы говорите. Я не использую плагин Validation, поэтому особо не могу помочь, но его очень легко стилизовать и показать BeautyTips. Вы должны это изучить. Боюсь, что это не так просто, как правила CSS, поскольку вам нужно использовать элемент холста и включить дополнительный файл javascript, чтобы IE мог с ним хорошо поиграть.
Несколько вещей:
Во-первых, я не думаю, что вам действительно нужна ошибка валидации для набора полей радио, потому что вы можете просто проверить одно из полей по умолчанию. Большинство людей скорее исправят что-то, чем что-то предоставят. Например:
Age: (*) 12 - 18 | () 19 - 30 | 31 - 50
, скорее всего, будет изменен на правильный ответ, поскольку человек НЕ хочет, чтобы он возвращался к ответу по умолчанию. Если они видят его пустым, они с большей вероятностью подумают «не ваше дело» и пропустят его.
Во-вторых, я смог получить эффект, который, как мне кажется, вы хотите, без каких-либо свойств позиционирования. Вы просто добавляете padding-right к форме (или div формы, что угодно), чтобы предоставить достаточно места для вашей ошибки и убедиться, что ваша ошибка уместится в этой области. Затем у вас есть предварительно настроенный класс css под названием «error», и вы устанавливаете его как имеющий отрицательную верхнюю границу поля, примерно равную высоте вашего поля ввода, и маржу слева примерно на расстоянии от левого края до того места, где находится ваш правый отступ. должен начаться. Я пробовал это, не очень хорошо, но он работает с тремя свойствами и не требует никаких чисел с плавающей запятой или абсолютных значений:
<style type="text/css">
.error {
width: 13em; /* Ensures that the div won't exceed right padding of form */
margin-top: -1.5em; /*Moves the div up to the same level as input */
margin-left: 11em; /*Moves div to the right */
font-size: .9em; /*Makes sure that the error div is smaller than input */
}
<form>
<label for="name">Name:</label><input id="name" type="textbox" />
<div class="error"><<< This field is required!</div>
<label for="numb">Phone:</label><input id="numb" type="textbox" />
<div class="error"><<< This field is required!</div>
</form>
Если бы вы могли объяснить причину, по которой вам нужно заменить метку на div, это, безусловно, поможет ...
Кроме того, не могли бы вы вставить образец, который был бы полезно ( http://dpaste.com/ или http://pastebin.com/ )
К сожалению, я не могу комментировать свою репутацию новичка, но у меня есть решение проблемы с гасанием экрана или, по крайней мере, это то, что сработало для меня. Вместо того, чтобы устанавливать класс оболочки внутри функции errorPlacement, установите его сразу после установки типа оболочки.
$('#myForm').validate({
errorElement: "div",
wrapper: "div class=\"message\"",
errorPlacement: function(error, element) {
offset = element.offset();
error.insertBefore(element);
//error.addClass('message'); // add a class to the wrapper
error.css('position', 'absolute');
error.css('left', offset.left + element.outerWidth() + 5);
error.css('top', offset.top - 3);
}
});
Я предполагаю, что это позволит валидатору узнать, какие элементы div нужно удалить, а не все. Сработало для меня, но я не совсем уверен, почему, так что если кто-то может уточнить, это может помочь другим.
Этот ответ действительно помог мне, в моем случае мне пришлось отфильтровать некоторые элементы и указать специальное значение для их ошибочного div,
errorPlacement:function(error,element) {
if (element.attr("id") == "special_element") {
// special align
} else { // default error scheme
error.insertAfter(element);
}
}