.attr("disabled", "disabled")问题

21

我有这个函数,可以切换输入字段的disabled属性:

$('.someElement').click(function(){     
  if (someCondition) {
     console.log($target.prev('input')) // gives out the right object
     $target.toggleClass('open').prev('input').attr('disabled', 'disabled');
  }else{
     $target.toggleClass('open').prev('input').removeAttr('disabled'); //this works
  }
})
removeAttr 能够正常工作,但是当我需要重新添加 disabled 属性时,它就什么都不做了。我的控制台日志 (console.log) 已触发(并返回正确的输入字段),因此我确定我的 if 语句是起作用的。但是当我用 firebug 在 firefox 中检查 DOM 时,disabled 属性并没有出现。

请问有人能帮助我吗?

PS:请别关注于函数或 if 语句本身,它们工作正常,只是 attr 对于 disabled 不起作用...

编辑:这是一个 type="hidden" 的输入字段,disabled 在隐藏字段上可能无法正常工作吗?


你用什么浏览器?你试过其他的吗? - abatishchev
2
像abatishchev之前问过的那样:你尝试在另一个浏览器中做同样的事情了吗? - Amr Badawy
1
你能提供HTML代码吗? - Luca Filosofi
我应该使用另一个调试工具检查一下!!!谢谢大家。 - meo
7个回答

40

感谢大家的贡献!我找到了问题:

这是一个Firebug的Bug !!!

我的代码是正确的。我已经请求PHP开发人员将输入类型从隐藏改为文本类型。 禁用功能是有效的。但是Firebug控制台不会更新此状态!

您可以在这里自行测试此Firebug错误 http://jsbin.com/uneti3/3#。感谢aSeptik提供的示例页面。

更新:2012年6月2日:FF11中的Firebug仍然存在此错误。


1
这并不是理想的情况,它只是没有值的参数,这意味着它保持默认状态。你应该使用disabled="1"来真正禁用它 :/ - RobertPitt
7
不,你应该使用 disabled="disabled" 以符合W3C标准。如果你读我的最初帖子,这正是我的代码所做的。 - meo
1
是的,这是一个Firefox的bug,并且在版本5中仍然存在。 - Cagdas
1
天哪,今天下午我真是火大了,一直在想为什么它不工作。我有Firebug 1.10.6。 - user1026130
由于@HelloWorld提到的同样的原因,我也是这么想的哈哈。 - periback2
显示剩余3条评论

8

更新

演示:http://jsbin.com/uneti3/3

你的代码是错误的,应该像这样:

 $(bla).click(function() { 
        var disable =  $target.toggleClass('open').hasClass('open');
       $target.prev().prop("disabled", disable);
  });

您使用toggleClass函数的方式不正确


为什么我用错了呢?我只是指定一个类并切换这个类。这部分工作得很好(就像jQuery文档告诉我的那样)。但是我仍然尝试以这种方式做,但它不起作用。 - meo
在HTML属性方面,disabled="true"是不正确的。如果存在disabled属性,则其唯一可能的值是disabled,例如disabled="disabled"。如果实体已启用,则完全省略disabled标签,因此需要使用jQuery的removeAttr函数。 - Mattygabe
@Mattygabe:我认为你错过了jQuery的重点;jQuery的true/false用作简写,它只是自动检测并添加/删除(而不是启用)属性。因此,如果为true,则该属性将被禁用,如果为false,则该属性将被删除。 - Luca Filosofi
@aSeptik 哦,好的观点。又一个我不知道的jQuery抽象化。 - Mattygabe
使用prop替换attr - Luca Filosofi
显示剩余2条评论

7
尝试使用这段更新后的代码:
$(bla).click(function(){        
  if (something) {
     console.log($target.prev("input")) // gives out the right object
     $target.toggleClass("open").prev("input").attr("disabled", "true");
  }else{
     $target.toggleClass("open").prev("input").removeAttr("disabled"); //this works
  }
})

这不是使用toggleClass的正确方式! - Luca Filosofi
我刚刚在发布的函数中添加了 .attr("disabled", "true");。 - Pranay Rana

2

在切换按钮的禁用状态时,我遇到了类似的问题!在触发removeProp('disabled')后,按钮拒绝再次被“禁用”!我找到了一个有趣的解决方案:使用prop("disabled",true)来禁用按钮,使用prop("disabled",false)来重新启用它!现在,我能够随意切换我的按钮的“禁用”状态!试试吧。


-1
$("#vp_code").textinput("enable");
$("#vp_code").textinput("disable");

你可以试试看


3
请尝试解释为什么您认为这是合适的解决方案。 - Mawcel

-2

添加 disabled 属性

$('#id').attr("disabled", "true");

移除禁用属性

$('#id').removeAttr('disabled');

-2

尝试

$(bla).click(function(){        
  if (something) {
     console.log("A:"+$target.prev("input")) // gives out the right object
     $target.toggleClass("open").prev("input").attr("disabled", "disabled");
  }else{
     console.log("A:"+$target.prev("input")) // any thing from there for a single click?
     $target.toggleClass("open").prev("input").removeAttr("disabled"); //this works
  }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接