用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来保存,事实 ...
随机推荐
- 学长小清新题表之UOJ 14.DZY Loves Graph
学长小清新题表之UOJ 14.DZY Loves Graph 题目描述 \(DZY\)开始有 \(n\) 个点,现在他对这 \(n\) 个点进行了 \(m\) 次操作,对于第 \(i\) 个操作(从 ...
- 微信小程序setData局部刷新列表
利用setData局部刷新列表 当列表管理加载到第几页时,这个list的数据有十几条的,如果重新setData的话就要重新刷新和渲染列表, 这是个比较麻烦的事,当数据量大时,就会造成白屏, 这时就要局 ...
- 提升团队幸福感之:集成 GitLab && JIRA 实现自动化工作流
佛罗伦萨 - 圣母百花圣殿(图) 前言 GitLab 和 Jira 是平时开发过程中使用非常高频的代码管理系统(开发人员)和项目管理系统(项目管理),通过两套系统的协作完成平常大多数的功能开发,但是两 ...
- 【有向图】强连通分量-Tarjan算法
好久没写博客了(都怪作业太多,绝对不是我玩的太嗨了) 所以今天要写的是一个高大上的东西:强连通 首先,是一些强连通相关的定义 //来自度娘 1.强连通图(Strongly Connected Grap ...
- Spring Boot系列(一):Spring Boot快速开始
一.Spring Boot介绍 Spring Boot可以很容易的创建可直接运行的独立的基于Spring的应用程序. 功能特点: 创建独立的Spring应用程序: 直接嵌入Tomcat.Jetty等W ...
- 上手了RabbitMQ?再来看看它的交换机(Exchange)吧
人生终将是场单人旅途,孤独之前是迷茫,孤独过后是成长. 楔子 本篇是消息队列RabbitMQ的第三弹. RabbitMQ的入门和RabbitMQ+SpringBoot的整合可以点此链接进去回顾,今天要 ...
- (趣味哈哈镜)JMF中摄像头相关的问题
JMF已经非常古老了.最近由于做实验的需要,不得不使用JMF处理视频.开发使用win10系统和eclipse.使用中的问题如下: 1.首先想要使用JMF需要必须安装32位JDK,同时编译软件也需要是3 ...
- 分享一个bootstrap的上一步,下一步的插件
效果图: 下载链接: https://www.daimabiji.com/index.php?m=content&c=down&a_k=ae0fI1gZyLT7oao56Pgu-dye ...
- Pytools1.0.0发布啦!
大家赶紧来看看,特别好用的. 文档: This is pytools modulethe module is use MIT license MIT License Copyright (c) 202 ...
- C++数的表示
二进制B 八进制O 十进制D 十六进制H / 0x十六进制 十进制数转换成R进制数:整数部分除基取余,上右下左:小数部分乘基取整,上左下右. 浮点数的阶用一种称为移码的编码表示方法,方便对阶.阶的 ...