无法设置disabled=false(javascript)

11

我有这个函数:

function disableDiv(divId, action){
    var divId = byId(divId);

    if(action==true){
    divId.style.display='none';
    }
    else if(action==false){
    divId.style.display='block';
    }

    var inputs = divId.getElementsByTagName("input");
    var selects = divId.getElementsByTagName("select");
    var i;

    for (i=0; i<inputs.length; i++){
        inputs[i].disabled=action;
        }

    for (i=0; i<selects.length; i++){
        selects[i].disabled=action;
        }
}

这个函数接受一个divId(DIV的id)和一个操作(false或true),并获取该div中所有输入框和下拉框,并将它们的disabled属性设置为false或true。

根据Firebug的显示,Div中的元素一直被禁用。但是,一旦选中下拉列表项,它们应该变为活动状态...触发器没问题,所以你知道。 我可以使用警告框看到这个函数被调用了,并且它确实将disabled=false。但是元素仍然被禁用。

需要指出的是,根据Firebug的显示,disabled属性如下:

    <input name="test" id="test" disabled="">

请注意这里只有两个双引号... 应该写成"disabled='disabled'"或者"disabled=true"吗?

有什么进一步排除故障的技巧吗?

以下是我调用函数的方式:

(category=="Cars")?disableDiv("nav_sub_cars", false):disableDiv("nav_sub_cars", true);

如果你需要更多的输入,请告诉我...

谢谢


是时候转向jQuery了。这是当今孩子们都流行的选择。 - MrBoJangles
1
仅为此事而言,使用jQuery会过于复杂。 - Tim Down
1
确保您的操作输入是布尔值true或false,而不是字符串"true"或"false",这可能是您遇到问题的原因。 - K'shin Gendron
1
jQuery?不需要。 - Anthony Rutledge
4个回答

25

根据W3C的说法,您发布的代码应该是正确的。 disabled属性是一个布尔属性。使用removeAttribute()方法也可能会有所帮助。

在我的经验中,您还可以使用字符串值“disabled”或“”,以获得相同的效果。这可能是因为当浏览器遇到它们时,这些值被强制转换为布尔表示。


2
不同的实体可能会有不同的表现方式,但是符合标准的HTML规范指出,你应该将一个被禁用的元素声明为disabled="disabled"。 - Tom Gullen
6
关于HTML 4.01HTML5规范中,disabled属性被描述为布尔属性,元素上的布尔属性存在表示真值,缺少该属性表示假值。 - Christian C. Salvadó
3
Kieranmaine:disabled 属性的字符串 "disabled" 不正确。它应该是布尔类型的 truefalse。请查看 CMS 的评论。 - Tim Down
1
g.d.d.c:最初发布的代码看起来是正确的。肯定还有其他设置方面的问题我们没有看到。有一个普遍的问题,很多人似乎对属性和属性之间的关系感到困惑,我认为这种困惑被jQuery的attr()方法所加剧,在大多数情况下,该方法设置的是属性而不是属性。总的来说,由于IE中的不正确行为和简单性,您最好忘记JavaScript中的属性,只使用属性。 - Tim Down
3
我觉得你(仍然)混淆了HTML中的disabled属性和JavaScript中使用element.disabled[=(true|false)]设置/获取的disabled属性。另请参见MSDN - Marcel Korpel
显示剩余5条评论

6
要禁用元素,您需要使用属性 disabled = "disabled" 而不是 truefalse。要再次启用它,您需要删除 disabled 属性。请修改您的代码如下:
for (i=0; i<inputs.length; i++){
  if (action === false) {
    inputs[i].removeAttribute('disabled');
  }
  else {
    inputs[i].setAttribute('disabled', 'disabled');
  }
}

for (i=0; i<selects.length; i++){
  if (action === false) {
    selects[i].removeAttribute('disabled');
  }
  else {
    selects[i].setAttribute('disabled', 'disabled');
  }
}

setAttribute和removeAttribute函数分别用于设置和移除disabled属性。

@Marcel Korpel:WAM:它怎么会无用?action === true/false有什么问题吗? - Sarfraz
1
@ms2ger:你们这些人在浪费我的时间。 它绝不等同! OP 把 disabled 设置为 true 或 false,这是错误的。 它可以通过 disabled="disabled" 进行设置,或者通过 setAttributeremoveAttribute 来删除 disabled 属性,这正是我正在做的事情。 - Sarfraz
2
这段代码虽然过于冗长,但是是正确的 - 而被标记为“正确”的答案却不是,所以我不确定它为什么会得到-1分。 - Stuart
1
Stuart:按照DOM标准,这个答案可能是正确的(除了第一部分中的复制/粘贴错误),但最好使用“disabled”属性。 - Tim Down

6
尝试使用 .disabled = null 或者 .removeAttribute('disabled')。我的理解是,控制“禁用”状态的是disabled属性的存在或缺失,而不是其值。

1
同意,这也可以运行:$('#myButton').prop("disabled", null); - michaeljiz

3

需要更多的代码。一切看起来都正确,将<input>元素的disabled属性设置为布尔值(正确的方法)在Firefox中肯定有效,无论源HTML中是否存在disabled属性。


我不明白为什么这个答案在最下面,其他的答案将属性与特征混淆了。 - Oriol

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