1

我的 HTML 中有一个复选框,如下所示:

<input type="hidden" name="<TMPL_VAR NAME=SHORT>" value="<TMPL_VAR NAME=ELSE>">
<input type="checkbox" name="<TMPL_VAR NAME=SHORT>" id="checkbox-2" value="<TMPL_VAR NAME=FLAG>" class="checkbox mid-margin-left">
<label for="checkbox-2" class="label"><TMPL_VAR NAME="NAME"></label>

基本上,我在这里要完成的是,如果选中复选框,则发送一个值,如果未选中复选框,则发送另一个值(基本上是默认值)。现在,这是动态的,所以我真的无法在 CGI 中做一些事情来说:“如果定义了,则表示此,如果未定义,则表示其他。”

无论如何,当我不选中该框时,我会从隐藏的输入中获取值。但是,当我检查它时,我得到了两个值。现在,我可以说,“如果它有多个值,那么要使用的值就是第二个。” 但是,如果我得到一个接受多个值的选择列表的值怎么办?在那种情况下,我不想说取第二个值,因为发送的所有值都是有效的。

所以,我想说的是:“如果它是一个复选框,并且有多个值,则取第二个值;否则,取第一个。”

关于如何做到这一点的任何想法?也许我做的不对?关于更好的方法来实现这一点的任何建议?我不想将单选按钮用于布尔值(是/否),但如果这是唯一的方法,那就这样吧。

4

2 回答 2

2

如果您不想要 JS,我建议您更改表单,以便在名称上带有前缀的每个字段都有一个备用值:

<form id="myform" method='post' action="/echo/json/">
    <input type="hidden" name= "alternate-foo" value="foo not selected" />
    <input type="hidden" name="alternate-bar" value="first bar" />
    <p>Foo <input type='checkbox' name='foo' id='foo' value='foo selected' /></p>
    <p>
        <select name='bar' id='bar' multiple>
            <option value='first bar'>bar 1</option>
            <option value='second bar'>bar 2</option>
            <option value='third bar'>bar 3</option>
        </select>
    </p>
    <p><input type='submit' name='submit' value='submit' /></p>
</form>

在您的 Perl 代码中,您可以执行以下操作:

use strict;
use warnings;
use CGI;

my $q = CGI->new;

$q->param( 'foo', $q->param('alternate-foo') ) unless $q->param('foo');
$q->param( 'bar', $q->param('alternate-bar') ) unless $q->param('bar');

或者,更动态:

use 5.014;
foreach my $alt ( grep { /^alternate-/ } $q->param ) {
  my $name = $alt =~ s/^alternate-//r;
  $q->param( $name, $q->param( $alt )) unless $q->param($name);
}
于 2013-07-28T10:03:12.783 回答
2

为了方便起见,我会用 JavaScript 和 jQuery 来做。唯一的缺点是,如果您的客户禁用了 JS,它将无法正常工作。

您的表格可能几乎保持不变。我做了一个简单的例子。确保所有东西都有 id。

<form id="myform" method='post' action="/echo/json/">
    <input type="hidden" id="hidden-foo" value="foo not selected" />
    <p>Foo <input type='checkbox' name='foo' id='foo' value='foo selected' /></p>
    <p>
        <select name='bar' id='bar' multiple>
            <option value='first bar'>bar 1</option>
            <option value='second bar'>bar 2</option>
            <option value='third bar'>bar 3</option>
        </select>
    </p>
    <p><input type='submit' name='submit' value='submit' /></p>
</form>

现在这是 JS 代码,它应该放在表单下方或事件的事件处理程序内load

$(document).ready(function() {    
    $("#myform").submit(function(){
        // if checkbox is not checked, change value and check so it's transmitted
        if (! $("#foo").is(":checked")) {
            $("#foo").val($("#hidden-foo").val()).prop('checked', true);
        }

        // take first option if no option is selected
        if( $("#bar option:selected").length == 0 ) {
            $("#bar option:first").attr('selected','selected');
        }
    })
});

这很简单:

  • 如果未勾选该复选框,它会将其值更改为隐藏字段之一并勾选它。
  • 如果未选择任何选项,它将选择第一个

这是一个jsFiddle来演示。您应该打开 Firebug 控制台以查看输出。

现在应该很容易把它变成动态的东西,可以处理所有表单字段,而您的模板引擎不必干预 JS 代码。

于 2013-07-28T09:51:46.057 回答