jQuery override default validation error message display (Css) Popup/Tooltip like


Estoy tratando de sobrepasar la etiqueta del mensaje de error predeterminado con un div en lugar de una etiqueta. He mirado este post también y sé cómo hacerlo, pero mis limitaciones con CSS me están atormentando. ¿Cómo puedo mostrar esto como algunos de estos ejemplos:

Ejemplo # 1 (Dojo) - Debe escribir una entrada no válida para ver la visualización del error
Ejemplo #2

Aquí hay un código de ejemplo que anula la etiqueta de error a un elemento div

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

Ahora estoy en una pérdida en la parte css pero aquí está:

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;  
    }

ACTUALIZACIÓN:

Bien, estoy usando este código ahora, pero la imagen y la ubicación en la ventana emergente es más grande que el borde, ¿se puede ajustar esto para que sea dinámico es la altura?

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));
}

El css es el mismo que el siguiente (su código 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>
Author: Community, 2009-05-13

7 answers

Puede usar la opción errorPlacement para anular la visualización del mensaje de error con poco css. Porque css por sí solo no será suficiente para producir el efecto que necesita.

$(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);
        }

    });
});

Puede jugar con los atributos css izquierdo y superior para mostrar el mensaje de error en la parte superior, izquierda, derecha o inferior del elemento. Por ejemplo, para mostrar el error en la parte superior:

    errorPlacement: function(error, element) {
        element.before(error);
        offset = element.offset();
        error.css('left', offset.left);
        error.css('top', offset.top - element.outerHeight());
    }

Y así sucesivamente. Puede consultar la documentación de jQuery sobre css para obtener más opciones.

Aquí está el css que usé. El resultado se ve exactamente igual que el que desea. Con el menor CSS posible:

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;
}

Y aquí está la imagen de fondo que necesita:

Texto alternativo http://sandbox.scriptiny.com/messages/images/msg_arrow.gif

Si desea que el mensaje de error se muestre después de un grupo de opciones o campos. Luego agrupa todos esos elementos dentro de un contenedor como 'div' o 'fieldset'. Añadir una clase especial a todos ellos 'grupo' por ejemplo. Y añádase lo siguiente al principio de la función errorPlacement:

errorPlacement: function(error, element) {
    if (element.hasClass('group')){
        element = element.parent();
    }
    ...// continue as previously explained

Si solo desea manejar casos específicos, puede usar attr en su lugar:

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

Eso debería ser suficiente para que el mensaje de error se muestre junto al elemento padre.

Es posible que deba cambiar el ancho del elemento padre para que sea inferior al 100%.


He probado su código y está funcionando perfectamente bien para mí. Aquí hay una vista previa: texto alt

Acabo de hacer un pequeño ajuste a la relleno de mensaje para que quepa en la línea:

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

Puede cambiar esos números para aumentar/disminuir el relleno en la parte superior/inferior o izquierda/derecha. También puede agregar un alto y un ancho al mensaje de error. Si todavía tiene problemas, intente reemplazar el span con un 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>

Y luego dar al contenedor un ancho (esto es muy importante)

div.group {
    width: 50px; /* or any other value */
}

Acerca de la página en blanco. Como dije, probé tu código y está funcionando para mí. Podría ser algo más en tu código eso está causando el problema.

 186
Author: Nadia Alramli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-21 15:53:15

Uso jQuery BeautyTips para lograr el pequeño efecto de burbuja del que estás hablando. Yo no uso el plugin de validación, así que realmente no puedo ayudar mucho allí, pero es muy fácil de estilo y mostrar la BeautyTips. Deberías investigarlo. No es tan simple como las reglas CSS, me temo, ya que necesita usar el elemento canvas e incluir un archivo javascript adicional para que IE juegue bien con él.

 3
Author: Paolo Bergantino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-15 22:58:42

Algunas cosas:

Primero, no creo que realmente necesite un error de validación para un radio fieldset porque solo podría tener uno de los campos marcados por defecto. La mayoría de la gente preferiría corregir algo y luego proporcionar algo. Por ejemplo:

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

Es más probable que se cambie a la respuesta correcta, ya que la persona NO quiere que vaya a la predeterminada. Si lo ven en blanco, es más probable que piensen que" no es asunto suyo " y lo omitan.

Segundo, fui capaz de obtenga el efecto que creo que desea sin ninguna propiedad de posicionamiento. Solo tiene que añadir relleno-derecho al formulario (o el div del formulario, lo que sea) para proporcionar suficiente espacio para su error y asegurarse de que su error se ajuste en esa área. Luego, tiene una clase css preestablecida llamada "error" y la establece como que tiene un margen-top negativo aproximadamente la altura de su campo de entrada y un margen-left aproximadamente la distancia desde la izquierda hasta donde debe comenzar su relleno-right. Probé esto, no es genial, pero funciona con tres propiedades y no requiere flotadores o absolutos:

   <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>
 2
Author: Anthony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-21 09:31:04

Desafortunadamente no puedo comentar con mi reputación de novato, pero tengo una solución para el problema de que la pantalla se quede en blanco, o al menos esto es lo que funcionó para mí. En lugar de establecer la clase wrapper dentro de la función errorPlacement, establézcala inmediatamente cuando esté configurando el tipo wrapper.

$('#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);
    }

});

Asumo que hacerlo de esta manera le permite al validador saber qué elementos div eliminar, en lugar de todos ellos. Funcionó para mí, pero no estoy del todo seguro de por qué, así que si alguien podría elaborar que podría ayudar a otros un montón.

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-08 22:23:56

Esa respuesta realmente me ayudó, en mi caso tuve que filtrar algunos elementos y tener especial alineación en su div error,

errorPlacement:function(error,element) {
    if (element.attr("id") == "special_element") {
        // special align
    } else { // default error scheme
        error.insertAfter(element);
    }
}
 2
Author: Rodrigo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-04 04:22:12

Agregue el siguiente css a su.validar método para cambiar el css o funcionalidad

 errorElement: "div",
    wrapper: "div",
    errorPlacement: function(error, element) {
        offset = element.offset();
        error.insertAfter(element)
        error.css('color','red');
    }
 1
Author: ajaysoni98292,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-20 05:15:17

Si pudiera proporcionar alguna razón de por qué necesita reemplazar la etiqueta con un div, eso sin duda ayudaría...

También, podría pegar una muestra de que sería útil ( http://dpaste.com/ o http://pastebin.com/)

 0
Author: weisjohn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-05-14 08:29:51