用H5自带拖拽做出购物车效果的作业题
效果描述: 图片代表物品,图片在有宽高的div上方显示,把图片拖放到设置好的div里面,并且在div里面显示图片的信息:价格,物品名,数量。如果拖放有重复,只是在div里面让物品的数量加1,最后计算出所有拖放物品的价格之和,并且显示在div里面,利用appendChild的的剪贴行,保证在计算价格的时候总是在所计算价格的物品的下一行。

下面是代码:
HTML+CSS布局
<ul id="ul1">
<li draggable="true">
<img src="imgs/1.jpg" >
<p>物品1</p>
<p>50¥</p>
</li>
<li draggable="true">
<img src="imgs/2.jpg" >
<p>物品2</p>
<p>40¥</p>
</li>
<li draggable="true">
<img src="imgs/3.jpg" >
<p>物品3</p>
<p>30¥</p>
</li>
<li draggable="true">
<img src="imgs/4.jpg" >
<p>物品4</p>
<p>20¥</p>
</li>
</ul>
<div id="div1">
<p>
<span class="box2">物品名</span>
<span class="box3">物品个数</span>
<span class="box1">物品价格</span>
</p>
*{margin:; padding:;}
li{list-style: none}
#ul1 li{float: left;margin: auto 5px; border: 1px solid #000}
#ul1 img{width:270px;height:400px;}
#ul1 li p{ text-align:center; border-bottom: 1px solid #000 }
#div1{clear: both;border:1px solid ;width:1125px;height: 200px;position: relative}
#div1 p{border:1px dashed #ccc}
#div1 p span{ margin-left: 200px}
.allMoney{float: right}
下面是JS:
物体拖思路,首先是拖拽物体的ondragstart事件下,使用DataTransfer对象过滤被拖动元素。利用DataTransfer对象获取数据值。
var oLi=document.getElementsByTagName('li');
var oDiv=document.getElementById('div1');
var obj={};//利用json查重
var num=0;//计算总钱数
var allMoney=null;
var i=0;
for(i=0;i<oLi.length;i++){
oLi[i].ondragstart=function(ev){
// this指的是oLi[i],
var oP=this.getElementsByTagName('p');
ev.dataTransfer.setData('name',oP[0].innerHTML);
ev.dataTransfer.setData('price',oP[1].innerHTML);
ev.dataTransfer.setDragImage(this,0,0);//让拖动照片里选中li标签里面的所有内容
};
}
然后是物体放:放的时候应当是创建标签,并设置标签的内容分别为name的值的price的值, countMoney(),是计算总钱数的函数。
oDiv.ondragover=function(){
//阻止默认事件,否则无法ondrop
return false
};
oDiv.ondrop=function(ev){
//在ondrop事件中getData
var name=ev.dataTransfer.getData('name');
var price=ev.dataTransfer.getData('price');
//判断内容是否一致
//原理:建造一个JSON格式,JSON对象的属性没有name的属性(obj[name]!=1),继续造标签,
//放odiv里面,并设置obj[name]=1,否则box1的innerHTML+1,原理在else那边写着。
if(obj[name]!=1){
//统一生成p标签
var ap=document.createElement('p');
//先生成box2,里面盛放的是物品的名字
var aspan1=document.createElement('span');
aspan1.className='box2';
aspan1.innerHTML=name;
//再生成box3,里面盛放的是物品的价格
var aspan3=document.createElement('span');
aspan3.className='box3';
aspan3.innerHTML=price;
//最后生成box1,里面盛放的是物品的个数
var aspan2=document.createElement('span');
aspan2.className='box1';
aspan2.innerHTML=1;
//把aspan加到生的p标签里面
ap.appendChild(aspan1);
ap.appendChild(aspan2);
ap.appendChild(aspan3);
//把p标签都加在div里面
oDiv.appendChild(ap);
//不重复后,把obj[name]的值设为1
obj[name]=1;
countMoney();
return false;
}
else{
//有重复的物品,他们物品个数会重复加1
//原理:如果是重复的,那么先判断重复的box2的内容和name是否一致,box2里面的
//内容放的是物品的名字为什么要用for语句遍历呢,简单的理解就是name的获取也是根据遍历得到的
//如果一致的话让box1的数值加一即可,注意box1的数值是字符串,必须要转成数值,再加一。
var oBox1=document.getElementsByClassName('box1');
var oBox2=document.getElementsByClassName('box2');
var i=0;
for(i=0;i<oBox2.length;i++){
if(oBox2[i].innerHTML==name){
oBox1[i].innerHTML=parseInt(oBox1[i].innerHTML)+1;
}
}
countMoney();
}
计算总钱数的函数,这个函数必须放在ondrop函数里面。
function countMoney(){
//如果没有allMoney的span,那么就生成一个allmoney。
if(!allMoney){
allMoney=document.createElement('div');
allMoney.className='allMoney';
}
num+=parseInt(price);
allMoney.innerHTML='合计为:'+num+'¥';
oDiv.appendChild(allMoney);
//如果有allMoney,就只能它的数值增加就行。
}
总结:我觉得这里面值得注意的有两点点,一是查重,首先是建一个空的json,然后判断json的里是否的有name这个属性,如果有,只是让其的数量的值+1,如果没有没话继续新建child,并置json[name]=1;,二是如何建一个总价格的div标签,并让其innerHTML的值为所有价格总和,这时候就有一个小技巧,就是先判断有没有先建的div标签,没有的话,建立div标签,设置className,如果有只是改变数值,本来oDiv.appendChild(allMoney);应该在if里面,但是为了让每次添加一个物品项,合计价格在物品项下面,就把其放在if外面,利用了appendChild的剪贴性。这两点是我觉得应该注意的和思考的。
这个例子就是我学H5自带拖拽事件学到的知识。
用H5自带拖拽做出购物车效果的作业题的更多相关文章
- 商品呢拖拽到购物车,appendChild的剪切功能
今天来到了妙味课堂的html5课程的第2张的第8节,讲的是把商品拖拽到购物车的演示.其中有一个关于appendChild的使用,,每次拖拽都会触发这个方法,但是每次之后,却还是只有一个总价,好吧,说不 ...
- H5中的拖拽事件
最近浏览了张鑫旭大神的基于HTML5 drag/drop模块拖动插入排序删除完整实例,感觉受益匪浅.于是将最做的demo记录下来. 首先浏览一下事件,这些事件比较好记,只要记住用在谁的身上就好了,无非 ...
- Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换
转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17718579),请尊重他人的辛勤劳动成果,谢谢! 在And ...
- [ActionScript 3.0] AS3 拖拽混动效果之一
package { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; impor ...
- JQuery Dialog(JS模态窗口,可拖拽的DIV) 效果实现代码
效果图 调用示意图 交互示意图 如上图所示,这基本是JQueryDialog的完整逻辑流程了. 1.用户点击模态窗口的“提交”按钮时,调用JQueryDialog.Ok()函数,这个函数对应了用户 ...
- 实现一个宽和高都是100像素的div可以用鼠标拖拽移动的效果
html,body{ width:100%;height:100%;margin:0px;padding:0px; } #box{ width:100px;height:100px;backgroun ...
- 仿h5拖拽
在h5中有个拖拽的声明式命令,就如html属性一样,简单强大. 而在网页上拖拽的功能还是需求很大的,所以对这方面应该去仔细了解一下. 所以仿一一下它的实现.只是仿了它的复制一份到目标容器的功能.它还有 ...
- html5拖拽实现
1.需求 做一个h5正方形的拖拽框 2.分析 使用touchstart,touchmove,touchend这3个事件实现. 需要记录的数据有三组数据,分别是下图的(x0,y0),(x1,y1),(x ...
- HTML5之拖拽(兼容IE和非IE)
前世:项目中需要拖动div,然后和某个div进行位置交换,这不是关键,关键是还要保存位置,然后在下次打开的时候按照保存的位置显示.还好本人功力深厚,一下子就想到了用localStorage来保存,事实 ...
随机推荐
- Android 找不到所标识的资源 java.lang.NoSuchFieldError: No static field XXX of type I in class Lcom/XX/R$id
报错: java.lang.NoSuchFieldError: No static field XXX of type I in class Lcom/XXX/R$id; or its supercl ...
- 创建SpringMVC项目
学习SpringMVC框架第一步,先创建一个简单项目,了解流程.使用的是Eclipse+Tomcat9.0 创建项目springmvc 新建Dynamic Web Project File->N ...
- SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- JavaScript学习系列博客_4_JavaScript中的数据类型
JavaScript中有6种数据类型 一.基本数据类型 - String 字符串 JS中的字符串需要使用引号引起来双引号或单引号都行 但是要注意的是某种引号嵌套使用的话,需要加上 \ 转义.比如说我们 ...
- SparkSQL DSL 随便写写
@Testdef functionTest() = { Logger.getLogger("org").setLevel(Level.WARN) val spark = getSp ...
- java进阶(10)--String(StringBuff、StringBuilder)
一.基本概念 1.String为引用数据类型,使用双引号 2.字符串数组存储在方法区的内存池,因为开发过程种使用过于频繁 3.String类已经重写了equals,比较时使用,同时也重写了toStri ...
- 新手学习java路线
关于新手学习java的路线 笔者也是根据这个路线学习的,希望对你们有所帮助. 首先你要确定你是学习java 并且能够踏踏实实的走下去.一定要多学习,我也可以一直陪你走下去的. 笔者一年工作经验,科班毕 ...
- Redis+Kafka异步提高并发
Redis+Kafka异步提高并发 Redis+Kafka异步提高并发 设计 实现 提交请求接口 Kafka消费队列 异步处理Service 客户端轮询获取结果 Redis集群节点配置 KafKa集群 ...
- [NOIP2018]保卫王国 题解
NOIP2018提高组D2T3 ddp虽然好想,但是码量有点大(其实是我不会),因此本文用倍增优化树形DP来解决本题. 题意分析 给一棵树染色,每个节点染色需要一定的花费,要求相邻两个节点至少要有一个 ...
- 也谈基于Web的含工作流项目的一般开发流程
项目包含的通用模块代码等我有时间一并剥离贡献出来(基于WebSocket的通知引擎,工作流整合模块,自定义表单,基于RBAC权限设计),最近太忙了,Web项目有一段时间没碰,有点生疏的感觉,主要在忙G ...