【问题标题】:Set Attr Required when a checkbox for that field is checked选中该字段的复选框时设置 Attr 必需
【发布时间】:2014-11-15 11:25:34
【问题描述】:

我有一些循环行,每行都有一个复选框。在每一行中都有一个下拉列表,我希望在选中该行中的复选框时将其设置为required

MARK       NAME                   QUANTITY         
---------------------------------------------------
 []     inputForName1        Choose => 1,2,3,4,5    
---------------------------------------------------
 []     inputForName2        Choose => 1,2,3,4,5    
---------------------------------------------------
 []     inputForName3        Choose => 1,2,3,4,5    
---------------------------------------------------
 []     inputForName4        Choose => 1,2,3,4,5  
---------------------------------------------------
 []     inputForName5        Choose => 1,2,3,4,5   
---------------------------------------------------
                                   [SUBMIT]

(这里[]是一个复选框,Choose =>是一个下拉选择)

                echo'   <tr>
                        <td><input name="checkbox[]"  type="checkbox"  value="'.$i++.'" /></td>
                        <td><input name="items[]"     type="text"      value="'.$obj->items.'"></td>

                echo'   <td><select name="esquantity[]" required >
                            <option value="" >Choose Quantity</option>';
                              for ($q=1; $q <= $obj->quantity; $q++) {                                
                     echo'  <option value="'.$q.'"> '.$q.' </option>'; }
                     echo'  </select></td>';
                echo'</tr>';                                
                    }
                }
            ?>
            <input type="submit" name="Submit" value="Submit">
                    </form>
                    </table>


        <?php

        if($_SERVER["REQUEST_METHOD"] == "POST") {
            foreach($_POST['checkbox'] as $i) { 

                            $product_name=$_POST['items'][$i];
                            $product_quan=$_POST['esquantity'][$i];


                mysql_query("INSERT INTO estockClaims (items, 
                                                       esquantity)
                                            VALUES    ('$product_name',  
                                                       '$product_quan')");
                }
            }
        ?>

问题是当我只选中两个复选框并提交它们时,它要求我选择数量列中的所有下拉列表。

Jquery 草图

       <script type="text/javascript">
         $(document).ready(function(){
               $('input[type="checkbox"]').on('change', function(e)){
        //          var thisCheckbox = $(this);
                    var thisCheckbox = $('select[name="esquantity"]');
                    var thisRow = thisCheckbox.closest('tr');
                     if($(this.is(':checked')) {

                     }
                        .attr('required'));
                }
            }       
        </script>

【问题讨论】:

  • 我不喜欢php,但我没有看到您检查复选框并将特定数量下拉菜单设置为required 的任何地方。我唯一看到的是,对于每个添加的对象,您将数量字段设置为 required
  • 是的,这就是问题所在。我想要的是只要它被选中就让它成为必需的。有什么想法吗?
  • 相反,我不太擅长 Jquery。据我所知,我可以通过在检查时设置 required 属性来做到这一点。也许您可以为此在 jquery 脚本中帮助我?
  • 如果你能添加一个Jsfiddle.net 的例子让我编辑就更好了

标签: javascript php jquery


【解决方案1】:

我猜你没有忘记标签:&lt;table&gt;&lt;form&gt; 并关闭输入标签也&lt;input ... /&gt;

所以对于你的代码,你可以试试这个(PHP/HTML 部分):

$i++;
echo'   <tr>
        <td><input name="checkbox['.$i.']"  type="checkbox"  value="'.$i.'"  id="chb'.$i.'" onchange="enableList(this);" /></td>
        <td><input name="items['.$i.']"     type="text"      value="'.$obj->items.'" /></td>';

echo'   <td><select name="esquantity['.$i.']" id="select'.$i.'" disabled onchange="checkSelect(this)">
            <option value="" >Choose Quantity</option>';
              for ($q=1; $q <= $obj->quantity; $q++) {                                
     echo'  <option value="'.$q.'"> '.$q.' </option>'; }
     echo'  </select></td>';
echo'</tr>';

然后我注意到在 SUBMIT 部分:

if($_SERVER["REQUEST_METHOD"] == "POST") {
  foreach($_POST['checkbox'] as $key => $i) { 
    $product_name=$_POST['items'][$key];
    $product_quan=$_POST['esquantity'][$key];
    //more code
  }
}

还有 Javascript 部分:

function enableList(element) {
    var select = document.getElementById("select"+element.id.substring(element.id.length-1));

    if(element.checked === true){
        select.disabled = false;
        checkSelect(select);
    }else{
        select.disabled = true;
        select.selectedIndex = 0;
    }
}

function checkSelect(element){
    if(!validate_select(element)){
        element.setCustomValidity("Choose an option");
    }else{
        element.setCustomValidity("");
    }
}

function validate_select(select){
    if(select.selectedIndex === 0){
        return false;
    }else{
        return true;
    }
}

已编辑:为了达到新的目的(仅在检查了至少一项输入时才提交):

在复选框中添加一个类作为标识符:class="chb_group"(因此您不必担心其他复选框)......以及提交按钮的 id 可能:id="btn_submit"disabled 默认情况下

所以你添加:

function enableSubmit(){
    if (document.querySelector('.chb_group:checked')) {
        document.getElementById('btn_submit').disabled = false;
    } else {
        document.getElementById('btn_submit').disabled = true;
    }
}

然后调用它:

function enableList(element) {
    var select = document.getElementById("select"+element.id.substring(element.id.length-1));
    enableSubmit();
    .....
}

注意:此代码仅适用于“现代”浏览器,因为有一些功能和属性,例如:setCustomValidityquerySelector

【讨论】:

  • 它只禁用数量下拉列表。并且所需的功能不起作用。帮助
  • 为选择设置required 并不是很有用,这就是我选择禁用/启用的原因
  • 但是您提供的代码并没有实现任何目标。它只是禁用它。
  • 勾选后,下拉菜单仍然是禁用的。您能修改一下上面的代码吗?
  • 抱歉在$i++ 中犯了一个错误 --> $i 在几个输入中,我已经编辑了我的答案
【解决方案2】:

这是一个javascript 的答案。这是Jquery 答案:http://jsfiddle.net/n13wbran/5/

您可以更改我在复选框更改事件中分配给自己的req 属性:

$("input[name^='checkbox']").change(function () {
    var id = this.name.substring(8);
    if (this.checked) {
        $("[name='esquantity" + id + "']").attr("req", "true");
    } else {
        $("[name='esquantity" + id + "']").attr("req", "false");
    }
});

然后点击Submit,使用req == "true"检查列表并执行以下操作:

$("input[name='Submit']").click(function () {
    var i;
    for(i = 1; i <= parseInt($("[name^='esquantity']").length); i++) {
        if ($("[name='esquantity[" + i + "]']").attr("req") == "true" &&
            $("[name='esquantity[" + i + "]']").val() == "")
            alert("Please select a value for the required lists");
    }
});

【讨论】:

  • 不。已经回答了。 :) 我会保留这个用于学习目的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多