原生Android和IOS开发耗时比较久,混编相对而言就有了优势,混编工具框架很多,个人觉得APiCloud相对简单容易。开发过程比较上手也有几个坑,在使用一年后简单做个总结。官方文档API:https://docs.apicloud.com/
1开发工具http://www.apicloud.com/devtools
APICloud Studio 1 简洁稳定,代码管理直接在apicloud云端应用,代码提示不智能,建议需求稳定性者使用。
APICloud Studio 2 操作复杂,代码管理需先从第三方git/svn仓库选择一种检出,代码提示比较智能。
2.模块开发http://docs.apicloud.com/Module-Dev/module-dev-guide-for-android
eclipse和Androidstudio都可以进行原生开发后上传模块,注意模块名必须不能重复,详情看链接介绍
3.在线社区https://community.apicloud.com/bbs/forum.php
由于用的人不多百度很少人回答,通过在线社区是一个不错的解决问题方法
4.常用方法函数
常用css:position如果选择固定位置fixed;float如果选择左排列偏移left;overflow如果内容满出可滑动scroll;white-space如果不换行单行nowrap;display如果行内元素inline-block;设置行数:style="overflow: hidden;-webkit-line-clamp:1;display: -webkit-box;-webkit-box-orient: vertical;"常用居中:<center></center>常用判断:if (/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) {//当前是手机端}
①网络请求:jquery框架比自带的请求好用
function aja(){
$.ajax({
url: "xx",
type: "post",
dataType: "json",
async:false,
crossDomain:true,//支持跨域 后台设header("Access-Control-Allow-Origin: *");
beforeSend: function(request) {
request.setRequestHeader("access-token", $api.getStorage('ACCESS_TOKEN'));//head
},
data: {
username: "admin",//参数
password: 1,
},
error:function(err){
alert("网络出错:"+JSON.stringify(err.status));
},
success: function (data) {
$api.setStorage('ACCESS_TOKEN', data.data);//apicode储存简单数据
alert( JSON.stringify( data ) );
}
});
};
----------------------------------------------------------------------------------------------------
window.onscroll=function(){
if(window.pageYOffset>=document.body.clientHeight-document.documentElement.clientHeight){//滑到底了
aja();
}
};
<form action="xx" target="iframe" method="post" enctype="multipart/form-data" onsubmit="aja()">
<input type="file" name="file" pattern="" title="不符合" autocomplete="off">
<input type="submit"> //不跳转action: target="iframe" 拦截表单action: onsubmit="xx();return false"
</form>
②页面跳转和分享
api.openWin({
name: 'h5',
url: './h5.html',//像原生一样开启一个新页面
pageParam:{
name:'传给页面的数据',//新页面调用api.pageParam.name
},
});
apiready=function(){
$api.byId("h").innerHTML=document.location ="https://www.baidu.com";//开启页面时立即自动在指定位置显示指定网址
$api.byId("h").innerHTML="请稍候,loading...";
};
var sharedModule = api.require('shareAction');//分享功能
sharedModule.share({
text: '纯文本信息,这是一条分享信息',
type: 'url',
path:"https://www.baidu.com/",
thumbnail:"widget://a.png",
});
api.addEventListener({
name:'viewappear'
},function(ret,err){
alert('系统监听到显示页面');
});
api.addEventListener({
name:'keyback'
},function(ret,err){
alert('系统监听到返回键');
});//自定义广播api.sendEvent();
③select和checkbox全选单选:Vue框架使用更方便
<div id="app"> //oncontextmenu="return false"禁止长按或右键 onselectstart="return false"禁止复制
<select v-model='items' @change="mycity(items)">
<option id='yes' v-if="sub.NAME.indexOf('yes')>-1==true" v-for='(sub,index) in result'>{{sub.NAME}}</option>
</select>
<img :src="VUEIMG" onerror="this.src='../image/xx'" :class="{ 'classA':isA,'classB':isB}">
</div>
<script type="text/javascript" src="../script/vue.js" ></script>
<script type="text/javascript">
var vm=new Vue({
el:'#app',//Vue作用域
data:{//Vue数据
items:"city",
result:[],
},
methods:{//Vue方法
mycity:function(texts){
alert(texts);
},
},
});
apiready=function(){
vm.result=ajaxcity();//初始化时自定义方法获取数据
}
</script>
<div style="margin: 0.8rem"><input type="checkbox" id="qx" @click="all()"></div>
<div style="margin: 0.8rem"><input type="checkbox" name="dx" @click="one()"></div>
<div style="margin: 0.8rem"><input type="checkbox" name="dx" @click="one()"></div>
<input type="radio" name="radiogroup" @change='mycity()' checked="">
<script type="text/javascript">
var all=document.getElementById("qx");//全选框设置唯一的id
var one=document.getElementsByName("dx");//多个多选框设置相同name
function one(){//checkbox多选框联动
var data=[];
var selcount=0;
for(var i=0;i<one.length;i++) {
data.splice(i,0,one[i].checked);
if(one[i].checked){
selcount++;
}
if(!one[i].checked){
selcount--;
}
if(selcount==one.length){
all.checked=true;
}else{
all.checked=false;
}
}
return data;
}
function all(){//checkbox全选框联动
if(all.checked){
for(var i=0;i<one.length;i++) {
one[i].checked=true;
}
}else{
for(var i=0;i<one.length;i++) {
one[i].checked=false;
}
}
}
</script>
④导入地图框架
<script type="text/javascript" src="http://libs.baidu.com/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=ZKvE25QNawwRm3EFb7hLnliSHTXReN60"></script>
<script type="text/javascript">
// 百度地图API功能
var map = new BMap.Map("line_map");//指定区域ID显示地图
var point = new BMap.Point(116.400244,39.92556);//经纬度
map.centerAndZoom(point, 12);//显示中心区域
var marker = new BMap.Marker(point,{icon:new BMap.Icon("../image/G.png",new BMap.Size(28,38))});//画标注
marker.id="xx";//给marker赋值//marker=new BMap.Polyline([prev,next ],{strokeColor:"#3391cc",strokeWeight: 2,strokeOpacity:0.5});//画线
map.addOverlay(marker);// 将标注添加到地图中,如要删除map.clearOverlays();
marker.enableDragging(); // 可拖拽
marker.addEventListener("click", getAttr);//点击图标
function getAttr() {
alert(JSON.stringify(marker.id));
};
marker.addEventListener("dragend", function () {//拖拽图标
var p = marker.getPosition();//获取marker的位置
alert("marker的位置是" + p.lng + "," + p.lat);
});
</script>
⑤定时器
△setInterval(code,millisec) 按照周期不停地调用函数,直到调用clearInterval(name)或窗口关闭
code 必需。要调用的函数function () { //要执行的代码; }
millisec 必须。周期性执行之间的时间间隔,以毫秒计。
获取时间var d=new Date();d.getFullYear();d.getMonth()+1;d.getDate();d.getHours();d.getMinutes();d.getSeconds();
△setTimeout(code,millisec) 在指定的毫秒数后调用函数
code 必须。要调用的函数function () { //要执行的代码; }
millisec 必须。在执行代码前需等待的毫秒数。
⑥类型转换和数组操作
for (var i = 0; i < array.length; i++) {
Boolean(100); //true – non-zero number
Boolean(null); //false - null
Boolean(0); //false - zero
Number(false); //0
Number(true); //1
Number("5 "); //5
Number( "5.5 "); //5.5
}
数组pop:删除原数组最后一项,并返回删除元素的值,如数组为空返回undefined
pop();
数组push:将参数添加到原数组末尾,并返回数组的长度
push();
数组splice:删除指定位置元素或增加指定位置元素
splice(index,howmany,item1,.....,itemN)
index必需。整数,删除项目的下标,使用负数可从数组结尾处规定位置。
howmany 必需。要删除的项目数量。如果设置为 0,则不会删除项目。
item1, ..., itemX 可选。向数组添加的新项目。
数组reverse:将数组反序
reverse();
数组sort(orderfunction):按指定的参数对数组进行排序
sort();
⑦图片预览图片上传
<label for="DIY" style="border:1px red solid;border-radius: 5px">自定义选择按钮</label>
<input type="file" accept="image/*" capture="camera" id="DIY" style="position:absolute;clip:rect(0 0 0 0);"><!--照相-->
<input type="file" accept="video/*" capture="camcorder"><!--录影-->
<input type="file" accept="audio/*" capture="microphone"><!--录音-->
<img id="image"src=""/>
var image = '';
$("#DIY").change(function(){
image=selectImage(this);
});
function selectImage(file){
if(!file.files || !file.files[0]){
return null;
}
var reader = new FileReader();
reader.onload = function(evt){
document.getElementById('image').src = evt.target.result;//图片预览数据
return evt.target.result;//得到的数据
}
reader.readAsDataURL(file.files[0]);//base64格式"data:image/png;base64,xxx"
};
function save(url) {// 创建隐藏的下载
var eleLink = document.createElement('a');
eleLink.download = "";
eleLink.style.display = 'none';
eleLink.href = url;//支持本地在线路径图片下载
document.body.appendChild(eleLink);
eleLink.click();//点击
document.body.removeChild(eleLink);
};
<script src="https://cdn.bootcss.com/html2canvas/0.5.0-beta4/html2canvas.min.js"></script>
var imgUri = canvas.toDataURL("image/png").replace("image/png", "image/octet-stream"); // 截图src
⑧打印日志log(工具栏->启动日志)打印cookie
alert(document.getElementById("myid").value);//显示input的值。
alert(document.getElementById("hid").innerText);//显示标签innerHTML值。
console.log($('#myid').val());//打印日志显示input的值。
console.log($('#hid').text());//打印日志显示标签html()值。
var xxx='测试打印大于3000个字符长度的log';
var index=0;
if(xxx.length<3000){
console.log('打印短的:'+xxx);
}else if(xxx.length>=3000){
while(xxx.length>index){
console.log('打印长的:'+xxx.substring(index,index+3000));
index+=3000;
}
};
document.cookie;//获取cookie字符串
document.cookie="name=abc";//设置cookie
⑨支持各浏览器代码复制文字到粘贴板
/*document.getElementById("xx").onclick=function(e){
var targ = e.target;//获取当前事件点击元素Element
targ.className = 'bgover';//改变整个类css样式
//document.getElementById('xx').style.display="none"//改变单个css样式
}*/
function copyTextToClipboard(text) {
var textArea = document.createElement("textarea")
textArea.style.width = '1px'
textArea.style.height = '1px'
textArea.style.border = 'none'
textArea.style.outline = 'none'
textArea.style.boxShadow = 'none'
textArea.style.background = 'transparent'
textArea.value = text
document.body.appendChild(textArea)
textArea.select()
if(document.execCommand('copy')){
alert("复制到粘贴板了");
}
document.body.removeChild(textArea)
}
⑩显示标签内容不被转义
var temp = document.createElement("div");
temp.innerHTML = 'html标签格式的内容';
var output= temp.innerText || temp.textContent;
temp = null;
//document.getElementById("goods_id").innerHTML=output;