【问题标题】:How to enable one button inside a disabled fieldset如何在禁用的字段集中启用一个按钮
【发布时间】:2014-10-16 06:15:55
【问题描述】:

我想禁用 Fieldset 中的所有元素,但启用其中的几个按钮。 Demo:

<fieldset ng-disabled="true">
    <legend>Personalia:</legend>
    Name: <input type="text"><br>
    Email: <input type="text"><br>
    Date of birth: <input type="text">

    <input type="button" value="See More (Enable this!!) " ng-click="ButtonClicked1()" ng-disabled="false"/>
    Somethingelse: <input type="text">
    <input type="button" value="View Details " ng-click="ButtonClicked2()"/> 
</fieldset>

【问题讨论】:

  • 您只想启用字段集中的按钮??
  • 根据情况,您可以使用非输入元素,如锚点、跨度等,并将其样式作为您的按钮。

标签: javascript html angularjs


【解决方案1】:

我有两个解决方案给你:

解决方案 1:将按钮放在 &lt;legend&gt;

label {
  display: block;
}
<fieldset disabled>
  <legend>
    Personalia:
    <button>See more</button>
  </legend>

  <label>Name: <input></label>
  <label>Email: <input></label>
  <label>Date of birth: <input></label>

  <label>Somethingelse: <input></label>
  <button>View Details</button> 
</fieldset>

解决方案 2:使用“假”按钮

您可以使用 aria-roles 来“伪造”按钮 role="button"(参见 ARIA button role)。请记住添加必要的辅助功​​能,以使没有显示屏或鼠标的用户可以点击此按钮。重要的属性是role="button"(用于屏幕阅读器)和tabindex="0"(用于键盘导航),还记得为EnterSpace添加keypress的处理程序以防您的用户没有鼠标。

const disabledButton = document.querySelector('.disabled-button');
const disabledOutput = document.querySelector('.disabled-output');
const enabledButton = document.querySelector('.enabled-button');
const enabledOutput = document.querySelector('.enabled-output');

function increment(output) {
  const current = Number.parseInt(output.textContent);
  output.textContent = `${current + 1}`;
}

disabledButton.addEventListener('click', () => increment(disabledOutput));
disabledButton.addEventListener('keypress', event => {
  if (['Enter', ' '].includes(event.key)) {
    increment(disabledOutput);
  }
});

enabledButton.addEventListener('click', () => increment(enabledOutput));
enabledButton.addEventListener('keypress', event => {
  if (['Enter', ' '].includes(event.key)) {
    increment(enabledOutput);
  }
});
label {
  display: block;
}

[role="button"] {
  -webkit-appearance: button;
  appearance: button;
  cursor: default;
  font-style: normal;
  -webkit-user-select: none;
  user-select: none;
}
<fieldset disabled>
  <legend>Disabled form elements</legend>

  <label>Input 1<input name="input 1"></label>
  <label>Input 2<input name="input 2"></label>
  
  <button
    class="disabled-button"
    name="disabled-button"
  >
    This is disabled
  </button>

  <i
    class="enabled-button"
    role="button"
    tabindex="0"
  >
    This is enabled
  </i>
</fieldset>

<label>
  Disabled button clicks:
  <output class="disabled-output">0</output>
</label>

<label>
  Enabled button clicks:
  <output class="enabled-output">0</output>
</label>

【讨论】:

  • 将我的input 放入legend 对我有用。我的 HTML 编辑器抱怨在 legend 中放置了一堆“不应该”存在的东西,但 Chrome 和 Firefox 都可以很好地呈现它。
  • @JacobStamm 根据mdn:“HTML &lt;legend&gt; 元素代表其父 &lt;fieldset&gt; 内容的标题。”我认为元控制——例如作为一个复选框来切换字段集的禁用状态;或稍微影响字段集内容的操作按钮 - 肯定会作为所述字段集的标题传递。所以我认为你的文本编辑器给了你一个不合理的建议。话虽如此,上面的示例绝对应该使用&lt;a&gt; 标签作为“显示更多”的链接。
【解决方案2】:

解决方案 1 - 使用带有点击事件的图标

使用图标代替按钮并将click 事件附加到图标上。这绕过了禁用的字段集,就像一个魅力。

<fieldset disabled='disabled'>
  <img src='/images/trash-can.png' ng-click='openModal()'/>
</fieldset>

和 javascript(使用 angularjs)

$scope.openModal = ()=>{
  // do stuff
};

解决方案 2 - 使用带有点击事件的 Bootstrap 样式的跨度

Bootstrap 可以设置 span 样式,使其看起来完全像一个按钮。 Span 不使用或继承 disabled 属性。

<fieldset disabled='disabled'>
  <span class="btn btn-default" ng-click='openModal()'>
    Button Text
  </span>
</fieldset>

和 javascript(使用 angularjs)

$scope.openModal = ()=>{
  // do stuff
};

【讨论】:

    【解决方案3】:

    试试这个:

    DEMO

    HTML:

    <fieldset id="form">
        <legend>Personalia:</legend>
        Name: <input type="text" /><br />
        Email: <input type="text" /><br />
        Date of birth: <input type="text" />
    
        <input id="btn1" type="button" value="See More (Enable this!!) " onclick="ButtonClicked1()" />
        Somethingelse: <input type="text" />
        <input type="button" value="View Details " onclick="ButtonClicked2()"/> 
    </fieldset>
    

    脚本:

    $('#form :input').prop('disabled', true);
    $("#btn1").prop('disabled', false);
    

    【讨论】:

    • 但这不是使用角度方式。但是,它有效。所以现在的问题可能是如何使其尽可能接近角度。我的意思是,如何从控制器或指令中选择所有相关元素?
    • 这是一个 jQuery hack,不是一个有价值的解决方案
    • 这是一个可怕的黑客攻击。如果您将要保持启用的输入包装在标签中,它仍然可以工作。不知道你会如何定位它。
    • 这个答案中的代码在这个博客上似乎完全一样:exceptionshub.com/…
    • 这在 chrome 中不起作用。还有其他可行的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    相关资源
    最近更新 更多