CGI:如何在 JavaScript 中增加 Perl 变量
CGI: How to increment Perl variable inside JavaScript
在 Perl CGI 脚本中,我需要在 <script>
元素内递增 Perl 数组索引,以便在每个 HTML
中添加数组中的每个值
<p id="para1">
<p id="para2">
<p id="para3">
...
<p id="paraN">
一个接一个。
<p>
个标签的个数和Perl数组变量的长度相同
我尝试使用 JavaScript 来增加 Perl 数组索引变量,但它不起作用。
有没有其他方法可以做到这一点?
示例代码:
#!/usr/bin/perl
print "content-type:text/html\n\n";
my @jslabel = ('1', '2', '3');
print <<EOF;
<html>
<head>
</head>
<body>
<p id="para0"> hi </p>
<p id="para1"> hi </p>
<p id="para2"> hi </p>
</body>
<script>
for( var i = 0; i < 3; i++ )
{
document.getElementById("para"+i).innerHTML = $jslabel[i];
}
</script>
</html>
EOF
网页应该是这样的:
1
2
3
但是,给定代码的结果:
1
1
1
如何达到想要的效果?
在 javasCript 理解 perl 数组和使用它们的方式中似乎有一些有趣的行为,我会在 javasCript 代码中编写数组
我会在 javasCript 中声明数组,并在 javaScript 中使用它。
<script>
var jslabel = ['1','2','3'];
var i;
for (i = 0; i < 3; i+=1) {
document.getElementById("para" + i).innerHTML = jslabel[i];
}
</script>
您可以通过 JSON 编码您的 perl 数据,然后使用您的 javascript.
从中读取数据来解决问题。
#! /usr/bin/perl
use strict;
use warnings 'all';
use CGI;
use JSON;
# note that JSON expects array references
my $jslabel = [ 1, 2, 3 ];
# if we're using CGI, we may as well use it's functions
my $cgi = CGI->new();
print $cgi->header('text/html');
# convert our array to JSON
my $data = to_json($jslabel);
my $html = qq:
<html>
<head>
<title>A title is always nice</title>
<!-- javascript is best served inside the <header> -->
<script>
<!-- we're inserting the data here because of use of qq// -->
var jslabel = $data
for(var i=0;i<3;i++) {
document.getElementById("para"+i).innerHTML = jslabel[i];
}
</script>
</head>
<body>
<p id="para0"></p>
<p id="para1"></p>
<p id="para2"></p>
</body>
</html>:;
print $html;
不过,我还要指出,html 文档最好由 "template files" 提供,并通过提供该功能的模块向其中插入数据。来自 CPAN 的提供该功能的模块的好例子是 HTML::Template
或 Template::Toolkit
。然而这超出了问题的范围。
另一种选择是使用某种形式的 AJAX 机制从单独的 CGI 脚本中获取结果 "live" 数据并从返回的结果中填充(即更多 "Web 2.0" 处理事情的方式)。
在 Perl CGI 脚本中,我需要在 <script>
元素内递增 Perl 数组索引,以便在每个 HTML
<p id="para1">
<p id="para2">
<p id="para3">
...
<p id="paraN">
一个接一个。
<p>
个标签的个数和Perl数组变量的长度相同
我尝试使用 JavaScript 来增加 Perl 数组索引变量,但它不起作用。
有没有其他方法可以做到这一点?
示例代码:
#!/usr/bin/perl
print "content-type:text/html\n\n";
my @jslabel = ('1', '2', '3');
print <<EOF;
<html>
<head>
</head>
<body>
<p id="para0"> hi </p>
<p id="para1"> hi </p>
<p id="para2"> hi </p>
</body>
<script>
for( var i = 0; i < 3; i++ )
{
document.getElementById("para"+i).innerHTML = $jslabel[i];
}
</script>
</html>
EOF
网页应该是这样的:
1
2
3
但是,给定代码的结果:
1
1
1
如何达到想要的效果?
在 javasCript 理解 perl 数组和使用它们的方式中似乎有一些有趣的行为,我会在 javasCript 代码中编写数组
我会在 javasCript 中声明数组,并在 javaScript 中使用它。
<script>
var jslabel = ['1','2','3'];
var i;
for (i = 0; i < 3; i+=1) {
document.getElementById("para" + i).innerHTML = jslabel[i];
}
</script>
您可以通过 JSON 编码您的 perl 数据,然后使用您的 javascript.
从中读取数据来解决问题。#! /usr/bin/perl
use strict;
use warnings 'all';
use CGI;
use JSON;
# note that JSON expects array references
my $jslabel = [ 1, 2, 3 ];
# if we're using CGI, we may as well use it's functions
my $cgi = CGI->new();
print $cgi->header('text/html');
# convert our array to JSON
my $data = to_json($jslabel);
my $html = qq:
<html>
<head>
<title>A title is always nice</title>
<!-- javascript is best served inside the <header> -->
<script>
<!-- we're inserting the data here because of use of qq// -->
var jslabel = $data
for(var i=0;i<3;i++) {
document.getElementById("para"+i).innerHTML = jslabel[i];
}
</script>
</head>
<body>
<p id="para0"></p>
<p id="para1"></p>
<p id="para2"></p>
</body>
</html>:;
print $html;
不过,我还要指出,html 文档最好由 "template files" 提供,并通过提供该功能的模块向其中插入数据。来自 CPAN 的提供该功能的模块的好例子是 HTML::Template
或 Template::Toolkit
。然而这超出了问题的范围。
另一种选择是使用某种形式的 AJAX 机制从单独的 CGI 脚本中获取结果 "live" 数据并从返回的结果中填充(即更多 "Web 2.0" 处理事情的方式)。