3

以下代码段已使用 chrome 23、firefox 3.5 和 IE9 进行了测试:

<!DOCTYPE html>
<html><head>
      <title>test</title>
      <script src="jquery-1.7.2.min.js"></script>
      <script>
          $(function() {
              $('#id1 *').not('.c1 *').attr('disabled', true);
          });
      </script>
</head><body>
      <div id="id1">
            <div class="c1">
                <input type=radio>td1</input>
            </div>
            <div class="c2">
                <input type=radio>td2</input>
            </div>
      </div>
</body></html>

只有 td2 应该被禁用,但是通常的嫌疑人 (IE9) 会禁用 td1 和 td2。
你将如何解决这个问题?

回答
实际上问题不是由于 jquery 选择器,而是当一个元素在 IE9 中获得“禁用”属性时,所有子元素都被禁用。然而,这在 Chrome 和 FF 中不会发生(至少对于上述版本)。
更多信息在这里: 禁用的“div”应该如何行动?

4

3 回答 3

4

试试这个选择器:

$('#id1 :not(.c1) input').attr('disabled', true);

http://jsfiddle.net/QTG7S/


您写的内容可能应该像这样重写:

$('#id1 *').not('.c1').find("*").attr('disabled', true);

http://jsfiddle.net/QTG7S/2/

于 2012-12-20T13:47:52.533 回答
1

IE 可能正在做正确的事情:

  • $('#id1 *')选择里面的所有标签#id1,给你两个 div 和两个输入标签
  • .not('.c1 *')从上面的列表中删除输入标签.c1,你最终得到三个元素:两个 div 和一个输入
  • 你申请disabled=disabled的结果。在 IE 中,<div disabled=disabled>...</div>禁用 div 标签和其中的所有内容。

我相信你可以达到这样的预期结果:

$('#id1 div:not(.c1) :radio').prop('disabled', true);
于 2012-12-20T14:00:37.830 回答
1
$('#id1 div').each(function (){
    $(this).children('input').attr('disabled', !$(this).hasClass("c1"));
});

http://jsfiddle.net/hJTzW/4/

于 2012-12-20T13:49:29.930 回答