效果描述: 图片代表物品,图片在有宽高的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. Java继承后访问成员的特点

    继承后的特点--成员变量 对象访问成员变量时,会先在子类中查找有没有定义对应的变量,若子类中存在就会就近使用子类中的变量,若子类中没有定义就会沿着继承关系往上找有没有定义相应的变量,若父类中也没有则编 ...

  2. Scala的安装和配置

    1.Windows下搭建Scala开发环境 1)Scala需要Java运行时库,安装Scala需要首先安装JVM虚拟机并配置好,推荐安装JDK1.8 2)在http://www.scala-lang. ...

  3. springMVC入门(五)------统一异常处理

    简介 系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过异常捕获获取异常信息,后者需通过规范代码.提高代码路绑定减少运行时异常的发生 异常处理思路:无论dao层.ser ...

  4. 微服务项目整合Ocelot+IdentityServer4

    项目搭建肯定少不了认证和授权,传统的单体应用基于cookie和session来完成的. 因为http请求是无状态的,每个请求都是完全独立的,服务端无法确认当前请求之前是否登陆过.所以第一次请求(登录) ...

  5. 第三篇 Scrum冲刺博客

    一.会议图片 二.项目进展 成员 完成情况 今日任务 冯荣新 商品列表,商品详情轮播图 商品底部工具栏,购物车列表 陈泽佳 历史足迹,静态页面 渲染搜索结果,防抖的实现 徐伟浩 未完成 商品信息录入 ...

  6. HM16.0之PCM模式——xCheckIntraPCM

    参考:https://blog.csdn.net/cxy19931018/article/details/79781042 1.源代码: /** Check R-D costs for a CU wi ...

  7. Hive 常见面试题(二)

    1.Hive行转列和列转行如何实现? 行转列 使用 concat_ws 实现行转列. 例如: select user_id, concat_ws(',',collect_list(order_id)) ...

  8. composer版本号前面`^`和`~`的区别

    ~1.2.3表示: 1.2.3 <= 版本号 < 1.3.0 ^1.2.3表示: 1.2.3 <= 版本号 < 2.0.0 ~1.2 表示: 1.2.0 <= 版本号 & ...

  9. 遍历查找集合或者数组中的某个元素的值 java代码 详解 Android开发

    import java.util.Scanner; public class Test21 { public static void main(String[] args) { //定义并初始化数组 ...

  10. 【原】“Error getting 'android:label' attribute”

    项目上线过程中遇到“Error getting 'android:label' attribute: attribute is not a string value”这个错误. 备忘下:是因为有act ...