js實(shí)現(xiàn)QQ郵箱郵件拖拽刪除功能
本文實(shí)例為大家分享了js實(shí)現(xiàn)QQ郵箱郵件拖拽刪除的具體代碼,供大家參考,具體內(nèi)容如下
步驟分析:
- 根據(jù)數(shù)據(jù)結(jié)構(gòu)生成HTML結(jié)構(gòu)
- 全選和單選功能的實(shí)現(xiàn),以及當(dāng)其為選中狀態(tài)時(shí)它的父級(jí)的顏色變化的
- 點(diǎn)擊刪除,刪除結(jié)構(gòu)同時(shí)刪除數(shù)據(jù)
- 給每一個(gè)li綁定mousedown,tip顯示,并且定位在鼠標(biāo)位置
- 鼠標(biāo)移動(dòng)時(shí),tip跟隨,取消默認(rèn)行為
- 碰撞檢測(cè)是否拖到“已刪除”項(xiàng)
- 鼠標(biāo)松開(kāi)、刪除結(jié)構(gòu)和數(shù)據(jù)
過(guò)程實(shí)現(xiàn)
HTML代碼
<body>
<div class="wrap" id="box">
<header class="head clear">
<h1 class="left">
<a class="logo" href="javascript:;" ></a>
|
<a href="javascript:;" >郵箱</a>
</h1>
<nav class="left">
<a href="javascript:;" >郵箱首頁(yè)</a>|<a href="javascript:;" >設(shè)置</a>
</nav>
<p class="hint1 left"></p>
<p class="hint2 left"></p>
</header>
<div class="section clear">
<div class="fuList left">
<ul class="fuListBig">
<li class="writeLetter">寫信</li>
<li class="collectLetter">收信</li>
<li class="address">通訊錄</li>
</ul>
<ul class="fuListSmall">
<li class="inbox active">收件箱</li>
<li class="StarMail">星標(biāo)郵件</li>
<li class="groupMail">群郵件</li>
<li class="draftBox">草稿箱</li>
<li class="beenSent">已發(fā)送</li>
<li class="beenDel hover">已刪除<a class="clearBtn" href="#" >清空</a></li>
<li class="dustbin">垃圾箱<a class="clearBtn" href="#" >清空</a></li>
</ul>
</div>
<div class="tBody left">
<div class="title">
收件箱(共96封,其中<a href="javascript:;" >未讀郵件</a>9封)
</div>
<div class="emailFunctions">
<a id="delet" href="javascript:;" >刪除</a>
<a href="javascript:;" >徹底刪除</a>
<a href="javascript:;" >轉(zhuǎn)發(fā)</a>
<a href="javascript:;" >舉報(bào)</a>
<a href="javascript:;" >全部標(biāo)為已讀</a>
<a class="selectIcon" href="javascript:;" >標(biāo)記為...</a>
<a class="selectIcon" href="javascript:;" >移動(dòng)到...</a>
</div>
<div class="emailList" id="emailCheckList">
<header class="emailHead">
<input type="checkbox" />
<p><span></span><span></span></p>
</header>
<ul class="emailListUl">
<!-- <li>
<input type="checkbox">
<div>
<span>秒味課堂1</span>
<span>2015-12-30</span>
</div>
<p>JS拖拽的進(jìn)一步學(xué)習(xí),移動(dòng)與拉伸JS拖拽的進(jìn)一步練習(xí)</p>
</li> -->
</ul>
</div>
</div>
</div>
</div>
<div id="hint3" style="display:none;">選中2封郵件</div>
JS代碼
這里需要引入碰撞函數(shù)檢測(cè)的封裝函數(shù)和數(shù)據(jù),但在實(shí)際的應(yīng)用一般是通過(guò)ajax從后臺(tái)獲取數(shù)據(jù),所以此處就不在寫模擬的數(shù)據(jù),只記錄一下我的寫作步驟。
<script>
window.onload = function(){//利用map方法和es6生成HTML結(jié)構(gòu)
var html = list.map(function(item){
return `<li>
<input type="checkbox" data-id = "${item.id}">
<div>
<span>${item.caption}</span>
<span>${item.time}</span>
</div>
<p>${item.desc}</p>
</li>`
}).join(' ');
var oEmailListUl = document.querySelector('.emailListUl');
oEmailListUl.innerHTML = html;
var checkedAll = document.querySelector('.emailHead input');
var checkSingle = oEmailListUl.querySelectorAll('input');
var singleLen = checkSingle.length;
var n = 0;
var isAll = true;
checkedAll.onclick = function(){//全選效果的實(shí)現(xiàn)
for(var i=0; i<singleLen; i++){
checkSingle[i].checked = this.checked;
}
for(var j=0; j<singleLen;j++){//單選效果的實(shí)現(xiàn)
if(this.checked) {//如果取消選擇,則將父級(jí)的顏色恢復(fù)為未選中狀態(tài)的顏色
checkSingle[j].parentNode.style.background = '#f2f6f9';
}else{//如果選擇,則將父級(jí)li的顏色變?yōu)檫x中的顏色
checkSingle[j].parentNode.style.background = '';
}
}
}
for(var i=0; i<singleLen;i++){
checkSingle[i].onclick = function(){
if(!this.checked){//單擊單選按鈕時(shí),如果是取消選擇,則讓全選的按鈕也為未選中狀態(tài),否則的話如果是讓其變?yōu)檫x中狀態(tài)時(shí),先要看看其他的單選按鈕是不是也都是選中狀態(tài),如果是的話,就讓全選按鈕也成為選中狀態(tài)
checkedAll.checked = false;
this.parentNode.style.background = '';
}else{
this.parentNode.style.background = '#f2f6f9';
for(var j=0; j<singleLen;j++){
if(!checkSingle[j].checked){
isAll = false;//只要有一個(gè)單選按鈕是未選中狀態(tài),那么isAll就為false,所以全選按鈕就不能是選中狀態(tài),如果,都是選中狀態(tài),那么,這段代碼不執(zhí)行,所以isAll還是true, 那么全選按鈕就變?yōu)檫x中狀態(tài)
}
}
if(isAll){
checkedAll.checked = true;
}
}
}
}
function checkInput(){//將單選按鈕中是選中狀態(tài)的放入一個(gè)數(shù)組中
var arr = [];
for(var i=0; i<singleLen; i++){
if(checkSingle[i].checked){
arr.push(checkSingle[i]);
}
}
return arr;
}
//刪除數(shù)據(jù)和結(jié)構(gòu)
var oDelet = document.querySelector('#delet');
oDelet.onclick = function(){
del();
}
function del(){
var select = checkInput();
for(var i=0; i<select.length;i++){//刪除HTML結(jié)構(gòu)中選中的input的父級(jí)
select[i].parentNode.remove();
//刪除json中的數(shù)據(jù)
for(var j=0; j<list.length;j++){
if(list[j].id ==select[i].dataset.id){
list.splice(j,1);
}
}
}
}
var tip = document.querySelector('#hint3');
var aLi = document.querySelectorAll('.emailListUl li');
var delx = document.querySelector('.beenDel');
var m = 0;
for(var i=0; i<aLi.length; i++){
aLi[i].onmousedown = function(){
var isTr = false;
var chInput = this.querySelector('input');
if(!chInput.checked){
return;
}
tip.style.display = 'block';
tip.innerHTML = `選中${checkInput().length-m}封郵件`;//放入到數(shù)組中的數(shù)據(jù)是總共的數(shù)據(jù),所以要先減去,上次刪除的數(shù)據(jù),才是這次要?jiǎng)h除的數(shù)據(jù)
document.onmousemove = function(ev){
var ev = event||ev;
ev.preventDefault();//默認(rèn)情況下,選中狀態(tài)拖拽時(shí),會(huì)選中瀏覽器中的文字,所以要取消默認(rèn)事件
tip.style.left = ev.clientX + 1+ 'px';
tip.style.top = ev.clientY + 1+'px';
if(collision(tip,delx)){
isTr = true;
}
}
document.onmouseup = function(ev){
tip.style.display = 'none';
if(isTr){
del();
m=`${checkInput().length}`;//記錄總共刪除的數(shù)據(jù)
}
document.onmousemove = document.onmouseup = null;
}
}
}
}
</script>
上面就是我的總結(jié),有什么問(wèn)題或疑問(wèn)歡迎提問(wèn)和賜教。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
javascript實(shí)現(xiàn) 在光標(biāo)處插入指定內(nèi)容
javascript實(shí)現(xiàn) 在光標(biāo)處插入指定內(nèi)容...2007-05-05
JS庫(kù)中的Particles.js在vue上的運(yùn)用案例分析
這篇文章主要介紹了JS庫(kù)中的Particles.js在vue上的運(yùn)用案例分析,需要的朋友可以參考下2017-09-09
DIV+CSS+JS不間斷橫向滾動(dòng)實(shí)現(xiàn)代碼
不間斷橫向滾動(dòng)想必大家在很多場(chǎng)合都有見(jiàn)過(guò)吧,本文也使用DIV+CSS+JS實(shí)現(xiàn)一個(gè),感興趣的你可以參考下哈,希望對(duì)你學(xué)習(xí)有所幫助2013-03-03
js獲取圖片base64的正確實(shí)現(xiàn)方式
這篇文章主要給大家介紹了關(guān)于js獲取圖片base64的正確實(shí)現(xiàn)方式,BLOB是二進(jìn)制大對(duì)象,是一個(gè)可以存儲(chǔ)二進(jìn)制文件的容器,?在計(jì)算機(jī)中BLOB常常是數(shù)據(jù)庫(kù)中用來(lái)存儲(chǔ)二進(jìn)制文件的字段類型,需要的朋友可以參考下2024-01-01
IE中直接運(yùn)行顯示當(dāng)前網(wǎng)頁(yè)中的圖片 推薦
IE中直接運(yùn)行顯示當(dāng)前網(wǎng)頁(yè)中的圖片 推薦...2006-08-08
JavaScript利用切片實(shí)現(xiàn)大文件斷點(diǎn)續(xù)傳
斷點(diǎn)續(xù)傳即在文件上傳期間因?yàn)橐恍┰蚨鴮?dǎo)致上傳終止時(shí),下次再次上傳同一個(gè)文件就從上一次上傳到一半的地方繼續(xù)上傳,以節(jié)省上傳時(shí)間。本文將利用切片實(shí)現(xiàn)大文件斷點(diǎn)續(xù)傳功能,快來(lái)跟隨小編一起學(xué)一學(xué)吧2022-03-03
echarts柱狀圖坐標(biāo)軸內(nèi)容顯示不全的兩種解決辦法
本文主要介紹了echarts柱狀圖坐標(biāo)軸內(nèi)容顯示不全的兩種解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

