<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>拖拽demo</title>
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<style type="text/css">
#container {
width:100%;
white-space:nowrap;
padding:0px;
}
.item{
border-style:solid;
border-width:1px;
border-color:#000;
width:200px;
height:200px;
float:left;
}
.item img{
width:100px;
height:100px;
}
.hide{
display:none;
}
.btn{
border:0;
background-color:none;
}
.maskDiv{position: absolute; top: 0%; left: 0%; width: 100%; height: 100%; background-color: black; z-index:1001; -moz-opacity: 0.7; opacity:.70; filter: alpha(opacity=70);}
</style>
<script>
//定义控件
var srcdiv=null;//拖动的源
function allowDrop(ev){
ev.preventDefault();
}
function drag(ev,divdom){
srcdiv=divdom;
ev.dataTransfer.setData("text/html",divdom.innerHTML);
}
function drop(ev,divdom){
ev.preventDefault();
if(srcdiv!=divdom){
srcdiv.innerHTML=divdom.innerHTML;
divdom.innerHTML=ev.dataTransfer.getData("text/html");
}
}
var currentReViewImgIndex=0;
//预览图片
function reViewImgGroup(widgetId,uuid,el){
$("#mask"+widgetId).removeClass("hide");
var url=$("#img"+uuid).attr("src");
//console.info($("#img"+uuid));
$("#reviewImg"+widgetId).attr("src",url);
//计算出当前是第几张图片
var item=$(el).parent().parent();
//console.info(item);
//var itemList=$("#"+widgetId).find(".item");
var itemList=$(".item");
for(var i=0;i<itemList.length;i++){
//console.info($(itemList[i]));
var img=$(itemList[i]).find("img");
//console.info($(img).attr("id"));
if("img"+uuid==$(img).attr("id")){
currentReViewImgIndex=i;
console.info(currentReViewImgIndex);
break;
}
}
}
//上一张图片
function preImg(widgetId){
var itemList=$(".item");
//console.info(currentReViewImgIndex);
var _index=currentReViewImgIndex-1;
if(_index<0){
_index=0;
}
var item=itemList[_index];
//拿出该位置的图片
var img=$(item).find("img");
var url=$(img).attr("src");
$("#reviewImg"+widgetId).attr("src",url);
currentReViewImgIndex=_index;
}
//下一张图片
function nextImg(widgetId){
var itemList=$(".item");
var len=itemList.length-2;
//console.info(currentReViewImgIndex);
var _index=currentReViewImgIndex+1;
//console.info("_index="+_index);
if(_index>len){
//console.info(1111111);
_index=len;
}
var item=itemList[_index];
//拿出该位置的图片
var img=$(item).find("img");
var url=$(img).attr("src");
$("#reviewImg"+widgetId).attr("src",url);
currentReViewImgIndex=_index;
}
function deleteImg(el,imgId,deleteServer){
var item=$(el).parent().parent();
$(item).remove();
if(imgId&&deleteServer){
//执行删除图片动作
console.info(deleteServer+"删除图片["+imgId+"]");
}
}
(function(){
var _widget={
_id:null,
_el:null,
_config:null,
_srcItem:null,//移动的源
_init:function(options){
var self=this;
self._config=options||{};
self._render();
self._bind();
},
_render:function(){
var self=this;
var c=self._config;
//在最开始加入一个空的格子,即新增图片按钮
//最后再加一个空的
var _html='<div id="lastItem'+self._id+'" class="item">'
+' <p class="itemName"></p>'
+' <p style="text-align:center;"><a id="addBtn'+self._id+'" style="text-decoration:none;font-size:20px;" href="javascript:void(0);">上传图片</a></p>'
+' <p class="hide"><input id="fileEl'+self._id+'" type="file" multiple /></p>'
+'</div>';
//预览图片层
_html+='<div id="mask'+self._id+'" class="maskDiv hide">'
+' <div style="width: 60%;height: 50%;background-color: white;margin:210px;">'
+' <div style="float:left;"><a href="javascript:preImg(\''+self._id+'\');">上一张</a></div>'
+' <img id="reviewImg'+self._id+'" style="float:left;height:100%;width:auto;" src="" />'
+' <span style="float:left;"><a href="javascript:nextImg(\''+self._id+'\');">下一张</a></span>'
+' </div>'
+'</div>';
$(self._el).html(_html);
if(c.data){
self.loadData(c.data);
}
},
_bind:function(){
var self=this;
var c=self._config;
//新增按钮点击事件
$("#addBtn"+self._id).click(function(){
//触发文件域点击事件
$("#fileEl"+self._id).click();
});
//文件域改变事件
$("#fileEl"+self._id).change(function(e1){
if(!$(this).val()||$(this).val()==""){
return;
}
console.log(e1);
var fileArr=e1.currentTarget.files;
console.log(fileArr);
for(var i=0;i<fileArr.length;i++){
var file=fileArr[i];
var fileName=file.name;
(function(imgName){
var reader=new FileReader();
reader.readAsDataURL(file);
//读取文件过程方法
reader.onloadstart=function(e){
console.log("开始读取....");
}
reader.onprogress=function(e){
console.log("正在读取中....");
}
reader.onabort=function (e){
console.log("中断读取....");
}
reader.onerror=function (e){
console.log("读取异常....");
}
reader.onload=function(e){
console.log("成功读取....");
console.log(e);
var imgMsg={
name:imgName,//获取文件名
base64:this.result//reader.readAsDataURL方法执行完后,base64数据储存在reader.result里
}
var _uuid=Math.random()+"";
_uuid=_uuid.replace(".","");
//创建显示域
var _html='<div class="item" ondrop="drop(event,this)" ondragover="allowDrop(event)" draggable="true" ondragstart="drag(event, this)">'
+' <p id="fileName'+_uuid+'" class="itemName">'+imgName+'</p>'
+' <p><a href="javascript:void(0);"><img id="img'+_uuid+'" class="itemUrl" style="width:100%;" src="" /></a></p>'
//+' <p><input id="'+_uuid+'" onchange="uploadFile(this,\''+_uuid+'\',\''+uploadServer+'\')" type="file" /></p>'
+' <p><button class="btn" type="button" onclick="reViewImgGroup(\''+self._id+'\',\''+_uuid+'\',this)">预览</button> <button class="btn" type="button" onclick="deleteImg(this)">删除</button></p>'
+'</div>';
$("#lastItem"+self._id).before(_html);
//模拟上传
var c=0;
var _task=setInterval(function(){
c++;
if(c==6){
clearInterval(_task);
$("#img"+_uuid).attr("src",imgMsg.base64);
}else{
var _text=$("#fileName"+_uuid).text();
$("#fileName"+_uuid).html(_text+".");
}
},1000);
}
})(fileName);
}
});
//遮罩层点击隐藏事件
$("#mask"+self._id).click(function(e){
//console.info(e.currentTarget);
//console.info(e.target);
if($(e.target).hasClass("maskDiv")){
$(this).addClass("hide");
}
});
//上一张图片
//下一张图片
},
loadData:function(list){
var self=this;
//console.info(list);
var c=self._config;
var uploadServer=c.uploadFileServer;
var deleteServer=c.deleteServer;
var _html='';
for(var i=0,len=list.length;i<len;i++){
var item=list[i];
var _uuid=Math.random()+"";
_uuid=_uuid.replace(".","");
_html+='<div class="item" ondrop="drop(event,this)" ondragover="allowDrop(event)" draggable="true" ondragstart="drag(event, this)">'
+' <p id="fileName'+_uuid+'" class="itemName">'+item.name+'</p>'
+' <p><a href="javascript:void(0);"><img id="img'+_uuid+'" idata="'+item.id+'" class="itemUrl" style="width:100%;" src="'+item.url+'" /></a></p>'
//+' <p><input id="'+_uuid+'" type="file" onchange="uploadFile(this,\''+_uuid+'\',\''+uploadServer+'\')" /></p>'
+' <p><button class="btn" type="button" onclick="reViewImgGroup(\''+self._id+'\',\''+_uuid+'\',this)">预览</button> <button class="btn" type="button" onclick="deleteImg(this,'+item.id+',\''+deleteServer+'\')">删除</button></p>'
+'</div>';
}
$("#lastItem"+self._id).before(_html);
},
getItemList:function(){
var self=this;
var values=[];
var list=$(self._el).find(".item");
for(var i=0,len=list.length;i<len;i++){
var el=list[i];
var _url=$(el).find(".itemUrl").attr("src");
if(!_url||_url==""){
continue;
}
var item={
name:$(el).find(".itemName").text(),
url:_url,
sort:i
}
//console.info($(el).html());
values.push(item);
}
return values;
}
}
//封装成jquery的控件
$.fn.DropWidget=function(options){
//生成uuid
var uuid=(new Date()).getTime();
var r=(Math.random()+"").replace(".","");
uuid+=r;
var _o=$.extend({},_widget);//后面的覆盖前面的
_o._id=uuid;
_o._el=this;
var _c=$.extend({},options,$.fn.DropWidget.defaults);//后面的覆盖前面的
_o._init(_c);
return _o;
}
})();
</script>
</head>
<body>
<div id="container"></div>
<div style="clear:both;"><a id="getDataBtn" href="javascript:void(0);">获取信息</a></div>
<script>
(function(){
//初始化数据
var list=[{
id:1,
name:"图片1.jpg",
sort:1,
url:"http://img.keaitupian.cn/uploads/2021/05/25/4mth1r3dpiu.jpg!c220x220"
},{
id:2,
name:"图片2.jpg",
sort:2,
url:"https://t12.baidu.com/it/u1=4168097894&u2=1474642762&fm=76"
},{
id:3,
name:"图片3.jpg",
sort:3,
url:"https://lupic.cdn.bcebos.com/20191203/3015983714_14.jpg"
}];
//list=[];
//初始化控件
var _w=$("#container").DropWidget({
data:list,
uploadFileServer:"http://www.upload.json",
deleteServer:"http://www.delete.json"
});
//获取数据
$("#getDataBtn").click(function(){
var values=_w.getItemList();
console.info(values);
});
})();
</script>
</body>
</html>
Copy the code
The renderings are as follows: