在JavaScript中,常用的表单事件有3种。

  • (1)onfocus和onblur
  • (2)onselect
  • (3)onchange

实际上,除了上面这几个,还有一个onsubmit事件。不过onsubmit事件一般都是结合后端技术来使用,所以暂时可以不管。

一、onfocus和onblur

onfocus表示获取焦点时触发的事件,而onblur表示失去焦点时触发的事件,两者是相反操作。

onfocus和onblur这两个事件往往都是配合一起使用的。例如用户准备在文本框中输入内容时,此时它会获得光标,就会触发onfocus事件。当文本框失去光标时,就会触发onblur事件。

并不是所有的HTML元素都有焦点事件,具有“获取焦点”和“失去焦点”特点的元素只有2种。

  • (1)表单元素(单选框、复选框、单行文本框、多行文本框、下拉列表)
  • (2)超链接

判断一个元素是否具有焦点很简单,我们打开一个页面后按Tab键,能够选中的就是具有焦点特性的元素。在实际开发中,焦点事件(onfocus和onblur)一般用于单行文本框和多行文本框这两个,其他地方比较少用。

举例:搜索框

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <style type="text/css"> #search{color:#bbbbbb;} </style> <script> window.onload = function () { //获取元素对象 var oSearch = document.getElementById("search"); //获取焦点 oSearch.onfocus = function () { if (this.value == "百度一下,你就知道") { this.value = ""; } }; //失去焦点 oSearch.onblur = function () { if (this.value == "") { this.value = "百度一下,你就知道"; } }; } </script> </head> <body> <input id="search" type="text" value="百度一下,你就知道"/> <input type="button" value="搜索" /> </body> </html>

浏览器预览效果如下图所示。

分析:

在这个例子中,当文本框获得焦点(也就是有光标)时,提示文字就会消失。当文本框失去焦点时,如果没有输入任何内容,提示文字会重新出现。从这里小伙伴们可以感性认识到“获取焦点”和“失去焦点”是怎么一回事。

上面搜索框的外观还有待改善,不过技巧已经交给大家了。我们可以动手尝试去实现一个更加美观的搜索框,会从中学到很多东西。

像上面这种搜索框的提示文字效果,其实我们也可以使用HTML5表单元素新增的placeholder属性来实现,代码如下:

<input id="search" type="text" placeholder="百度一下,你就知道" />

对于焦点事件来说,还有一点要补充的。默认情况下,文本框是不会自动获取焦点的,而必须点击文本框才会获取。但是我们却经常看到很多页面一打开的时候,文本框就已经自动获取到了焦点,例如百度首页(大家可以去看看)。那么这个效果是怎么实现的呢?很简单,一个focus()方法就可以轻松搞定。

举例:focus()方法

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script> window.onload = function () { var oTxt = document.getElementById("txt"); oTxt.focus(); } </script> </head> <body> <input id="txt" type="text"/> </body> </html>

浏览器预览效果如下图所示:

分析:

focus()跟onfocus是不一样的。focus()是一个方法,仅仅用于让元素获取焦点。而onfocus是一个属性,它是用于事件操作的。

二、onselect

在JavaScript中,当我们选中“单行文本框”或“多行文本框”中的内容时,就会触发onselect事件。

举例:

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script> window.onload = function () { var oTxt1 = document.getElementById("txt1"); var oTxt2 = document.getElementById("txt2"); oTxt1.onselect = function () { alert("你选中了单行文本框中的内容"); }; oTxt2.onselect = function () { alert("你选中了多行文本框中的内容"); }; } </script> </head> <body> <input id="txt1" type="text" value="如果我真的存在,也是因为你需要我。"/><br /> <textarea id="txt2" cols="20" rows="5">如果我真的存在,也是因为你需要我。</textarea> </body> </html>

浏览器预览效果如下图所示。

分析:

当我们选中单行文本框或多行文本框中的内容时,都会弹出对应的对话框。onselect事件在实际开发中用得极少,我们了解一下就行,不需要深入。

再回到实际开发中,我们在使用搜索框的时候,每次点击搜索框,它就自动帮我们把文本框内的文本全选中了(大家先去看看百度搜索是不是这样的),这个又是怎么实现的呢?这就用到了select()方法。

举例:select()方法

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script> window.onload = function () { var oSearch = document.getElementById("search"); oSearch.onclick = function () { this.select(); }; } </script> </head> <body> <input id="search" type="text" value="百度一下,你就知道" /> </body> </html>

浏览器预览效果如下图所示。

当我们点击文本框时,预览效果如下图所示。

分析:

select()跟onselect是不一样的。select()是一个方法,仅仅用于全选文本。而onselect是一个属性,它是用于事件操作的。select()和onselect的关系,跟focus()和onfocus的关系是相似的。

三、onchange

在JavaScript中,onchange事件常用于“具有多个选项的表单元素”。

  • (1)单选框选择某一项时触发。
  • (2)复选框选择某一项时触发。
  • (3)下拉列表选择某一项时触发。

举例:单选框

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script> window.onload = function () { var oFruit = document.getElementsByName("fruit"); var oP = document.getElementById("content"); for (var i = 0; i < oFruit.length; i++) { oFruit[i].onchange = function () { if (this.checked) { oP.innerHTML = "你选择的是:" + this.value; } }; } } </script> </head> <body> <div> <label><input type="radio" name="fruit" value="苹果" />苹果</label> <label><input type="radio" name="fruit" value="香蕉" />香蕉</label> <label><input type="radio" name="fruit" value="西瓜" />西瓜</label> </div> <p id="content"></p> </body> </html>

浏览器预览效果如下图所示。

当我们选中任意一项时,就会立即显示出结果来,效果如下图所示。

分析:

这里我们使用getElementsByName ()方法获得具有同一个name属性值的表单元素,然后使用for循环遍历,目的是为了给每一个单选按钮都添加onchange事件。当我们选中任意一个单选按钮(也就是触发onchange事件)时,判断当前单选按钮是否选中(this.checked)。如果选中,就将选中的单选按钮的值(this.value)赋值给oP.innerHTML。

举例:复选框的全选与反选

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script> window.onload = function () { var oSelectAll = document.getElementById("selectAll"); var oFruit = document.getElementsByName("fruit"); oSelectAll.onchange = function () { //如果选中,即this.checked返回true if (this.checked) { for (var i = 0; i < oFruit.length; i++) { oFruit[i].checked = true; } } else { for (var i = 0; i < oFruit.length; i++) { oFruit[i].checked = false; } } }; } </script> </head> <body> <div> <p><label><input id="selectAll" type="checkbox"/>全选/反选:</label></p> <label><input type="checkbox" name="fruit" value="苹果" />苹果</label> <label><input type="checkbox" name="fruit" value="香蕉" />香蕉</label> <label><input type="checkbox" name="fruit" value="西瓜" />西瓜</label> </div> </body> </html>

浏览器预览效果如下图所示。

分析:

当【全选】复选框被选中时,下面所有复选框就会被全部选中。然后再次点击【全选】按钮,此时下面所有复选框就会被取消选中。

哪个元素在搞事(触发事件),this就是哪个。我们一定要非常清楚这一点,因为后面会经常碰到。

举例:下拉列表

<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title></title> <script> window.onload = function () { var oList = document.getElementById("list"); oList.onchange = function () { var link = this.options[this.selectedIndex].value; window.open(link); }; } </script> </head> <body> <select id="list"> <option value="http://wwww.baidu.com">百度</option> <option value="http://www.sina.com.cn">新浪</option> <option value="http://www.qq.com">腾讯</option> <option value="http://www.sohu.com">搜狐</option> </select> </body> </html>

浏览器预览效果如下图所示。

分析:

当我们选择下拉列表的某一项时,就会触发onchange事件,然后就会在新的窗口打开对应的页面。下拉菜单这种效果还是比较常见的,我们可以了解一下。

对于select元素来说,我们可以使用obj.options[n]的方式来得到某一个列表项,这个列表项也是一个DOM对象。并且还可以使用obj.selectedIndex来获取你所选择的这个列表项的下标。这两个都是下拉列表所独有的也是经常用的方法。

此外,window.open()表示打开一个新的窗口,对于这个我们在“13.2 窗口操作”这一节会详细介绍。

有一点要提醒大家的:选择下拉列表的某一项时,触发的是onchange事件,而不是onselect事件。onselect事件仅仅在选择文本框中的内容时才会触发,我们要清楚这两者的区别。