【问题标题】:Disable all other TDs in a row if first TD is selected如果选择了第一个 TD,则连续禁用所有其他 TD
【发布时间】:2010-01-08 08:36:10
【问题描述】:

我有一个包含多行的表。每行包含 5 列(或 5 个 TD)。第一个 TD 内部是一个文本字段和一个选择框。其他 4 个 TD 每个都包含一个包含一组单选按钮的表格。

<tr bgcolor=#ffffff>
<td valign=center>
  <select name=player1>
  <option>0</option>
  <option>1</option>
  </select>
  <input type="text" id="PlayerLocal1" name=p1name size=20>
</td>
<td>
  <table border=1>
    <tr>
      <td>
    <table border=0 cellspacing=0 cellpadding=0>
        <tr>
            <td><input type=radio name=p1o1 value="1B">1B
            <td><input type=radio name=p1o1 value="FO">FO
        </tr>
    </table>
      </td>
    </tr>
  </table></td></tr>

基本上我希望禁用其他 4 个 TD 中的单选按钮,除非用户在文本字段中输入值或在选择字段中选择值。

我正在考虑为每个 TR 添加一个类,然后以某种方式遍历不是第一个 TD 的每个 TD 并删除 disabled 属性(以启用它),但我无法理解如何创建条件声明或我是否需要使用 parents() 或 Siblings() 或其他东西来遍历。

快速说明: 我的表有多行多列(我只显示了 2 个 TD 以节省空间,但其他 3 个 TD 看起来就像第 2 个)。例如,player1 和 p1name1 将是第二行的 player2 和 p2name2。因此,如果第一行中的文本/选择发生更改,则不应启用所有行中的所有单选按钮——仅启用第一行的单选按钮。

感谢任何帮助!

【问题讨论】:

    标签: jquery conditional traversal


    【解决方案1】:
    $('input:radio').attr('disabled', true);
    
    $('select[name=player1], input[name=p1name]').change(function(){
       $('input:radio').attr('disabled', false);
    });
    

    我建议在属性周围加上引号,例如 name="p1name" 而不是 name=p1name。当你不这样做时,可能会发生疯狂的事情。

    此外,当您为元素指定 id 或类时,您可以更精确地确定哪些元素被选中,哪些元素未被选中。例如,假设您只想禁用其中一个单选按钮,您可以轻松地做到这一点,而没有 id 则要困难得多。

    根据要求:

    给选择和输入一个类,比如

    <select class="affector"></select>
    <input type="text" class="affector" />
    

    你可以这样遍历:

    $('.affector').change(function(){
       $(this).parents('tr').find('input:radio').attr('disabled', false);
    });
    

    如果您要在 &lt;tr&gt; 的某处有更多单选按钮,并且您只想启用一个选择组,那么再次使用类将是有益的。您可以用类选择器替换.find() 中的“input:radio”,只有那些会受到影响。

    加法:

    如果它们是页面上唯一的选择和文本输入,您也可以放弃添加类并改用类型选择器:

    $('select, input:text').change(function(){
       $(this).parents('tr').find('input:radio').attr('disabled', false);
    });
    

    【讨论】:

    • 如果有超过 1 行的选择/文本 + 单选按钮怎么办?
    • 这看起来可能会起作用,但是,我们如何才能将其通用化。我的表有多行多列。例如,player1 和 p1name1 将是第二行的 player2 和 p2name2。因此,如果第一行中的文本/选择发生更改,则不应启用所有行中的所有单选按钮 - 仅启用第一行。我将使用此信息更新 OP(原始帖子)。
    • 答案的后半部分应该有效。一旦为选择/输入提供了一个通用类,您就可以将 DOM 向上移动到它们的父级 tr,然后您会在该行中找到单选按钮并启用它们。
    • 太棒了...这两个解决方案都有效,尽管我不得不添加一个类名,因为该行中有其他选择。不过有一件事......我的选择字段是根据对 PHP 脚本的 AJAX 调用的结果动态填充的元素。出于某种原因,填充选择字段时不会触发 .change 函数。文本字段虽然完美,但我确信静态选择框也会显示所需的行为。有什么想法吗?
    • 使用 jQuery unbind 和 bind function addSelectChange(){ $('select').unbind('change'); $('select').bind('change', function(){ //yada yada });} 在你的 ajax 成功函数中调用 addSelectChange。它应该可以解决问题。也看一下 jQuery 实时事件(当你想在以后的项目中为所有当前和未来的 DOM 元素设置事件时)。不幸的是,live 还不支持更改事件和其他一些事件。绑定是下一个最好的事情
    【解决方案2】:

    您可以在可以使用 javascript 隐藏的 TD 周围放置一个 div。在谷歌上搜索将帮助您如何隐藏 div :)。祝你好运!

    【讨论】:

    • 我不想隐藏任何东西,只是禁用表单元素。
    猜你喜欢
    • 2011-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多