jQuery переопределить отображение сообщения об ошибке проверки по умолчанию (Css) Всплывающее окно / всплывающая подсказка, например

Я пытаюсь обойти стандартную метку сообщения об ошибке с помощью 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;  
    }

ОБНОВИТЬ:

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

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>

person Phill Pafford    schedule 13.05.2009    source источник
comment
Не могли бы вы также добавить свой код HTML-формы? На одном только javascript сложно сказать, почему радио не работает.   -  person Nadia Alramli    schedule 20.05.2009
comment
Я добавил более подробную информацию с предварительным просмотром к моему ответу. Код действительно рабочий. Если вы хотите настроить сообщение об ошибке, вы можете добавить еще CSS, но основы все есть.   -  person Nadia Alramli    schedule 20.05.2009
comment
О том, что страница становится пустой при вводе значений. Я не думаю, что это имеет какое-либо отношение к предложенным мною изменениям. Если вы удалите функцию errorPlacement, вы все равно получите пустую страницу? если да, то проблема больше не связана с этим вопросом. Невозможно сказать, что происходит, не видя самой страницы. Или получить более подробную информацию. Ваш пример отлично работает для меня. Проблема, вероятно, связана с неперехваченной ошибкой javascript где-то еще.   -  person Nadia Alramli    schedule 22.05.2009
comment
Я удалил функцию errorPlacement, и она отлично работает без нее. Я в растерянности, потому что хочу использовать то, что вы предоставили, но оно работает некорректно.   -  person Phill Pafford    schedule 22.05.2009
comment
хм, попробуйте добавить предупреждение в функцию errorPlacement и посмотрите, будет ли она вызываться, когда страница становится пустой. Если это не помогло, оберните внутреннюю часть функции в try / catch. Вот так: попробуйте {/ * код * /} catch (e) {alert (e);}   -  person Nadia Alramli    schedule 22.05.2009
comment
Я также заметил, что в error.insertBefore (element) отсутствует; в конце. Измените его на error.insertBefore (element); в противном случае он может не работать в IE   -  person Nadia Alramli    schedule 22.05.2009
comment
Если вы используете firefox, попробуйте использовать firebug для отладки выполнения кода. Добавьте точку остановки в функции размещения ошибок и посмотрите, не что-то пойдет не так.   -  person Nadia Alramli    schedule 22.05.2009
comment
спасибо за вашу помощь. Я использовал часть кода, который вы предоставили, и, пытаясь что-то получить, я использовал что-то попроще. Но я думаю, что это отсутствующая функция в подключаемом модуле проверки для jQuery. Возможно, вы захотите подумать о создании подключаемого модуля, который имеет два или более варианта отображения (разные CSS и размещение элементов), которые пользователи будут использовать с подключаемым модулем проверки. -в. Кстати, хороший блог будет проверять это с этого момента, чтобы увидеть, что нового. Еще раз спасибо за вашу помощь в этом :)   -  person Phill Pafford    schedule 22.05.2009


Ответы (7)


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

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

alt text
(источник: 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%.


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

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

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 */
}

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

person Nadia Alramli    schedule 16.05.2009
comment
Спасибо, мне нравится опция errorPlacement, но CSS - это то, что я ищу. Если вы посмотрите на две приведенные мной ссылки в качестве примера, я хотел, чтобы что-то выглядело так. Еще раз спасибо. - person Phill Pafford; 18.05.2009
comment
также еще одна вещь, когда у меня есть группа радио или флажков, div с ошибкой отображается над некоторыми параметрами, которые мне нужно выбрать. есть ли способ отобразить после группы? - person Phill Pafford; 19.05.2009
comment
Я расширил ответ еще немного. Если вы будете следовать инструкциям, то получите желаемый результат. - person Nadia Alramli; 19.05.2009
comment
Обновил мой код выше, пожалуйста, просмотрите, и все очень близко к тому, что я хотел бы. Спасибо :) - person Phill Pafford; 20.05.2009
comment
добавил HTML, извините за это :) - person Phill Pafford; 20.05.2009
comment
используя плагин проверки с вашим кодом, я нажимаю "Отправить", и всплывающие окна появляются, как ожидалось, но когда я перехожу к вводу значений, чтобы всплывающие окна исчезли, вся моя страница становится пустой. любая идея относительно того, почему? - person Phill Pafford; 20.05.2009
comment
Всплывающий дисплей работает хорошо, спасибо, но когда я ввожу значение в текстовое поле, вся страница становится пустой. Есть мысли, почему? - person Phill Pafford; 22.05.2009
comment
Не знаю, заинтересованы ли вы в помощи, но я нашел этот плагин jQuery с тем, что я ищу в смысле CSS: position-absolute.com/articles/ Хотел узнать, как объединить всплывающее окно CSS с плагин проверки, который я использую вместо этого. Мне нравится, что он плавает над элементом и выглядит как пузырь. Еще раз спасибо за любую помощь в этом - person Phill Pafford; 02.06.2009
comment
@ Фил, я бы хотел помочь. Но лучше выложить это как другой вопрос. В основном потому, что если я больше отредактирую этот пост, он станет вики сообщества. И комментарии не подходят для ответов. Также публикация этого как еще одного вопроса привлечет больше внимания и возможных лучших решений. При первом взгляде на опубликованную вами ссылку кажется, что они делают сложный взлом, чтобы отобразить стрелку. Должен быть способ сделать это лучше. - person Nadia Alramli; 02.06.2009
comment
@ Надя - вау, ты действительно опубликовал здесь отличный ответ. Это очень помогло мне с аналогичной проблемой, которая у меня была. Я действительно впечатлен вашим пониманием CSS и jQuery. Хороший вклад !! - person David Robbins; 02.07.2009
comment
Позиционирование относительно документа в вашем примере, если это модальное всплывающее окно или подобное, оно не будет работать. Я использовал это для решения этой проблемы: error.css('left', $(element).position().left + $(element).width() + 10); error.css('top', $(element).position().top); - person kiteloop; 28.06.2011
comment
Эти сообщения об ошибках не меняются при изменении размера окна. Есть ли способ закодировать это решение, чтобы сообщения относились к входному элементу, который они представляют? - person Austyn Mahoney; 31.08.2011
comment
У кого-нибудь есть обновленная ссылка на фоновое изображение msg_arrow.gif? Или даже пример того, как это выглядело? - person Jacob Stamm; 20.09.2016

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

person Paolo Bergantino    schedule 15.05.2009
comment
Или, если вы не хотите иметь возможность быстро настраивать цвета пузыря, вы можете использовать фоновое изображение, как во втором примере. - person Paolo Bergantino; 16.05.2009
comment
Я просматриваю советы по красоте, но не могу заставить его работать с плагином проверки с отображением ошибки. Есть другие мысли? - person Phill Pafford; 18.05.2009

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

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

   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>
person Anthony    schedule 21.05.2009
comment
Благодарим за ответ, но клиент хотел бы, чтобы переключатель оставался пустым и заставлял пользователя выбирать вариант. Я посмотрю на ваш CSS :) - person Phill Pafford; 21.05.2009
comment
Мне это нравится, кроме радио и флажков, не могли бы вы это допустить? - person Phill Pafford; 21.05.2009
comment
это не отображается правильно в IE6 (пока не проверял другие версии) - person Phill Pafford; 22.05.2009
comment
Что касается радио и флажков, это зависит от того, есть ли у вас группа полей (набор полей) или только один. Если это группа, я предлагаю установить ширину набора полей так, чтобы он оставил упомянутое ранее заполнение, а затем иметь ваш флаг ошибки, указывающий на все это, возможно, даже добавить класс в набор полей, чтобы он получал границу, когда он имеет флаг, поэтому пользователь знает, что вы имеете в виду эту группу .... - person Anthony; 22.05.2009
comment
Но на самом деле вам не нужен флаг для одного флажка, поскольку это не имеет смысла. Что, если ответ на коробку отрицательный, значит, дело все равно сделано. Если у вас есть группа полей, и им нужно отметить как минимум два, то опять же, ошибка будет для набора полей, а не для поля. - person Anthony; 22.05.2009
comment
Что-то вроде: ‹fieldset› ‹legend› Хобби ‹/legend› ‹ярлык для = рыбалка› Рыбалка ‹/label› ‹тип ввода = флажок id = значение рыбалки = рыбалка /› ‹ярлык для = тыкания› Poking ‹/label› ‹Input type = checkbox id = poking value = poking /› ‹/fieldset› Затем укажите ошибку для всей группы, а не для одного поля. - person Anthony; 22.05.2009
comment
Насчет IE6 как выключен? У меня нет IE6, поэтому я могу только представить. Мои числа были немного потрепанными, потому что я не устанавливал конкретные значения высоты и ширины для входных данных, наборов полей и т. Д. Так что более точная информация может исправить это, в зависимости от проблемы. Опять же, моя компания (университет) как официальное лицо заявила, что больше не будет делать приспособлений для IE6 (то есть обратная совместимость не будет приниматься во внимание для IE6). Я думаю, что в течение следующего года или около того эта позиция будет почти повсеместной. - person Anthony; 22.05.2009
comment
Я использую атрибут name для группировки радиомодулей / флажков, это сработает? - person Phill Pafford; 22.05.2009
comment
Вы используете имя, чтобы сгруппировать их вместе как данные для сценария, который обрабатывает данные (и для JS), но вы должны использовать элемент fieldset для группировки входных данных, как оболочку. Попробуйте, большинство браузеров автоматически ставят рамку вокруг наборов полей, что приятно. - person Anthony; 22.05.2009

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

person Community    schedule 08.02.2010

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

errorPlacement:function(error,element) {
    if (element.attr("id") == "special_element") {
        // special align
    } else { // default error scheme
        error.insertAfter(element);
    }
}
person Rodrigo    schedule 27.05.2010

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

 errorElement: "div",
    wrapper: "div",
    errorPlacement: function(error, element) {
        offset = element.offset();
        error.insertAfter(element)
        error.css('color','red');
    }
person ajaysoni98292    schedule 20.10.2014

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

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

person weisjohn    schedule 14.05.2009
comment
действие по умолчанию - разместить метку рядом с элементом с ошибкой, это приведет к смещению элементов справа от элемента ошибки. хотел, чтобы элемент ошибки отображался как всплывающая подсказка, например всплывающее окно, которое парит / плавает над другими элементами. - person Phill Pafford; 14.05.2009
comment
Извините, не думаю, что я мог бы опубликовать изображение div с ошибкой, которое я хочу, но в двух приведенных выше примерах есть что-то похожее на то, что я хотел бы. Спасибо - Фил - person Phill Pafford; 14.05.2009