2010-06-23 24 views
12

Estoy tratando de encontrar un complemento de casilla de verificación de tres estados. Sin embargo, cada complemento que encuentro depende de una jerarquía (como una estructura de carpetas) de elementos. Solo tengo un elemento de casilla de verificación único que quiero hacer una casilla de verificación de tres vías.JQuery - TriState CheckBox

¿Alguien sabe de un plugin jquery que hará esto? Estoy realmente sorprendido de que no haya encontrado uno que funcione en http://plugins.jquery.com/.

Gracias por su contribución.

+3

¿Cuál es el tercer estado, [FileNotFound] (http://thedailywtf.com/Articles/What_Is_Truth_0x3f_.aspx)? – R0MANARMY

+2

Los tres estados son nulos, verdaderos y falsos. – user336786

+0

Tal vez [este] (http://stackoverflow.com/questions/1726096/tri-state-check-box-in-html/1727191#1727191) pregunta dará algunas pistas –

Respuesta

1

me encontré con el mismo problema: lo necesitaba para mostrar: activar/desactivar/ignorar

Basado en los iconos a vailable en jquery ui() creé siguiente código (Sé que no es un plug-in, pero que no era necesario en mi caso):

El HTML que uso es:

<input type="text" class="rotatestate" value="true" 
data-state-style="cursor:pointer" 
data-state-class="ui-icon" 
data-state-values='[{"value":"true","class":"ui-icon-check","title":"title for true"},{"value":"false","class":"ui-icon-radio-off","title":"title for off"},{"value":"null","class":"ui-icon-cancel","title":"title for third state"}]'/> 

El control se realiza el JSON matriz en-estado-valores de datos para mayor cantidad de estados que desea girar a través de:

  • valor: el valor que se introducirá en la entrada
  • clases: clase CSS (es) que el nuevo tramo se tener
  • título: un título opcional que se encuentra en el lapso creado

Es, básicamente, crea un elemento <span class="data-state-class + classOfState" title="titleOfState"> y al hacer clic actualiza por cacling a través de la lista de valores dado.

Lo codifiqué para que incluso permita el cambio a través de otros medios (es decir, establezca el valor de la entrada directamente) y actualice el "control" cuando $ ("input"). Change(); evento se desencadena.

El código jQuery que lo maneja:

/* rotatestate stontrol */ 
$("input.rotatestate", location).each(function(){ 
    var states = $(this).attr("data-state-values"); 
    var defaultClass = $(this).attr("data-state-class"); 
    // no need to continue if there are no states 
    if(!states) { 
     return; 
    } 

    try { 
     states = JSON.parse(states); 
    } catch (ex) { 
     // do not need to continue if we cannot parse the states 
     return; 
    } 

    var stateControl = $("<span></span>"); 
    if($(this).attr("data-state-style")) { 
     stateControl.attr("style", $(this).attr("data-state-style")); 
    } 
    stateControl.data("states", states); 
    stateControl.data("control", this); 
    stateControl.data("activeState", null); 
    $(this).data("control", stateControl); 
    if(defaultClass) { 
     stateControl.addClass(defaultClass); 
    } 

    // click on the control starts rotating 
    stateControl.click(function(){ 
     var cState = $(this).data().activeState; 
     var cStates = $(this).data().states; 
     var control = $(this).data().control; 
     var newState = null; 

     if(cState != null) { 
      // go to the 'next' state 
      for(var i = 0; i < cStates.length; i++) { 
       if(cStates[i].value === cState.value) { 
        // last element 
        if(i === cStates.length - 1) { 
         newState = cStates[0]; 
        } else { 
         newState = cStates[i+1]; 
        } 
        break; 
       } 
      } 
     } else { 
      // no state yet - just set the first 
      newState = cStates[0]; 
     } 

     $(control).attr("value", newState.value); 
     // trigger change 
     $(control).change(); 
    }); 

    // make sure to update state if the value is changed 
    $(this).change(function(){ 
     var control = $($(this).data().control); 
     var cState = control.data().activeState; 
     var cStates = control.data().states; 

     if(cState != null) { 
      // remove "old state" 
      control.removeClass(cState['class']); 
     } 

     // add new State 
     var val = $(this).val(); 
     $.each(cStates, function(){ 
      if(this.value === val) { 
       control.data().activeState = this; 
       if(this.title) { 
        control.attr("title", this.title); 
       } 
       control.addClass(this['class']); 
       return false; 
      } 
     }); 
    }); 

    // trigger initial state 
    $(this).change(); 
    $(this).after(stateControl); 
    $(this).hide(); 
}); 

El control también es parte de mi Controles de Formulario Biblioteca de https://github.com/corinis/jsForm/wiki/Controls.

6

Algunas de estas respuestas están un poco desactualizadas desde que jQuery rehizo su sitio de complementos.

Las casillas de verificación "Tristate" (indeterminadas) se crean directamente en JavaScript, y es fácil establecerlas en ese estado simplemente estableciendo una propiedad en ellas.Más información: http://css-tricks.com/indeterminate-checkboxes/

$("#some-checkbox").prop("indeterminate", true);

Hay un plugin disponible aquí en el nuevo sitio plugin de jQuery que proporciona esa funcionalidad: http://plugins.jquery.com/tristate-checkbox/

Los tres estados se comprueban, sin control, e indeterminado. Proporcionó un estado indeterminado dependiendo de si todas las casillas de verificación secundarias están marcadas o no.

0

ver mi respuesta a Tri-state Check box in HTML?:

Mi propuesta sería utilizar

  • tres caracteres Unicode apropiadas para los tres estados por ejemplo, & # x2753;, & # x2705;, & # x274C;
  • un campo de entrada de texto sin formato (tamaño = 1)
  • ninguna frontera
  • sólo lectura
  • pantalla hay cursor
  • onclick para alternar a través de los tres estados

ver ejemplos en:

fuente HTML:

<input type='text' 
     style='border: none;' 
     onfocus='this.blur()' 
     readonly='true' 
     size='1' 
     value='&#x2753;' onclick='tristate_Marks(this)' /> 

o como Javascript en línea:

<input style="border: none;" 
     id="tristate" 
     type="text" 
     readonly="true" 
     size="1" 
     value="&#x2753;" 
     onclick="switch(this.form.tristate.value.charAt(0)) { 
     case '&#x2753': this.form.tristate.value='&#x2705;'; break; 
     case '&#x2705': this.form.tristate.value='&#x274C;'; break; 
     case '&#x274C': this.form.tristate.value='&#x2753;'; break; 
     };" /> 

código fuente Javascript:

<script type="text/javascript" charset="utf-8"> 
    /** 
    * loops thru the given 3 values for the given control 
    */ 
    function tristate(control, value1, value2, value3) { 
    switch (control.value.charAt(0)) { 
     case value1: 
     control.value = value2; 
     break; 
     case value2: 
     control.value = value3; 
     break; 
     case value3: 
     control.value = value1; 
     break; 
     default: 
     // display the current value if it's unexpected 
     alert(control.value); 
    } 
    } 
    function tristate_Marks(control) { 
    tristate(control,'\u2753', '\u2705', '\u274C'); 
    } 
    function tristate_Circles(control) { 
    tristate(control,'\u25EF', '\u25CE', '\u25C9'); 
    } 
    function tristate_Ballot(control) { 
    tristate(control,'\u2610', '\u2611', '\u2612'); 
    } 
    function tristate_Check(control) { 
    tristate(control,'\u25A1', '\u2754', '\u2714'); 
    } 

</script>