`
lifengbin184437
  • 浏览: 3024 次
  • 性别: Icon_minigender_2
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

如何检测HTML表单已经发生改变

阅读更多

如何检测HTML表单已经发生改变


表单是Web应用不可缺少的功能,它是服务器端与浏览器端数据交换的最基本的方法。你应该已经读过很多关于HTML5和Javascript的表单标签和数据验证的文章,然而今天我们来讨论下如何检查表单数据是否被改变了。

为什么要检查表单数据被更新?

有很多理由需要检测表单数据是否有修改,让我们来看一个很常见的场景,如果用户修改了一个或多个表单域的值,当用户跳离当前页面时,你会给出用户类 似“你的修改尚未保存”的提示。你甚至可以给出用户是否保存数据(比如Ajax)的选项。另外的情况,如果表单项没有被修改,这时略去冗余的表单验证和数 据发送将会增强用户体验。

Javascript onchange事件

为HTML表单元素添加onchange事件处理器是一种可行的方法,这也是用的最多的,但是onchange的实现有一些问题存在:

  1. 如果用户改变表单域的值,然后再修改回原始值,程序仍将认为表单的修改已经发生。
  2. 如果表单项的值是通过Javascript动态修改的,onchange事件不会被自动触发。
  3. 为每一个表单元素增加onchange事件会引起性能问题,特别是较大的表单。
  4. 如果将表单元素从DOM中增加或移除,你需要相应的注册或移除事件侦听。
  5. checkbox和radio的onchange事件在某些浏览器下不能按预期工作(你应该知道是哪个浏览器)。
  6. 除了onchange,还有更简单有效的方案。

比较默认值

幸运的是,我们不需要为了复杂的事件处理而写过多的废话,每个表单元素都有与该对象相关联的默认值,即页面加载完后表单控件显示或者默认的数据值,该值可与用户操作后的值进行对比以得出表单域的值是否发生了改变。

有点不幸的是,不同类型的表单元素的默认值属性(properties)不尽相同(做些判断好了,并不影响什么)

文本域input和textarea

让我们从简单的元素开始,所有的textarea对象和除了checkbox、radio之外的 input对象都有一个名为defaultValue的属性,我们可以对比文本域的当前值和默认值是否相同以决定文本域的修改是否发生。

<!-- name input -->
< input  type = "text"  id = "name"  name = "name"  value = "www.csser.com"  />
< script >
var name = document.getElementById("name");
if (n.value != n.defaultValue) alert("#name has changed");
</ script >

小提示 :HTML4 或XHTML中,文本域类型为text、hidden、password或file的对象有defaultValue属性。HTML5新的表单类型也有 defaultValue属性并且可以用相同的方式检测默认值是否改变过,这些新表单元素包含email、tel、url、range、date、 color和search。

checkbox和radio

checkbox和radio对象有一个defaultChecked属性,其取值为true或false,我们可以通过对比当前选中状态与默认选中状态进行比较,如:

<!-- newsletter opt-in -->
< input  type = "checkbox"  id = "optin"  name = "optin"  checked = "checked"  />
< script >
var optin = document.getElementById("optin");
if (n.checked != n.defaultChecked) alert("#optin has changed by csser");
</ script >

注意checkbox和radio对象也有defaultValue属性,但它仅被分配给元素的value特性(attribute)而不能标识当前的选中状态。

下拉列表select

select控件通常用于提供一个下拉列表供用户选择,相比上面提到的控件,select有一点复杂,select元素本身并不具有默认值属性,它 的默认值存在于其option元素集合内。当页面加载完毕,默认选中的option拥有selected特性,也就是这个option对象拥有 defaultSelected属性且值为true。

我们可以从select节点的selectedIndex属性取得当前选中的option的索引值,如果该option对象的defaultSelected属性为false,那么select控件的值一定被修改了,如:

<!-- job title select box -->
< select  id = "job"  name = "job" >
     < option >web designer</ option >
     < option  selected = "selected" >csser.com developer</ option >
     < option >graphic artist</ option >
     < option >IT professional</ option >
     < option >other</ option >
</ select >
< script >
var job = document.getElementById("job");
if (!job.options[job.selectedIndex].defaultSelected) alert("#job has changed");
</ script >

上面的代码在单选下拉列表并且有一个option拥有selected特性时运行正常,但我们需要留意一些陷阱:

  1. 如果没有option被赋予selected特性,浏览器会将第一个设为默认选中,但其defaultSelected属性值却为false
  2. 如果两个或更多option拥有selected特性(这不合逻辑,但是可能的),每个option都会拥有defaultSelected属性且值为true,但是浏览器仅能得到最后一个的默认值。
  3. 多重选择控件允许用户选择任意个option:
<!-- skills multi-select box -->
< select  id = "skills"  name = "skills"  multiple = "multiple" >
     < option  selected = "selected" >HTML</ option >
     < option  selected = "selected" >CSSer</ option >
     < option  selected = "selected" >JavaScript</ option >
     < option >PHP</ option >
</ select >

多选下拉列表并不常用,因为用多个checkbox可以提供更友好的界面,但是,如果使用多选下拉列表,多个option具有 defaultSelected属性且值为true,select节点的selectedIndex属性已经无效,所以需要循环每一个option才能判 断其selected属性是否与其defaultSelected属性相匹配。下面的代码可以解决这个问题:

var   skills = document.getElementById( "skills" ),
     c =  false , def = 0, o, ol, opt;
for  (o = 0, ol = n.options.length; o < ol; o++) {
     opt = skills.options[o];
     c = c || (opt.selected != opt.defaultSelected);
     if  (opt.defaultSelected) def = o;
}
if  (c && !skills.multiple) c = (def != skills.selectedIndex);
if  (c) alert( "#skills has changed" );

上面这些就是本文介绍的如何检测一个表单值是否改变的内容。


原文:如何检测HTML表单已经发生改变

 

分享到:
评论

相关推荐

    HTML表单事件大全

    ### HTML表单事件详解 #### 一、基本概念与作用 HTML 表单事件是网页交互设计中的重要组成部分,主要用于监听用户与表单元素之间的互动,并根据这些互动执行相应的脚本逻辑。通过合理利用表单事件,开发者可以构建...

    js 验证表单中的值是否改变

    本文将深入探讨如何使用JavaScript来验证表单中的值是否发生改变,以便在用户提交表单前进行必要的数据校验。 首先,我们需要理解表单(`&lt;form&gt;`)元素在HTML中的作用。表单用于收集用户输入的数据,通常包含各种...

    HTML5-input表单控件调用代码_html5_表单_input_代码_控件_

    3. `onchange`:值发生改变且失去焦点时触发。 4. `oninput`:值发生改变时立即触发。 六、实战示例 以下是一个包含多种`input`类型的简单表单: ```html &lt;label for="email"&gt;Email: &lt;label for="password"&gt;...

    泛微移动建模常见问题-表单页面,由一个字段的变化改变另一个字段的只读、编辑、必填状态

    具体来说,当某个字段的值发生变化时,根据预设条件,可以动态调整其他相关字段的属性,如只读、编辑、必填状态。这类场景在业务流程中很常见,如在工作流处理的不同阶段,需要对填写字段的权限进行不同的控制。 ...

    js 验证表单 动态提示

    它通常发生在用户尝试提交表单之前,通过JavaScript进行客户端验证,可以减少服务器端的负担,提高用户体验。动态提示是指在用户输入过程中即时显示验证结果,而不仅仅是提交后才告知错误。 1. **事件监听**:在...

    vue实现表单未编辑或未保存离开弹窗提示功能

    2. 当检测到数据变化时,如果用户尝试离开当前页面,提示用户是否保存数据。 3. 根据用户的选择决定是否允许用户离开。 ### 使用Quasar Framework Quasar是一个基于Vue.js的框架,它提供了丰富的UI组件。使用...

    Element UI表单设计及代码生成器,支持可视化拖拽、代码下载、界面设计等。

    4. 自动化生成:除了基本的表单元素外,该工具可能还支持根据数据库模型自动生成表单,这样当后端数据结构发生变化时,前端表单也能随之更新,减少了前后端协同工作的复杂性。 5. 万能表单:这意味着这款工具不仅...

    js实时动态验证表单是否合法

    - **oninput事件**:当输入框内容发生变化时触发,适合实时验证。 - **onblur事件**:当元素失去焦点时触发,可做离线验证。 - **onchange事件**:当元素的值改变且失去焦点时触发,适用于提交前验证。 4. **...

    Vue2实时监听表单变化的示例讲解

    如果发现任何一个属性值发生变化,就将unChange设置为false,表示表单数据有变化。若遍历结束没有发现任何变化,则将unChange设置为true,表示表单数据没有变化。 methods对象包含组件的方法,如addSubmit方法,在...

    获取表单内容差异,支持文本提示和表格展示

    HTML表单是用户输入数据的界面,而JavaScript可以方便地访问和操作这些数据。通过`document.getElementById`或`document.querySelector`方法,我们可以选取特定的表单元素。例如,对于一个ID为`myForm`的表单,我们...

    jQuery Mobile 表单

    在 jQuery Mobile 中,表单的基本HTML结构与标准HTML表单相似,但需要添加特定的CSS类以实现jQuery Mobile的样式和功能。一个简单的表单可能如下所示: ```html 文本输入: 选择框: 选项1 选项2 多行...

    javascript表单事件汇总

    `onchange`事件在表单元素(如下拉列表、文本框等)中的值发生改变时触发。这是收集用户输入、更新数据库或执行其他基于输入变化的操作的关键时机。例如,当用户在下拉菜单中选择不同的选项时,可以即时显示相关信息...

    实用的html5注册和登录表单页面模板.zip

    表单验证不仅可以发生在服务器端,也可以通过JavaScript在客户端进行。这样可以减少无效请求,减轻服务器压力。例如,JavaScript可以检查必填字段是否为空,密码是否符合特定规则,以及电子邮件格式是否正确。 5. ...

    处理表单和表单元素事件

    在这个例子中,`clearText()`函数会在用户聚焦文本框时清除默认提示文字,`check()`函数在失去焦点时检查帐号格式,而`compute()`函数在数量输入框(`onChange`)的值发生变化时计算总价。 命令按钮对象通常用于提交...

    VueWeb 用户表单新增diolog表单

    在用户表单中,这意味着当用户的输入发生变化时,绑定的变量会立即更新,反之亦然。这对于实时获取用户输入的数据并进行处理至关重要。 3. 条件渲染:在设计diolog表单时,经常需要根据不同的情况显示不同的表单...

    深入理解html表单输入监听

    onchange事件会在元素的内容发生改变,并且元素失去焦点后触发。这意味着,当用户在表单元素中输入信息后,如果继续进行了其他操作导致该元素失去焦点,onchange事件才会被触发。例如,在一个文本输入框中,用户输入...

    js带有登录提示验证的表单脚本代码

    2. 事件监听:JS可以监听用户的操作,如点击事件(onclick)、输入事件(oninput)等,当这些事件发生时执行相应的函数。 三、表单验证 1. 验证函数:在JS中,我们可以编写函数来检查用户输入的数据是否符合预期...

    jQuery表单动画切换效果.zip_jQuery表单动画切换效果

    在` AnimatedFormSwitching `文件中,可能定义了` animate()`函数或者其他自定义的动画方法,以控制元素的样式属性(如透明度、位置、大小等)随时间变化,从而实现平滑过渡。 `说明.htm`文件可能是一个简单的HTML...

    基于Html5+SVG制作gsap输入邮箱订阅表单特效代码.zip

    另一个可能的效果是,当用户输入有效邮箱后,提交按钮会逐渐显示出来,同时表单背景的颜色会发生微妙的变化,以给予用户积极的反馈。 为了使这些特效在不同设备上一致,开发者需要考虑响应式设计。这可能涉及到使用...

    jQuery实现带Tooltip表单验证的注册表单.zip

    4. **绑定事件监听器**:使用jQuery的`.on()`方法,为表单的输入事件(如`input`或`blur`)添加监听器,当输入发生变化时触发验证。 5. **显示Tooltip**:如果输入无效,使用jQuery的`.tooltip()`方法创建一个...

Global site tag (gtag.js) - Google Analytics