《HTML5实战》——2.3 计算金额总计,显示表单输出结果

2.3 计算金额总计,显示表单输出结果

上一节用data-*属性将键/值对数据和数量字段联系起来,将< output >元素添加到每个产品的购买金额总计和整个订单金额总计上。然而,在现在的状态下,订单似乎并不关心用户在数量字段输入的值,总金额依旧是$0.00。

本节主要学习内容

  • 如何使用valueAsNumber属性,以数字形式读取输入值。
  • 如何从data-*属性中获取数据。
  • 如何更新< output >元素。
    本节将使用data-*属性与< output >元素来计算金额总计,然后把结果显示在用户的浏览器上。主要有以下4步内容。
  • 第1步:添加函数来计算总数。
  • 第2步:获取输入字段的数量值。
  • 第3步:获取价格值并分别算出各个产品与整个订单的金额总计。
  • 第4步:在订单中显示更新后的金额总计。
    2.3.1 构建计算函数

下面,我们就来创建在订单中执行计算的函数。

第1步:添加函数,计算总金额
如代码清单2-7所示,从DOM中获取相关字段(quantity、item_total、order_total),在每一个数量字段中建立事件侦听器,只要用户修改了数量值,就能计算出总金额。计算代码并没有放在该代码清单中,本章稍后部分再来添加它。

打开app.js,将代码清单2-7中的代码放到init函数中,紧挨着放在代码行“saveBtn. addEventListener('click', saveForm, false);”后面。

接下来我们看一下HTML5新引入的valueAsNumber属性,它能获取input字段元素值的数字形式。
valueAsNumber属性
qtyFields[i]输入元素的value属性,用JavaScript可以读取该元素的当前值,但返回值经常是字符串。虽然用parseFloat可以将这种值转变为浮点数,但HTML5有一个新的解决方法,那就是利用valueAsNumber属性。
比如,当你读取number输入类型的valueAsNumber属性,该属性就能返回一个浮点数。如果将一个浮点数赋予number输入类型的valueAsNumber属性,该属性就会将这个浮点数转换为字符串。
在date和time字段中使用valueAsDate属性

无独有偶,在date与time字段中,同样也存在一个valueAsDate属性,它的作用类似于valueAsNumber属性。当用它获取一个日期相关字段的值时,就会返回一个Date对象。而且与valueAsNumber类似,也可以用该属性将该字段的值设为一个Date对象。
valueAsNumber属性只能用于那些支持number这种新输入类型的浏览器。如果浏览器不支持这种输入类型,要回退到一个常规的文本输入,那就只好用JavaScript的parseFloat函数来解决了。所以,对于HTML5方案和回退方案来说,下列语句都可以读取字段的浮点数:

同样,对于修改字段的浮点数值而言,下列语句也是等同的:

那为什么要使用valueAsNumber,而不继续使用parseFloat呢?

现在,你可能要问:“既然parseFloat能在所有浏览器上用,那为什么还非得要用valueAsNumber呢?”这是因为,valueAsNumber能够更简洁地实现浮点数与字符串的转换。不过,虽然使用valueAsNumber要比使用parseFloat更有效率一些,但在大多数Web应用中,这种性能的微小提升基本上显现不出来。在W3C的邮件列表上,就曾有人质疑过valueAsNumber的有效性。为此,HTML5编辑lan Hickson拿出了一个递增字段值的用例,以证明valueAsNumber的确要比parseFloat简洁,代码如下:

https://yqfile.alicdn.com/3d640c183e9d748dbace9f3d1fdc0ddd77ab9705.png" >

第2步:取回quantity输入字段的值
在订单的订单明细部分中,可以使用valueAsNumber属性来获取每种产品的quantity字段值。还记得代码清单2-7中那个空的for循环吗?现在就将代码清单2-8所示的代码加进去。

为了获取每个产品的价钱,就需要读取HTML5的data-*属性值,下面我们就来实现它。

2.3.2 获取data-*属性的值
前文介绍了在HTML5中,如何利用data-属性将键/值对数据绑定到元素上。当你想在元素上添加额外的数据,以便轻松获取或用在JavaScript代码上时,这种数据就显得非常重要了。读取data-属性的方法很简单:每个元素都有dataset属性,内含该元素所有的data-*属性。dataset属性中的每一项都有一个键名,它和该元素标签中的键名一一对应,不过没有data-前缀。代码清单2-4中用data-price属性定义出产品价格,要想取回这个价格值,就需要用下面这行代码:

警告
假如用连字符连接data-*属性名,那么dataset属性就会将它以驼峰命名法表现出来。例如,如果属性名为data-person-name,那么读取时就需要这么写:element.dataset. personName,而不能用element.dataset-name。
dataset属性是HTML5新引入的,还未能被所有浏览器所支持。幸好,有一种适用于所有浏览器的回退方案(对的,你没看错,是所有的浏览器,甚至是IE6),这就是getAttribute方法。利用它获取data-price属性值的代码为:

第3步:取回各产品价格值,计算单种产品的总金额以及订单总金额
下面,我们就获取每种产品的价格值,将它乘以产品的购买数量,来计算每种产品的总金额,继而得出订单的总金额。将代码清单2-9所示的代码添加到上一步完成的代码中,让它位于for循环的闭合花括号之前。

现在,已经计算出了每种产品的总金额以及订单的总金额,只需利用< output >元素将这些数值显示到表单中即可。对于那些支持< output >元素的浏览器来说,向该元素内写入数值,就能从表单中访问它了,比如:

https://yqfile.alicdn.com/b1fadcc4cbf0caecfa6e1977ed8798eb97e75581.png" >

为了更新< output >元素的值,可以如下设定value属性:

对于那些不支持< output >的浏览器该怎么办?

要想在不支持< output >元素的浏览器中使用该元素,需要给该元素分配一个ID,并且使用document.getElementById:

https://yqfile.alicdn.com/7ccc09c0c75a74b10bf15fe2cc8b48e9ceb32bd2.png" >

要想更新元素值,可以设定innerHTML属性:

接下来,让我们来更新订单总金额。

第4步:在订单中显示更新的订单总金额
将代码清单2-10所示的代码添加到app.js,让它紧跟步骤3完成后的代码后面,但仍在for循环的结束花括号之前。

试试看

截至目前,每种产品的总金额以及整个订单的总金额应该已经可以正常显示出来了。在现代的浏览器中加载页面,改变每种商品数量字段中的数值,你会注意到两种总金额都会相应地改变,如图2-9所示。

https://yqfile.alicdn.com/b55f177296bbcc9620d692a1835119c2dd8439ec.png" >

现在,表单可以计算总金额,并且能够验证输入的数据,但如果要添加其他能够显示自定义错误消息提示的验证功能,该怎么办呢?在下一节,我们就使用约束验证API来实现自定义验证,还要利用CSS3来格式化无效字段。

时间: 2024-08-30 13:11:55

《HTML5实战》——2.3 计算金额总计,显示表单输出结果的相关文章

《HTML5实战》——第2章 创建表单:输入小部件、数据绑定以及数据验证

第2章 创建表单:输入小部件.数据绑定以及数据验证 本章主要内容 新的HTML5输入类型与属性 data-*属性,valueAsNumber元素以及output元素 约束验证API 绕过数据验证的方法 CSS3伪类 利用Modernizr进行HTML5特性侦测,利用polyfill进行回退兼容随着Web的日益成熟,用户开始需求更为丰富的表单字段类型及小部件,他们希望能有一种在各种Web应用中都通用的统一标准,特别是当涉及到数据验证时.HTML5充分迎合了这种需求,提供了13种新的表单输入类型,其

《HTML5实战》——导读

前言 写一本能够较为全面介绍HTML5内容的书远比想象更为困难.首先,浏览器和规范本身一直在改变,似乎无论半年内写了多少东西,浏览器总会对一个实现加以调整,从而让几章的内容都失效.这就会让整个写作过程反复,很难再为章节确定最终版本.另外,我们还看到许多关于HTML5的书仅仅上市几个月后,内容就完全过时了.这种情况更让我们感到,与其继续追逐这种更新与前沿,我们最终还是决定专注讨论较为坚实一些的Web应用技术,这些内容不会随着HTML5的发展有太大的改动. 本书起初时只有Robert Crowthe

《HTML5实战》——2.2 构建表单用户界面

2.2 构建表单用户界面 本节要完成的构建用户界面的任务有:定义HTML文档结构,构建表单的各个部分,以及让用户来决定究竟是保存还是提交表单的细节信息. 本节主要学习内容 利用HTML5表单< input >元素类型及属性来提供小部件及数据验证. 利用data-*属性来保存每种产品的价格. 使用< output >元素来呈现单种产品金额小计与订单金额总计. 使用表单属性formnovalidate和formaction绕过验证,保存未完成的表单. 整个UI的构建工作按照以下7步进行

《HTML5实战》——附录A HTML5与相关标准A.1 HTML5的起源

附录A HTML5与相关标准 HTML5实战本附录主要内容 HTML5规范的开发 常见的一些已获W3C承认的HTML5规范(非草案) 与HTML5相关的一些常见规范像HTML5.CSS3.Node.js这些流行词,你经常能在一些场合遇到.有很多人用HTML5来描述各种新兴涌现的Web技术,HTML5俨然已成为一种"百宝箱"般的存在.比如,本书的一位作者就曾遇到一位市场营销人员,他这么说道:"我能利用HTML5创建一个为SEO优化过的视频游戏."这些人至少也应该了解一

中国北车近日签订了若干重大合同,金额总计77亿元人民币

将于未来两年内交付合同标的,总金额占公司2009年度主营业务收入的19.05% 中国北车股份有限公司(601299.SH,下称中国北车)29日宣布,公司近日签订了若干重大合同,合同标的金额总计77亿元人民币. 其中单笔金额最大的一笔,是与北京市轨道交通建设管理有限公司签订的价值30亿元的地铁车辆销售合同.公告中称,该批车辆将用于北京市地铁6号线的建设. 中国北车还获得了中国铁路建设投资公司三笔大额订单,分别为23.5亿的C70型通用敞车,11.1亿元25G型客车销售合同,以及价值5.8亿元的货车

天气预报特约收看广告中标金额总计为2.3516亿

11月18日,2010年CCTV黄金资源广告招标启动.天气预报特约收看广告中标金额总计达到2.3516亿元.其中,最高中标价为3227万元. 天气预报特约收看广告中标企业以及金额分别为: 2月中标企业48号,中标金额2222万: 3月中标企业388号,中标金额2326万: 4月中标企业58号,中标金额2047万: 5月中标企业388号,中标金额2376万: 8月中标企业48号,中标金额2010万: 9月中标企业626号,中标企业2310万: 10月中标企业898号,中标金额2927万: 11月中

WML学习(五):显示表单

显示 显示表单类似于HTML的<FORM>,<fieldset>可用来包括一组表单选项,但不是必须的.前面说过,当<card>的ordered设置为false时,手机可以显示一个概要CARD来总结有效的选项,方便用户从中选取表单选项来填写,概要CARD就是根据<fieldset>和独立的输入框<input>以及选单<select>来总结的.语法为, <fieldset title="label">表单内

java-JAVA基础计算题以及星号图形输出问题

问题描述 JAVA基础计算题以及星号图形输出问题 JAVA中有关运算符优先级的计算题,如y+=z--/++x-x的计算题,大概十道就够用了,快考试了急!还有就是图形输出的问题,星号正三角倒三角还有菱形,寻找for里面的空格星号和循环的关系有没有什么小技巧-在线等谢谢- 解决方案 那些图形的输出是有规律的,正三角形是先输出空格后星号,而倒三角形便是反的.按正三角形为例:一般为三个for循环嵌套在一起,一个大for循环控制行数,另一个(小的)就控制空格的输出个数,另一个小for循环就控制星号的个数其

WML学习之五 显示表单_WML教程

显示表单 类似于HTML的<FORM>,<fieldset>可用来包括一组表单选项,但不是必须的.前面说过,当<card>的ordered设置为false时,手机可以显示一个概要CARD来总结有效的选项,方便用户从中选取表单选项来填写,概要CARD就是根据<fieldset>和独立的输入框<input>以及选单<select>来总结的.语法为, <fieldset title="label">表单内容&