HTML复选框元素只有在选中后才会提交?

时间:2010-11-18 03:15:10

标签: php html checkbox

我正在尝试在现有网站上工作,但我发现了一个错误,但我不确定为什么这是一个错误或如何解决它。

该网站基本上列出了一些城市租赁的商业物业。有一个类从数据库中抓取列表并从每个列表中创建一个对象。在每个对象中都有一个与该属性相关联的图像数组。

当用户编辑商家信息时,他们会获得一个包含图片列表的编辑页面,以及旁边的“删除”复选框。复选框都具有相同的名称,因此当它们被提交回服务器时,应用程序将获取要删除的图像数组。

应该发生的是,应用程序具有此开/关值数组(其中on = delete),并且数组中每个值的索引对应于列表对象中图像的索引 - 当其中一个值为“on”,图像数组中与该“on”值对应的文件名将从文件系统中删除,该图像将从数据库中删除。

但是,当提交表单时,应用程序将获得仅包含已选中复选框的0索引数组。因此,如果我设置三个任意图像进行删除,应用程序将获得

Array {
   [0] => "on",
   [1] => "on",
   [2] => "on"
}

这显然不起作用,无论设置了哪个复选框,列表中的前3个图像都将被删除。

我该如何解决这个问题?我希望避免命名每个复选框(delete_1delete_2delete_3等),因为系统已经构建为可以使用所有具有相同名称的复选框。有没有办法可以强制所有的复选框提交“开”或“关?”

6 个答案:

答案 0 :(得分:6)

没有办法强迫,但你可以在复选框之前添加一个隐藏的右边同名和所需的值:

<input type="hidden" name="delete[42]" value="off" />
<input type="checkbox" name="delete[42]" value="on" />

答案 1 :(得分:5)

不,您不能强制提交未选中的复选框,但您可以为它们提供唯一值(而不是所有的“on”),以确定在不更改名称的情况下检查哪些复选框。

答案 2 :(得分:1)

如果你真的想要在ons和offs上返回一个数组,那么你需要将一个函数附加到表单submit,它将扫描具有给定名称的所有复选框,并将它们的值放在数组中。

在jQuery中,这看起来像......

$('#yourForm').submit(function(){
    var array = new Array();
    $('input[name="nameOfCheckboxes"]').each(function(index){
        array[index] = $(this).value();
    }
    var r = $.param(array);
    $('#someHiddenFieldInForm').value(r);
 }

(代码未经测试,当然)

答案 3 :(得分:1)

您可以通过添加以下jQuery来解决此问题:

$(function () {
  $("#myform").submit(function(){
    $("input[name='delete']:not(:checked)").attr("checked","checked").val("off");  
  });
}); 

myform是您表单的ID,delete是复选框的名称。

答案 4 :(得分:1)

Fred Nurk的解决方案很好,我赞成它。就个人而言,当我遇到这种情况时,我总是给这些字段命名。我使用一个公共前缀,后跟一个下划线,这样很容易识别,然后是某种id。我经常会创建一组具有相同模式的字段,例如“name_1”,“amount_1”,“foobar_1”,“name_2”,“amount_2”等。循环显示字段并使用这些名称相当容易分开。 (在Java中,只是indexOf('_')。)

答案 5 :(得分:0)

解决这个问题的另一种方法是接受一个奇怪的HTML表单并使用在声明期间使用ternary operators的局部变量捕获它。

例如,给出一个复选框

<input type="checkbox" name="notify_users" id="notify_cb">

无论是否包含复选框值,您都可以像这样处理帖子:

// normal boolean value    
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on' );    
// explicitly set a 1 or 0
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on' )? 1 : 0);
// explicitly set 'yes' or 'no'
$notify_users = ((!empty($_POST['notify_users']) and $_POST['notify_users'] == 'on' )? 'yes' : 'no');

在我看来,这比向客户端添加额外的Javascript更好,只是因为它维护的次数要少一些(并且对于继任者/其他开发人员来说,可以说更清楚地了解正在发生的事情)