【问题标题】:Can't set disabled=false (javascript)无法设置 disabled=false (javascript)
【发布时间】:2010-08-24 14:04:18
【问题描述】:

我有这个功能:

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 了。这些天,孩子们很流行。
  • jQuery 仅仅为了这个就太过分了。
  • 确保您的操作输入是布尔值 true 或 false,而不是字符串“true”或“false”,这很可能是您的问题。
  • jQuery,为了这个?从不。

标签: javascript html forms


【解决方案1】:

编辑以反映 cmets。

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

根据我的经验,您也可以使用字符串值 'disabled' 或 '' 来实现此效果。这可能会起作用,因为当浏览器遇到这些值时,它们会被强制转换为布尔表示。

【讨论】:

  • 不同的实体可能以不同的方式执行,但符合标准的 HTML 表示您应该将元素声明为 disabled="disabled"
  • 关于HTML 4.01HTML5 规范,disabled 属性被描述为boolean 属性,其中元素上存在布尔属性表示真实值,不存在的属性代表假值。
  • Kieranmaine:disabled 属性的字符串“disabled”不正确。它应该是布尔值truefalse。请参阅 CMS 的评论。
  • g.d.d.c:最初发布的代码看起来是正确的。必须有一些其他问题与我们没有看到的其余设置有关。有一个普遍的问题,很多人似乎对属性和属性之间的关系感到困惑,我认为 jQuery 的 attr() 方法加剧了这种困惑,在大多数情况下,该方法设置的是属性,而不是属性。一般来说,由于 IE 中的行为不正确,为了简单起见,您最好忘记 JavaScript 中的属性而只使用属性。
  • 我认为您(仍然)混淆了 disabled HTML attributedisabled property 您使用 JavaScript 获取/设置element.disabled [= (true|false)]。另见MSDN
【解决方案2】:

试试.disabled = null.removeAttribute('disabled')。我的理解是,是 disabled 属性的存在与否决定了残疾,而不是它的价值。

【讨论】:

  • 同意。这也有效: $('#myButton').prop("disabled", null);
【解决方案3】:

要禁用元素,您需要使用属性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');
  }
}

setAttributeremoveAttribute 函数分别用于设置和删除disabled 属性。

【讨论】:

  • @Marcel Korpel:WAM:它怎么没用?还有action === true/false有什么问题???
  • @ms2ger:你们在浪费我的时间。它永远不等同! OP 将 disabled 设置为 true 或 false,这是错误的。它可以通过disabled="disabled" 设置或删除disabled 属性,我正在使用setAttributeremoveAttribute
  • 这段代码虽然过于冗长,但却是正确的 - 而“正确”标记的答案不是,所以我不确定它是如何以 -1 结尾的。
  • Stuart:根据 DOM 标准,这个答案可能是正确的(除了第一部分中的复制/粘贴错误),但你最好改用 disabled 属性。
【解决方案4】:

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

【讨论】:

  • +1。我不明白为什么这个答案在底部,其他答案将属性与属性混淆了。
猜你喜欢
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 2022-01-14
  • 2017-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多