2009-12-04 43 views
5

Tôi đang thử sử dụng một số hộp kiểm asp.net trên một trang, vô hiệu hóa chúng cho phù hợp.Hộp kiểm không hoạt động đúng với IE với jquery

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

về javascript, Tôi đang sử dụng đoạn mã sau

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

Bây giờ là các hộp kiểm bên bị vô hiệu hóa khi trang web được tải, phần removeAttr không hoạt động. Tôi đã cố gắng bước qua trình gỡ rối và logic hoạt động hoàn toàn tốt. Nếu các hộp kiểm không bị tắt khi tải trang, mã hoạt động tốt. Tôi đã thử thay thế 'thuộc tính' bị vô hiệu hóa bằng 'kiểm tra' để xem các thuộc tính khác có hoạt động tốt hay không và nó hoạt động hoàn toàn tốt. Tôi đã thử

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

nhưng nó cũng không hoạt động.

Lưu ý: Nó hoạt động hoàn hảo trên FF và Chrome nhưng không hoạt động trong IE.

Xin cảm ơn,

+0

Vui lòng xem http://www.artzstudio.com/2009/04/jquery-performance-rules/#cache-jquery-objects để dọn dẹp cho vòng lặp. Làm cho kịch bản của bạn không cần thiết chậm bằng cách thực hiện việc kiểm tra này i <$ ("input [id * = hdnParentMenuItemID]"). Đặt $ ("input [id * = hdnParentMenuItemID]") vào một biến cục bộ và cũng đặt thuộc tính length vào một biến cục bộ. – nickytonline

Trả lời

12

Tôi đã gặp sự cố tương tự khi bật <asp:CheckBox /> trong Internet Explorer bằng jQuery. Các mã sau đây làm việc hoàn toàn tốt trong FireFox.

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

Tuy nhiên, nó không hoạt động đúng trong IE.

An <asp:CheckBox /> được hiển thị dưới dạng <span /> với <input /> và thẻ <label />. Khi hộp kiểm bị tắt cả khoảng cách và thẻ đầu vào được trang trí với thuộc tính bị tắt. Để có được hành vi mong đợi, tôi đã sử dụng mã sau:

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

Cảm ơn bạn đã giải pháp! Tôi đã thực sự lúng túng với IE về hành vi này, cho đến khi tôi tìm ra lý do tại sao họ đặt thuộc tính bị vô hiệu hóa trên thẻ span, đó là vì nó làm cho nó rõ ràng hơn rằng hộp kiểm bị vô hiệu hóa nếu văn bản đi kèm nó được chuyển sang màu xám. – Jagd

+0

Cảm ơn bạn rất nhiều. Nó đã cho tôi mãi mãi. – Richard77

+0

Tôi đã kéo tóc ra. Cảm ơn bạn. –

0

Điều này nên rõ ràng. làm việc

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

Điều này sẽ không hoạt động. Miễn là thuộc tính expando bị vô hiệu hóa có một giá trị hoặc thuộc tính disabled có giá trị, nó sẽ vẫn bị vô hiệu hóa. ví dụ. . Bạn cần phải giải thích loại bỏ thuộc tính bị vô hiệu hóa. Xem câu trả lời của Joel Potter. – nickytonline

+0

'$ ('#' + childID) [0]' là tham chiếu đến một phần tử DOM thực tế, phải không? Nếu vậy, thiết lập thuộc tính 'disabled' chắc chắn sẽ hoạt động.Không cần phải làm gì cho thuộc tính. –

+0

@Tim Down: thực sự là vậy. @nickyt: javascript xử lý các thuộc tính như 'disabled' và' checked' nguyên bản như thế này. các thuộc tính và giá trị của chúng không phải là ánh xạ 1: 1 đơn giản cho các thuộc tính HTML. –

0

Bạn muốn một câu lệnh if như thế này

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

Có vô số selectors dư thừa ở đây sẽ được làm chức năng này rất kém hiệu quả. Đầu tiên, các truy vấn đang chạy cho các bộ chọn là rất chậm so với phần còn lại của mã, do đó, lưu vào bộ nhớ cache kết quả của bộ chọn của bạn và làm việc trên đó. Ngoài ra, bạn nên khai báo i với toán tử var để làm cho địa phương trở thành chức năng của bạn. Và không cần jQuery để lấy một phần tử bằng ID của nó hoặc những thứ khó hiểu sâu sắc để có được và thiết lập trạng thái vô hiệu hóa của nó, có thể được thực hiện đơn giản hơn nhiều với thuộc tính boolean DOM disabled. Tất cả những gì đã nói, tôi không thực sự biết tại sao mã của bạn không hoạt động, nhưng làm cho nó dễ đọc và đơn giản chắc chắn sẽ giúp ích.

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

Tôi nghĩ rằng bạn có nghĩa là 'đầu vào = đầu vào [i]' – Joel

+0

Thật vậy, tôi cảm ơn. Đã sửa. –

+0

Sẽ không sử dụng $ (...). Mỗi (...) sạch hơn vòng lặp for? –

Các vấn đề liên quan