APICloud(九):上拉加载数据和长按事件

本文介绍如何在APICloud中实现上拉加载更多数据及长按删除功能。针对上拉加载数据,只需监听scrolltobottom事件并结合ajax调用即可。而对于长按事件,由于APICloud未直接提供解决方案,文中详细阐述了借助hammer.js库实现指定区域长按事件的过程,并结合实际项目场景给出具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1、上拉加载数据,APICloud提供了方法:只要监听scrolltobottom事件就好了。当滚动条滚动到最低端时就会触发该事件,然后通过ajax调用数据就好。

 

2、长按事件:这个事件APICloud倒是也有提供,只是针对的范围不是太大就是太小。我所接触到的有长按事件的目前只要两个:一个是整个window的长按事件,一个是预览图片时长按事件(可以用来保存、删除图片什么的,前面的博客中有提到)。对于指定区域的长按事件却没有提供方法

 

而最近写的功能,需要用到这个长按事件。基本业务还是拿微信的朋友圈来说吧。

 

自己除了可以看公共的朋友圈列表之外,更能够看自己的,且可以删除自己发的朋友圈。目前微信的做法是在每一条朋友圈时间的后面加了“删除”字样,通点击“删除”字样来删除选中的朋友圈。

 

当然,我这边也可以这样子写,但是因为最开始的时候并没有添加删除的功能(这也是个失误,什么维护功能没有删除啊),也就是没有对应的位置来放置删除按钮了,现在再来添加代码未免显得有点麻烦而且可能对别的功能有影响,再加上个人觉得加个“删除”字样太low太没新意,就想着能不能长按删除。

 

前面说过了APICloud没有提供指定区域长按事件,只能找别的方法了,最后找到了hammer.js,这个小东西功能虽不多但是很实用,都是一些常用的功能,有相关需要的可以学习一下。

以下是长按方法的基本使用:

/*DIV的结构
<div style="border:#058 4px solid;width:200px;height:200px;margin:0 auto;" 
id="longPressDiv"></div>
*/

var div = document.getElementById("longPressDiv");
var hammertime = new Hammer(div);
hammertime.on("press", function (e) {
	//alert("长按测试成功");
});

使用jQuery同时给多个对象绑定press方法也可以:

$("#longPressDiv>ul>li").each(function(){
	var hammertime = new Hammer(this);
	hammertime.on("press", function (e) {
		//alert("长按测试成功");
	});
});

但是还是会存在一个问题:动态加载数据的时候怎么给对象绑定press事件

使用上面的JQuery测试例子为例,ul下面的li若是写死的如上绑定事件可以识别没有问题,若是通过事件(像上面提到的上拉加载数据)动态添加li就识别不了了。对于这个动态加载数据的检测,大家可能会想到jQuery的live方法,可是live方法第一个参数要求绑定事件且必须绑定事件,这里能绑定什么事件呢?所以不能用live来处理。最后想了一个不是办法的办法:我标记一下,每次加载数据了就往li上人为的添加一个属性,如sign=1,再通过jQuery选择器选择sign=1的li,等到绑定press事件之后,将sign修改成2,这样子就能保证每次选择到的数据都是没有添加事件的。

 

以上是基本思路,综合上拉加载数据和长按事件以及我自己项目中的使用情况,我的业务处理情况如下:

var page=1;//当前页数
var totalPage = 1;//总页数
apiready=function(){
	//显示加载数据的进度条
	api.showProgress({
		title: '数据加载中',
		modal: true
	});
	
	//通过ajax加载数据
	loadMyNotice();
	
	//添加下拉刷新
	refreshList();
  
    //添加滚动条监听事件:滚动条滚动到最底端时生效            
    api.addEventListener({
        name:'scrolltobottom'
    },function(ret,err){
    	showProgress();//进度条提醒
    	if(page==totalPage){//当前页即为最后一页,那么进行提醒,不加载数据
    		api.hideProgress();//隐藏进度提示框	
    		api.toast({
                msg:'已经是最后一页了'
            });
            return false;
    	}else{
    		page = page+1;            	
    		loadMyNotice();
    	}
    });
}

//该方法用来加载数据
function loadMyNotice(){
	api.ajax({
        url:$api.getStorage("url"),
        method:'post',
        dataType:'text',
        data:{
        	values:{
        		'page':page,
        		'user_id':$api.getStorage("u_id"),
        		'time':new Date().getTime()
        	}
        }
    },function(ret,err){
    	api.hideProgress();//隐藏进度提示框		
    	if(ret){
    		ret = eval('('+ret+')');
    		var html = addHtmlForPage(ret);
    		if(page==1){
    			$api.html($api.byId("mynotice"), html);
    		}else{
    			$api.append($api.byId("mynotice"), html);
    		}
    		
    		//添加长按事件
    		addLongPress();
    	}else{//没有数据时也会进入到这里
    		$api.html($api.byId("mynotice"),"");//清空数据
    		if(err.length>0){//说明有错误数据,那么弹出提醒
    			alert(err);
    		}            		
    	}
    	
    });
}
//该方法用来拼接字符串
function addHtmlForPage(data){
	var html = "";
	var len = data.length;
	if(page==1){//第一页
		totalPage = data[len-1].totalPage;//总页数
		len = len-1;
	}
	for(var i=0;i<len;i++){
		html +="<p class='p_time'><time>"+data[i].field6+"</time></p>"
			+"<article sign=\"1\" curID=\""+data[i].field1+"\">"
	    	+"<h2 class='p_tit'>"+data[i].field5+"</h2>"
	    	+"<p class='p_content'>"+data[i].field2+"</p>";
	    if((data[i].field3).toString().length>0){//说明有图片信息
	    	html+="<span class='p_img'>"+getImg((data[i].field3).toString())+"</span>";
	    }
	    html+="</article>";
	}
	return html;
} 

//该方法用来添加长按事件
function addLongPress(){
	//创建一个新的hammer对象并且在初始化时指定要处理的dom元素
	$("#mynotice>article[sign=1]").each(function(i){
		$(this).attr("sign","2");
		var notice_id = $(this).attr("curID");
		var $this = $(this);
		var hammertime = new Hammer(this);
		//添加事件
		hammertime.on("press", function (e) {
			api.actionSheet({
				title: '删除',
				cancelTitle: '取消',
	    		destructiveTitle: '删除'//红色警示按钮标题,一般用于做一些删除之类操作
            },function(ret,err){
            	if(ret.buttonIndex==2){//取消
            		return false;
            	}
            	
            	//删除。弹出框进行提醒
            	api.confirm({
                		title: '提示',
				msg: '确认删除吗',
				buttons: ['确定', '取消']
                    },function(ret,err){
                    	//取消
                    	if(ret.buttonIndex==2){
                    		return false;
                    	}
                    	
                    	//确认,通过ajax进行删除
                    	api.showProgress({
                        	title: '删除中',
							modal: true
                        });
                    	api.ajax({
                			url:$api.getStorage("url"),
				            method:'post',
				            dataType:'text',
				            data:{
				            	values:{
				            		'notice_id':notice_id,
				            		'time':new Date().getTime()
				            	}
				            }
                		},function(ret,err){//若是成功返回空字符串,否则返回错误信息
			            	api.hideProgress();//隐藏进度提示
			            	if(ret.length<=0){
			            		$this.remove();//移除当前公告
			            	}else{
			            		alert(ret);
			            	}
                		});
                  });
            });
		});
	});
}

//该方法用来下拉刷新
function refreshList(){
	api.setRefreshHeaderInfo({
		visible:true,//是否可见,若设置为false,下拉区域不能隐藏且刷新界面为黑色,什么内容也看不到。
		bgColor: '#ccc',//背景色
		textColor: '#fff',//文本颜色
		textDown: '下拉刷新...',//下拉文字描述,默认值:下拉可以刷新
		textUp: '松开刷新...',//松开时文字描述,默认值:松开可以刷新
		textLoading:'加载中..',//加载状态文字描述
		//textTime:'',,//更新时间文字描述,默认格式为:最后更新+日期时间
		showTime:true//是否需显示更新时间
	},function(ret,err){
	  	//alert("下拉刷新成功");
		api.refreshHeaderLoadDone();//恢复默认状态
	
		//重新加载当前页面
	    window.location.reload();
	});
}

//该方法用来拼接图片字符串
function getImg(imgStr){
	var imgHtml = "",imgPath="";
	var imgArr = imgStr.split(",");
	var s_ip = $api.getStorage("s_ip");
	for(var i=0;i<imgArr.length;i++){
		imgHtml+="<img src=\""+s_ip+imgArr[i].toString()+"\" onclick=\"previewThePic(this);\"/>";
	}
	return imgHtml;    		    	
}

希望对大家有所帮助,祝好运! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值