2013-07-28 31 views
1

我有我的HTML複選框,看起來像這樣:張貼CGI內容獲取參數類型(或處理複選框開/關值)

<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中做一些事情,說:「如果這是定義的,那麼它意味着這一點,如果不是,那麼它意味着別的東西。」

無論如何,當我離開框未選中時,我從隱藏的輸入中獲得值。但是,當我檢查它時,我得到了兩個值。現在,我可以說,「如果這有多個值,那麼使用的值是第二個值。」但是,如果我獲得接受多個值的選擇列表的值,該怎麼辦?在這種情況下,我不想說取第二個值,因爲所有發送的值都是有效的。

所以,我想說的是:「如果它是一個複選框,並且有多個值,則取第二個值;否則,取第一個值。

有關如何做到這一點的任何想法?也許我沒有這樣做對嗎?任何建議,以更好的方式來實現這一目標?我不想爲布爾值(是/否)使用單選按鈕,但如果這是唯一的方法,那就這樣吧。

+0

我決定展示兩種不同的方法,因此有兩個單獨的答案。 – simbabque

回答

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); 
} 
+0

我似乎沒有能力加強您的迴應,但我非常感謝您的意見。我最終使用你的輸入,它的工作原理就是我想要它的工作。謝謝! –

+0

很好用。 :)如果這對你有幫助,請點擊選票左下方的複選標記將其標記爲已接受,以便其他人可以看到它是正確的解決方案。查看[faq#howtoask]瞭解更多信息。一旦你擁有15 [聲望](http://stackoverflow.com/help/privileges),你就可以升級。 – simbabque

2

爲了方便起見,我會用JavaScript和jQuery來做。唯一的缺點是,如果你的客戶禁用了JS,它將不起作用。

你的表格可能保持不變。我舉了一個簡單的例子。確保每件事物都有ids。

<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代碼。

+0

並感謝您向我展示不止一種方式來做到這一點。我以前使用過類似的東西,但JS禁用的瀏覽器是讓我無法做到的。 –