jQuery переопределить отображение сообщения об ошибке проверки по умолчанию (Css) как всплывающее окно / всплывающая подсказка - PullRequest
69 голосов
/ 13 мая 2009

Я пытаюсь переопределить метку сообщения об ошибке по умолчанию с помощью div вместо метки. Я также посмотрел этот пост и понял, как это сделать, но мои ограничения в CSS преследуют меня. Как я могу отобразить это как некоторые из этих примеров:

Пример # 1 (Dojo) - Необходимо ввести неверный ввод, чтобы увидеть отображение ошибки
Пример # 2

Вот пример кода, который переопределяет метку ошибки на элемент div

$(document).ready(function(){
            $("#myForm").validate({
                rules: {
                    "elem.1": {
                        required: true,
                        digits: true
                    },
                    "elem.2": {
                        required: true
                    }
                },
                errorElement: "div"
            });                  
        });

Теперь я в недоумении от CSS, но вот оно:

div.error {
        position:absolute;
        margin-top:-21px;
     margin-left:150px;
     border:2px solid #C0C097;
        background-color:#fff;
        color:white;
        padding:3px;
        text-align:left;
        z-index:1;
        color:#333333;
     font:100% arial,helvetica,clean,sans-serif;
     font-size:15px;
     font-weight:bold;  
    }

UPDATE:

Хорошо, я сейчас использую этот код, но изображение и размещение во всплывающем окне больше границы, можно ли это отрегулировать, чтобы оно было динамическим по высоте?

if (element.attr('type') == 'radio' || element.attr('type') == 'checkbox') {
   element = element.parent();

   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 - (element.height() / 2)); // Not working for Radio, displays towards the bottom of the element. also need to test with checkbox
} else {
   // Error placement for single elements
   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 - (element.height() / 2));
}

CSS такой же, как показано ниже (ваш код CSS)

Html

<span>
<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>
</span>

Ответы [ 7 ]

186 голосов
/ 17 мая 2009

Вы можете использовать опцию 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);
        }

    });
});

Вы можете поиграть с атрибутами left и 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;
}

А вот фоновое изображение, которое вам нужно:

alt text
(источник: scriptiny.com )

Если вы хотите, чтобы сообщение об ошибке отображалось после группы параметров или полей. Затем сгруппируйте все эти элементы внутри одного контейнера в «div» или «fieldset». Например, добавьте специальный класс для всех групп. И добавьте следующее в начало функции 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%.


Я попробовал твой код, и он прекрасно работает для меня. Вот предварительный просмотр: alt text

Я только что сделал очень маленькую настройку для заполнения сообщения, чтобы оно поместилось в строке:

div.error {
    padding: 2px 5px;
}

Вы можете изменить эти числа, чтобы увеличить / уменьшить отступ сверху / снизу или влево / вправо. Вы также можете добавить высоту и ширину к сообщению об ошибке. Если у вас все еще есть проблемы, попробуйте заменить span на 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 */
}

О пустой странице. Как я уже сказал, я попробовал ваш код, и он работает для меня. Это может быть что-то другое в вашем коде, который вызывает проблему.

3 голосов
/ 16 мая 2009

Я использую jQuery BeautyTips , чтобы добиться эффекта маленького пузыря, о котором вы говорите. Я не использую плагин Validation, поэтому я не могу там сильно помочь, но его очень легко стилизовать и показать подсказки по красоте. Вы должны посмотреть на это. Боюсь, это не так просто, как просто правила CSS, поскольку вам нужно использовать элемент canvas и включить дополнительный файл javascript для IE, чтобы с ним было приятно играть.

2 голосов
/ 28 мая 2010

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

errorPlacement:function(error,element) {
    if (element.attr("id") == "special_element") {
        // special align
    } else { // default error scheme
        error.insertAfter(element);
    }
}
2 голосов
/ 09 февраля 2010

К сожалению, я не могу комментировать мою репутацию новичка, но у меня есть решение проблемы с тем, что экран пуст, или, по крайней мере, это то, что сработало для меня. Вместо установки класса оболочки внутри функции 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 следует удалить вместо всех. Работал на меня, но я не совсем уверен, почему, так что, если кто-то может уточнить, это может помочь другим тонну.

2 голосов
/ 21 мая 2009

Несколько вещей:

Во-первых, я не думаю, что вам действительно нужна ошибка проверки для радиополя, потому что вы можете просто установить одно из полей по умолчанию. Большинство людей предпочитают что-то исправить, а потом что-то предоставить. Например:

   Age: (*) 12 - 18 | () 19 - 30 | 31 - 50 

с большей вероятностью будет изменен на правильный ответ, так как человек НЕ ХОЧЕТ, чтобы он пошел по умолчанию. Если они видят это пустым, они, скорее всего, подумают «не ваше дело» и пропустят это.

Во-вторых, я смог получить желаемый эффект без каких-либо свойств позиционирования. Вы просто добавляете padding-right в форму (или в div формы, что угодно), чтобы обеспечить достаточно места для вашей ошибки и убедиться, что ваша ошибка будет соответствовать этой области. Затем у вас есть предварительно настроенный класс css, называемый «error», и вы устанавливаете его как имеющий отрицательный margin-top, примерно равный высоте вашего поля ввода, и поле left-left относительно расстояния слева до места, где находится отступ справа должен начать. Я попробовал это, это не здорово, но он работает с тремя свойствами и не требует плавающих или абсолютных значений:

   <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>
1 голос
/ 20 октября 2014

Добавьте следующий CSS в ваш метод .validate, чтобы изменить CSS или функциональность

 errorElement: "div",
    wrapper: "div",
    errorPlacement: function(error, element) {
        offset = element.offset();
        error.insertAfter(element)
        error.css('color','red');
    }
0 голосов
/ 14 мая 2009

Если бы вы могли указать причину, по которой вам нужно заменить метку на div, это, безусловно, помогло бы ...

Кроме того, не могли бы вы вставить полезный образец (http://dpaste.com/ или http://pastebin.com/)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...