【发布时间】:2019-05-10 16:27:03
【问题描述】:
我对 HTML、javascript 和网络世界完全陌生。我的要求如下。
界面布局
username: __________ |find button|
First name: __________
Last name: __________
e-mail: __________
待完成
- 用户在用户名文本字段中输入用户名并点击查找按钮
- 点击查找按钮,调用Perl方法
getDetails("enteredUName") - 从调用的 Perl 方法中捕获返回值,并在剩余的文本字段(名字、姓氏和电子邮件)中填写详细信息。
我已经准备好表单和搜索逻辑。
现在我的困惑是我应该在 search 按钮的 -onClick 属性中添加什么。在代码中,对于表单,总是有为其他按钮编写的 javascript 调用。那么我应该如何在单击搜索按钮时调用 Perl 方法并填写剩余的文本字段?
更新
根据我目前的理解做了以下事情:
- 定义了一个隐藏的布尔参数
isUsernameGiven,初始值为0,形式为 - 当用户在文本字段中键入名称为
usernameText的内容并单击搜索按钮时,调用 javascript 将isUsernameGiven的值设置为 1,并使用指定的操作设置窗口位置。 - 操作通过应用程序 perl 脚本路由到 Perl 模块文件。在此模块中,搜索基于
usernameText参数进行 - 新出现的表格带有预先填写的详细信息。
代码结构
ApplicationDirectory
application.pl
ModuleFolder
ModuleFile.pm
application.pl:
...
if ($action eq 'save') {
my $m = new ModuleFile();
}
...
ModuleFile.pm:
...
sub new {
# param isUsernameGiven is preserved/carried over from previous??
my $isUsernameGiven = param('isUsernameGiven');
if ($isUsernameGiven != 0) {
param(-name=>'isUsernameGiven',-value=>$isUsernameGiven);
}
if ( $action eq "add" ) {
showAddForm($self);
} elsif ($action eq "addEmp") {
showAddForm($self, $self->getUserInfoFromActiveDir(param('usernameText')));
}
}
sub getUserInfoFromActiveDir {
# search info and return employee object
...
}
sub showForm {
...
print "\n<form name=\"edit_employee_form\" method=\"post\" action=\"application.pl\" onSubmit=\"return validate_form();\">\n";
print "<input type='hidden' name='isUsernameGiven' value='0'/>\n";
print "<table class=edit style=\"width:420px;\">\n";
my $findButton = '';
if (!$id) {
$findButton = "<td>\n".button(-value=>"Find", -class=>"bigbutton",
-onClick=>"document.edit_employee_form.isUsernameGiven.value=1;getDetailsFilled();")."</td>";
}
my $fieldname = 'username';
print "<tr><td>Username:</td><td > \n".textfield(-name=>$fieldname -default=$unameValue,".
"-size=>30, -maxlength=>50)."</td>".$findButton."</tr><br>";
print "<tr><td>First Name:</td><td > \n".textfield(-name=>'first', -default=>$fnameValue, -size=>30, -maxlength=>50)."</td></tr>\n";
print "<tr><td class=edit>Last Name:</td><td > \n".textfield(-name=>'name', -default=$lnameValue, -size=>30, -maxlength=>50)."</td></tr>\n";
...
}
ModuleFile.js:
...
function getDetailsFilled()
{
if ( document.edit_employee_form.username.value == "" )
{
alert ( "Please fill in a username." );
document.edit_item_form.username.focus();
} else {
// Call Perl method here
window.location="application.pl?application=ModuleFile&action=addEmp";
}
}
...
问题
- 单击查找按钮后没有任何反应。我错过了什么?
- 似乎参数
isUsernameGiven在子showform中未定义。- 是否为每个
ModuleFile对象保留或重置参数值? - 如果
isUsernameGiven的默认值设置为 0,那么这个值会如何变为未定义? - 我对参数的理解正确吗?
- 是否为每个
- 我目前的整体方法是否正确?
【问题讨论】:
-
你在自动化浏览器吗?如果是这样,请参阅 metacpan.org/pod/WWW::Mechanize 和/或 metacpan.org/pod/WWW::Mechanize::Chrome 。否则,您将不得不了解HTTP 的工作原理。无论哪种情况,除了 Perl 之外,您都必须学习 Javascript。
-
这里没有自动化
-
如果你想写一个可以用 Perl 编写客户端代码的网站,可以考虑查看WebPerl,它允许你在浏览器中的客户端上运行 Perl。
标签: javascript forms perl cgi textfield