第六部分:表单

输入的确认

  在Internet上表单被广泛的使用,输入的结果被传送到服务器或通过e-mail 传送到一个特定的mail帐户。但你如何知道一个输入的结果是符合规定的呢? 通过使用Javascript可以在结果被传送前检查它。 首先我想示范单但是如何被确认的,然后我们来看一看如何通过Internet 来传送信息。

  首先我们来写一段简单的代码,这个HTML页将包括两个文本元素。用户必须在第一个 中写下他的名字,在第二个里写下他的e-mail地址。你可以试着在表单里填任何东西, 也可以不填,然后按下按钮。

请输入你的名字:

请输入 e-mail地址:

  在第一个输入框中如果你什么也没有输入的话,你会得到一个返回的错误信息。 它只接受合理的输入,当然,它并不能防止你输入一个错误的名字。浏览器也接受输入数字, 所以如果你输入17的话,你会得到一个“Hi,17”的回应,所以这并不是一个完善的检查。
  第二个输入框比较好一点。输入一个简单的字符串,比如说你的名字,你会得到一个错误信息,(除非 你的名字中有一个@符号)。作为输入确认为是合法e-mail的标准是@符号。一个单独的@符也会被通过, 不过这当然并无意义。每一个Internet e-mail地址都有一个@符,所以在这里检查@符的存在是恰当的。

  那么生成这两个输入框以及输入确认的源代码是怎样的呢?下面就是:

<html>
<head>
<script language="JavaScript">
<!-- Hide

function test1(form) {
  if (form.text1.value == "")
    alert("Please enter a string!")
  else { 
   alert("Hi "+form.text1.value+"! Form input ok!");
  }
}

function test2(form) {
  if (form.text2.value == "" || 
      form.text2.value.indexOf('@', 0) == -1) 
        alert("No valid e-mail address!");
  else alert("OK!");
}
// -->
</script>
</head>

<body>
<form name="first">
请输入你的名字:<br>
<input type="text" name="text1">
<input type="button" name="button1" value="测试输入" onClick="test1(this.form)">
<P>
请输入 e-mail地址:<br>
<input type="text" name="text2">
<input type="button" name="button2" value="测试输入" onClick="test2(this.form)">
</body>

  首先我们来看一看body部分的HTML代码。我们在这儿生成了两个文本输入框和两个按钮。 按钮根据那个按钮被按下分别调用了两个函数test1(...)或test2(...)。我们通过 this.form 来给函数传递正确的参数。
  函数 test1(form)是用来测试字符串是否为空值的。它是通过 via if (form.text1.value == "")...来实现的。 'form' 是在函数调用中 'this.form'的值。我们通过联合使用“value”和form.text1来取得输入框中的 输入值,同时通过和“”作比较来确定输入的不是空值。 如果输入的字符串为“”那就说明没有输入。用户会得到一个返回的错误信息。 如果有输入用户会得到一个正确的返回信息。
  这儿的问题是用户会输入空格。这会被视为一个正确的输入!当然,如果你愿意的话 你能够检查这些可能同时排除它们。我想通过上面的信息你能够很容易的做到这一点。
  现在来看一看test2(form)函数。这个函数也是用来比较输入值,以确定输入的不是空值。 不过我们在IF 命令中增加了一些东西:或操作符 ||。你在本简介的第六部分已经学过它了。
  IF 命令检查它的前后,如果有一个是为真值的话,那么整个操作返回真值,将继续执行它下面的命令。 这也就是说在这儿,如果你输入一个空值,或字符串中没有@的话,你会得到一个返回的错误信息。

检查特定的字符

  有时候你必须在表单的输入中做一些限制,就象电话号码,你需要的只是数字。我们 能够检查输入是否是数字,但很多人的电话号码中有特殊的字符,象: 01234-56789, 01234/56789 或 01234 56789 (这中间有个空格)。你不能强迫用户在电话号码中不加入特殊的字符, 所以我们必须使我们的代码能够检查数字和一些特殊的字符。下面的例子是一个演示:

电话号码:

这儿是源代码:

<html>
<head>
<script language="JavaScript">
<!-- hide

// ******************************************************
// Script from Stefan Koch - Voodoo's Intro to JavaScript
//     http://rummelplatz.uni-mannheim.de/~skoch/js/ 
//       JS-book: http://www.dpunkt.de/javascript
//    You can use this code if you leave this message
// ******************************************************

function check(input) {
  var ok = true;

  for (var i = 0; i < input.length; i++) {
    var chr = input.charAt(i);
    var found = false;
    for (var j = 1; j < check.length; j++) {
      if (chr == check[j]) found = true;
    }
    if (!found) ok = false;
  }
 
  return ok;
}

function test(input) {

  if (!check(input, "1", "2", "3", "4",
        "5", "6", "7", "8", "9", "0", "/", "-", " ")) {

    alert("Input not ok.");
  }
  else {
    alert("Input ok!");
  }
}

// -->
</script>
</head>

<body>
<form>
Telephone:
<input type="text" name="telephone" value="">
<input type="button" value="Check"
  onClick="test(this.form.telephone.value)"> 
</form>
</body>
</html>

 函数 test() 指定了那些可用的字符。

输入的递交

  输入最简单的递交方法是通过 e-mail. 如果你想要服务器来处理输入,那你就需要通过 CGI( Common Gateway Interface)。它可以让你自动处理表单输入,比如服务器后建立一个 数据库来接收用户的输入。 另一个例子是Yahoo的索引页。那上面有一个输入框,可以让你搜索他们的数据库。 用户在按了递交键后很快可以得到回应。他不必等到管理服务器的人看到他的输入,然后为 他找出所需要得信息。这是由服务器自动完成的。Javascript不能做这样的事。
  你不能使用javascript来生成留言簿,因为Javascript不能在服务器上写一个文件。你只能通过CGI 来做这件事。当然你能为给你e-mail的人建立一个留言簿,但你必须手工输入用户反馈。当然 如果你不是一天受到1000个反馈邮件的话,这是完全可行的。
  这儿的代码是纯HTML,所以这儿不需要Javascript。除非你想在表单被递交前检查它的内容。我必须说明 这儿的mailto命令在Internet Explorer 3.0中并不被支持。

<FORM METHOD=POST ACTION="mailto:your.address@goes.here" enctype="text/plain">
<H3>Do you like this page?</H3>
  <INPUT NAME="choice" TYPE="RADIO" VALUE="1">Not at all.<BR>
  <INPUT NAME="choice" TYPE="RADIO" VALUE="2" CHECKED>Waste of time.<BR>
  <INPUT NAME="choice" TYPE="RADIO" VALUE="3">Worst site of the Net.<BR>
  <INPUT NAME="submit" TYPE="SUBMIT" VALUE="Send">
</FORM>

  enctype="text/plain" 部分是指定只传送纯文本而不要编码部分,这使传送来的mail 可读性更好。

  如果你想在表单被传送前检查它的内容,你可以使用onSubmit 事件处理器,你必须把这个事件处理器放在 <form>符号中,就象这样:

function validate() {
  // check if input ok
  // ...

  if (inputOK) return true
    else return false;
}

...

<form ... onSubmit="return validate()">

...

  运用以上代码你就可以在表单内容被传送前检查它的内容。

如何处理特定元素

  通过使用focus() 方法,你可以使你的表单对用户更加友好,你可以把光标聚焦在特定的元素上 或在输入出错后把光标聚焦在错误的输入上。这也就是说,浏览器会把光标放在特定的表单单元上,这样 用户就不必在输入前利用单击来定位。你可以利用下面的代码来实现:

function setfocus() {
  document.first.text1.focus();
}

这段代码会聚焦在第一个文本元素上,你必须给整个表定义一个名字:在这儿叫 first, 而那个表单元素叫:text1。如果你想在表单一被载入时就聚焦到这个单元,那你只需在 <body> 标记符中使用 onLoad 特性,就象这样:

<body onLoad="setfocus()">

我们利用这段代码来扩展它的功能:

function setfocus() {
  document.first.text1.focus();
  document.first.text1.select();
}

试试这段代码:

你可以看到光标聚焦到了文本元素上,输入被选择了。