2011-09-21 63 views
0

HTML文件看起來像:Perl的文本::微模板和參數

<? my $args = shift; ?> 
    . 
    . 
    . 
<script type="text/javascript"> 
function validateInput(value,regex,eid) 
{ 
    var elem; 
alert(eid); 
/* 
    if (value.match(regex) == null) { 
    elem = document.getElementById(id); 

    }*/ 
} 
</script> 
. 
    ? foreach my $row (@{$args}) { 
    <tr><td><label><?= $row->{field} ?> </label> 
    <input onchange="validateInput(this.value,<?=$row->{reg}?>,<?=$row->{id}?>);" 
    type="text" name="<?= $row->{name} ?>" id="<?= $row->{id} ?>" /><span class="small" id="<?= $row->{id} ?>"></span></td></tr> 
    ? } 

Perl代碼是:

my $test_tmlp = read_file('registration_form.tmpl'); 
my @args = ({field => 'First Name', 
      name => 'fn', 
      id => 'fn', 
      reg => '/[a-zA-Z]+/'}, 
      {field => 'Last Name', 
      name => 'ln', 
      id => 'ln', 
      reg => '/[a-zA-Z]+/'}, 
      {field => 'Email', 
      name => 'email', 
      id => 'email', 
      reg => '/[a-zA-Z]+/'}, 
      {field => 'Cellphone', 
      name => 'cellphone', 
      id => 'cellphone', 
      reg => '/[a-zA-Z]+/'}, 
      {field => 'Coupon Code', 
      name => 'code', 
      id => 'code', 
      reg => '/[a-zA-Z]+/'} 
      ); 

my $page = build_mt(
     template => $test_tmlp 
    )->(\@args)->as_string; 

出於某種原因,第三個參數的JavaScript函數得到的,始終是輸入HTML對象,我無意中將頭撞在牆上一個小時+。 可能是一些與逃避的東西,但是,如果我改變了「身份證」哈希鍵爲「章」,那麼最後一個參數獲得通過,以作爲它應該是函數...

任何想法,爲什麼這種行爲是發生了什麼?

感謝,

回答

1

讓我們來看看,當你調用validateInput()會發生什麼......

與該模板呈現的HTML,在validateInput()第三個參數是一個裸字:它不是包裹在單引號如何它應該是,並且JavaScript引擎應該拋出一個錯誤......正則表達式不需要單引號,所以如果你把正則表達式作爲第三個參數傳遞給子例程。

我這樣做是爲了你的模板變化不大(注意周圍的第三個參數單引號):

? foreach my $row (@{$args}) { 
<tr><td><label><?= $row->{field} ?> </label> 
<input onchange="validateInput(this.value,<?=$row->{reg}?>,'<?=$row->{id}?>');" 
type="text" name="<?= $row->{name} ?>" id="<?= $row->{id} ?>" /><span class="small" id="<?= $row->{id} ?>"></span></td></tr> 
? } 

其中產量這個HTML:

<tr><td><label>First Name </label> 
<input onchange="validateInput(this.value,/[a-zA-Z]+/,'fn');" 
type="text" name="fn" id="fn" /><span class="small" id="fn"></span></td></tr> 
<tr><td><label>Last Name </label> 
<input onchange="validateInput(this.value,/[a-zA-Z]+/,'ln');" 
type="text" name="ln" id="ln" /><span class="small" id="ln"></span></td></tr> 
<tr><td><label>Email </label> 
<input onchange="validateInput(this.value,/[a-zA-Z]+/,'email');" 
type="text" name="email" id="email" /><span class="small" id="email"></span></td></tr> 
<tr><td><label>Cellphone </label> 
<input onchange="validateInput(this.value,/[a-zA-Z]+/,'cellphone');" 
type="text" name="cellphone" id="cellphone" /><span class="small" id="cellphone"></span></td></tr> 
<tr><td><label>Coupon Code </label> 
<input onchange="validateInput(this.value,/[a-zA-Z]+/,'code');" 
type="text" name="code" id="code" /><span class="small" id="code"></span></td></tr> 

檢查其是否與此變更後的作品。

+0

感謝您的解釋,我在同一天發現了這個問題,傻了我忘了報價。 – snoofkin