2009-12-04 12 views
5

Estoy intentando usar varias casillas asp.net en una página, deshabilitándolas en consecuencia.La casilla de verificación no funciona correctamente para IE con jquery

<asp:CheckBox ID='chkMenuItem' runat='server' CssClass='HiddenText' Text='Test'  onclick='<%#String.Format("checkChild({0});", Eval("id")) %>' /> 

en Javascript, estoy usando el siguiente código

function checkChild(id) { 
      for (i = 0; i < $("input[id*=hdnParentMenuItemID]").length; i++) { 
       if ($('input[id*=hdnParentMenuItemID]')[i].value.split(':')[0] == id) { 
        var childID = $('input[id*=hdnParentMenuItemID]')[i].value.split(':')[1]; 
        if ($("#" + childID).attr("disabled")) 
        //$("#" + childID).attr('disabled', ''); 
         $("#" + childID).removeAttr("disabled"); 
        else 
         $("#" + childID).attr('disabled', true); 
       } 
      } 
     } 

Ahora es las casillas de verificación están desactivadas una vez que se carga la página, la sección removeAttr no funciona. Traté de pasar por el depurador y la lógica funciona perfectamente bien. Si las casillas de verificación no están deshabilitadas en la carga de la página, el código funciona bien. Traté de reemplazar los 'atributos' desactivados por 'verificado' para ver si los otros atributos funcionan bien y funcionan perfectamente bien. Intenté

$("#" + childID).attr('disabled', ''); 

pero tampoco funcionó.

Nota: Funciona perfectamente en FF y Chrome, pero no funciona en IE.

Gracias,

+0

Por favor, vea http://www.artzstudio.com/2009/04/jquery-performance-rules/#cache-jquery-objects para limpiar su en bucle. Si hace que su script se ralentice innecesariamente, compruebe i <$ ("input [id * = hdnParentMenuItemID]"). Length. Coloque $ ("input [id * = hdnParentMenuItemID]") en una variable local y también ponga la propiedad length en una variable local. – nickytonline

Respuesta

12

que tenían problemas similares que permitan una <asp:CheckBox /> en Internet Explorer utilizando jQuery. El siguiente código funcionó perfectamente bien en Firefox.

$('myCheckBox').removeAttr('disabled'); 

Sin embargo, no funcionó correctamente en IE.

Se representa <asp:CheckBox /> como <span /> con <input /> y <label />. Cuando la casilla de verificación está desactivada, las etiquetas de entrada y de entrada están decoradas con el atributo desactivado. Para obtener el comportamiento esperado Solía ​​el siguiente código:

$('myCheckBox').removeAttr('disabled'); 
$('myCheckBox').closest('span').removeAttr('disabled'); 
+0

¡Gracias por la solución! Realmente me molestó IE por este comportamiento, hasta que descubrí por qué colocan el atributo disabled en la etiqueta span, que es porque hace que sea más obvio que la casilla de verificación está desactivada si el texto que la acompaña también está atenuado. – Jagd

+0

Muchas gracias. Me llevó para siempre. – Richard77

+0

Estaba tirando de mi cabello. Gracias. –

0

Esto debería def. trabaja

$('#' + childID)[0].disabled = false; 
+0

Esto no funcionará. Mientras la propiedad expandida deshabilitada tenga un valor o el atributo deshabilitado tenga un valor, permanecerá desactivado. p.ej. . Necesita eliminar explícitamente el atributo deshabilitado. Vea la respuesta de Joel Potter. – nickytonline

+0

'$ ('#' + childID) [0]' es una referencia a un elemento DOM real, ¿verdad? Si es así, establecer la propiedad 'disabled' ciertamente funcionará.No hay necesidad de hacer nada con el atributo. –

+0

@Tim Down: de hecho lo es. @nickyt: javascript maneja propiedades como 'disabled' y' checked' de esta manera. las propiedades y sus valores no son una simple asignación 1: 1 a los atributos HTML. –

0

¿Quieres una sentencia if como esta

if ($("#" + childID + ":disabled").length) // is childID disabled? 
    $("#" + childID).removeAttr("disabled"); // enable it 
else 
    $("#" + childID).attr('disabled', 'disabled'); // disable it 
0

Hay un montón de selectores redundantes aquí que vayan a establecer esta función muy ineficiente. En primer lugar, la ejecución de consultas para selectores es muy lenta en relación con el resto del código, de modo que guarde en caché el resultado de su selector y trabaje en eso. Además, debe declarar i con el operador var para que sea local para su función. Y no hay necesidad de que jQuery obtenga un elemento por su ID o esas cosas profundamente confusas para obtener y establecer su estado desactivado, lo que se puede hacer mucho más simplemente con la propiedad booleana DOM disabled. Dicho todo esto, realmente no sé por qué tu código no funciona, pero hacerlo legible y simple definitivamente ayudará.

function checkChild(id) { 
    var input, checkBox, parts, inputs = $("input[id*=hdnParentMenuItemID]"); 
    for (var i = 0, len = inputs.length; i < len; i++) { 
     input = inputs[i]; 
     parts = input.value.split(':'); 
     if (parts[0] == id) { 
      checkBox = document.getElementById(parts[1]); 
      checkBox.disabled = !checkBox.disabled; 
     } 
    } 
} 
+0

Creo que quieres decir 'input = inputs [i]' – Joel

+0

De hecho, gracias. Fijo. –

+0

¿No usaría $ (...). Cada uno (...) sería más limpio que el bucle for? –

Cuestiones relacionadas