效果描述: 图片代表物品,图片在有宽高的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自带拖拽做出购物车效果的作业题的更多相关文章

  1. 商品呢拖拽到购物车,appendChild的剪切功能

    今天来到了妙味课堂的html5课程的第2张的第8节,讲的是把商品拖拽到购物车的演示.其中有一个关于appendChild的使用,,每次拖拽都会触发这个方法,但是每次之后,却还是只有一个总价,好吧,说不 ...

  2. H5中的拖拽事件

    最近浏览了张鑫旭大神的基于HTML5 drag/drop模块拖动插入排序删除完整实例,感觉受益匪浅.于是将最做的demo记录下来. 首先浏览一下事件,这些事件比较好记,只要记住用在谁的身上就好了,无非 ...

  3. Android 可拖拽的GridView效果实现, 长按可拖拽和item实时交换

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17718579),请尊重他人的辛勤劳动成果,谢谢! 在And ...

  4. [ActionScript 3.0] AS3 拖拽混动效果之一

    package { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; impor ...

  5. JQuery Dialog(JS模态窗口,可拖拽的DIV) 效果实现代码

    效果图 调用示意图   交互示意图 如上图所示,这基本是JQueryDialog的完整逻辑流程了. 1.用户点击模态窗口的“提交”按钮时,调用JQueryDialog.Ok()函数,这个函数对应了用户 ...

  6. 实现一个宽和高都是100像素的div可以用鼠标拖拽移动的效果

    html,body{ width:100%;height:100%;margin:0px;padding:0px; } #box{ width:100px;height:100px;backgroun ...

  7. 仿h5拖拽

    在h5中有个拖拽的声明式命令,就如html属性一样,简单强大. 而在网页上拖拽的功能还是需求很大的,所以对这方面应该去仔细了解一下. 所以仿一一下它的实现.只是仿了它的复制一份到目标容器的功能.它还有 ...

  8. html5拖拽实现

    1.需求 做一个h5正方形的拖拽框 2.分析 使用touchstart,touchmove,touchend这3个事件实现. 需要记录的数据有三组数据,分别是下图的(x0,y0),(x1,y1),(x ...

  9. HTML5之拖拽(兼容IE和非IE)

    前世:项目中需要拖动div,然后和某个div进行位置交换,这不是关键,关键是还要保存位置,然后在下次打开的时候按照保存的位置显示.还好本人功力深厚,一下子就想到了用localStorage来保存,事实 ...

随机推荐

  1. 个人电脑搭建ftp----------------2

    个人电脑搭建ftp 从上一次搭建好的局域网继续完成我的后续. 打开windows10 控制面板 点击启用或关闭windows功能 找到Internet Information Services,开启所 ...

  2. eric4 打包文件

    在.py 工程 所在目录: 按住shift,鼠标右键,在此处打开cmd或shell,然后如下操作 1.打包成文件夹 pyinstaller lrs.py 2.打包成 单文件 pyinstaller - ...

  3. vue-cli的安装及版本查看/更新

    vue-cli的安装及版本查看更新 vue-cli安装 npm install vue-cli -g vue-cli的版本查看 vue -V vue-cli的3.0+以后使用的不是vue-cli了,如 ...

  4. Spring Security自定义认证页面(动态网页解决方案+静态网页解决方案)--练气中期圆满

    写在前面 上一回我们简单分析了spring security拦截器链的加载流程,我们还有一些简单的问题没有解决.如何自定义登录页面?如何通过数据库获取用户权限信息? 今天主要解决如何配置自定义认证页面 ...

  5. 如何满足EN50128软件安全认证标准?

    导语 EN 50128是为铁路行业的特定需求量身定制的功能安全标准.其标题为“铁路应用—通信,信号和处理系统—铁路控制和防护系统软件”.遵守该标准的要求对于铁路软件开发是至关重要的.因此,必须了解什么 ...

  6. Java面试题(RabbitMQ篇)

    RabbitMQ 135. rabbitmq 的使用场景有哪些? ①. 跨系统的异步通信,所有需要异步交互的地方都可以使用消息队列.就像我们除了打电话(同步)以外,还需要发短信,发电子邮件(异步)的通 ...

  7. efcore技巧贴-也许有你不知道的使用技巧

    前言 .net 环境近些年也算是稳步发展.在开发的过程中,与数据库打交道是必不可少的.早期的开发者都是DbHelper一撸到底,到现在的各种各样的ORM框架大行其道.孰优孰劣谁也说不清楚,文无第一武无 ...

  8. 面试:为了进阿里,死磕了ThreadLocal内存泄露原因

    前言 在分析ThreadLocal导致的内存泄露前,需要普及了解一下内存泄露.强引用与弱引用以及GC回收机制,这样才能更好的分析为什么ThreadLocal会导致内存泄露呢?更重要的是知道该如何避免这 ...

  9. C++ int与char[]的相互转换

    C++ int与char[]的相互转换 一.itoa函数与atio函数①把int类型数字转成char类型,可以使用itoa函数. itoa函数原型: char*itoa(int value,char* ...

  10. 力扣Leetcode 1518. 换酒问题

    小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒.你购入了 numBottles 瓶酒. 如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的. 请你计算 最多 能喝到多少瓶酒. 示例: ...