事前并未进行可行性分析,用phonegap框架开发仅是用于尝试,我的感觉是公司的这个项目可有可无,呵呵,感觉而已...
开始之初没有做太多的规划,以至于后来想重构代码的打算,由于各种原因吧,应用可以正常使用,只是代码有点...
下面大致介绍一下软件以及遇到的问题
我用的是phonegap2.7版本,jquery mboile-1.1.1
首先是加载splash界面,以及index.html(放在了config.xml文件中),这个都知道
- super.setIntegerProperty("splashscreen", R.drawable.splash);
- super.loadUrl(Config.getStartUrl(), 6000);
问题1:在加载loadUrl可能会出现
CordovaWebView:
TIMEOUT
ERROR 的异常,我的解决办法是重写onReceivedError方法,具体逻辑按需求而定,可以不让程序挂掉,例子如下
- @Override
- public void onReceivedError(int arg0, String arg1, String arg2) {
- Toast.makeText(getApplicationContext(), "请检查网络连接是否正常", Toast.LENGTH_LONG).show();
- return;
- }
问题2:page页面点击事件的处理,webview本身webkit内核对单机和双击事件中有一个300ms的延迟,在此我使用的fastclick.js同意处理事件,(曾尝试jquery moblile中的tap、
taphost等来处理事件,最后效果不太理想,改用了fastclick.js
)
- window.addEventListener('load', function() {
- var i = 0, fastClick;
- fastClick = new FastClick(document.body);
- document.getElementById('back').addEventListener('touchstart', function(event) {
-
- }, false);
- <span style="white-space:pre"> </span>
- }, false);
fastclick文件下载地址: http://download.csdn.net/detail/xiangjai/5800805
问题3:jquery库和其它库冲突的问题,此问题 本人理解能力有限,只解决了问题,道理没有明白
问题4:消除页面切换效果、消除对话框出现的效果等
- $(document).bind("mobileinit", function() {
- if (navigator.userAgent.indexOf("Android") != -1) {
- $.mobile.defaultPageTransition = 'none';
- $.mobile.defaultDialogTransition = 'none';
-
-
- $.mobile.allowCrossDomainPages = true;
-
- }
- });
问题5:定义加载条
-
- function showLoader() {
- $.mobile.showPageLoadingMsg("b", "数据加载中...");
- $.mobile.loadingMessageTextVisible = true;
- }
-
- function hideLoader()
- {
-
- $.mobile.hidePageLoadingMsg();
- }
问题6:关闭input数字的自动识别, 此代码加载html文件
-
- <meta name="format-detection" content="telephone=no">
问题7:jqueryMobile footer/header问题 显示隐藏的问题
jqueryMobile footer 和 header 能不能一直设置显示状态,我发现每次点击页面都会隐藏再点击又显示出来,这个很烦人,有没有方法设置一直保持屏幕底部 不会跑到程序最下面……我已经设置了 data-position="fixed" 但是没有固定位置的效果!或者这个有没有更好的方式 固定? 可以尝试data-tap-toggle="false" ,或者是在包含data-role="header"的div中加入style="position:fixed;"
问题8:js端数据存储
- sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。
- 因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。
- localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
-
- localStorage.getItem(key):获取指定key本地存储的值
- localStorage.setItem(key,value):将value存储到key字段
- localStorage.removeItem(key):删除指定key本地存储的值
-
- window.localstorage.setItem("sessionID", "1234");
- var sessionId = window.localStorage.getItem("sessionID");
- window.localStorage.removeItem("sessionID");
-
-
- window.sessionStorage.setItem("sessionID", "1234");
- var sessionId = window.sessionStorage.getItem("sessionID");
- window.sessionStorage.removeItem("sessionID");
问题9:页面跳转
- $.mobile.changePage(allId, {
- transition : 'none',
- reverse : false
- });
我在应用中没有使用页面跳转间的效果,
例如 $.mobile.changePage(a2.html',{transition: "none",changeHash:false}); 此句表明了跳转时,是否保留页面缓存,具体效果可以写三个页面进行测试一下效果,changeHash在登录页面跳转时有很好的作用
问题10: 自定义toast,js实现android中toast效果
参数msg:显示文字, duration:显示的时间长度
- function Toast(msg, duration) {
- duration = isNaN(duration) ? 3000 : duration;
- var m = document.createElement('div');
- m.innerHTML = msg;
- m.style.cssText = "width:60%; min-width:150px; background:#000; opacity:0.5; height:40px; color:#fff; line-height:40px; text-align:center; border-radius:5px; position:fixed; top:70%; left:20%; z-index:999999; font-weight:bold;";
- document.body.appendChild(m);
- setTimeout(function() {
- var d = 0.5;
- m.style.webkitTransition = '-webkit-transform ' + d
- + 's ease-in, opacity ' + d + 's ease-in';
- m.style.opacity = '0';
- setTimeout(function() {
- document.body.removeChild(m)
- }, d * 1000);
- }, duration);
- }
问题11:page页面中日历控件,如下图所示

控件例子下载地址:http://download.csdn.net/detail/xiangjai/5541715 ,例子中有使用说明
问题12:对虚拟按键确定键的捕获(其它键的捕获类似)
-
- function onKeydown(event) {
- if (event.keyCode == 13) {
- event.returnValue = false;
- event.cancel = true;
- }
- }
问题13:js和java代码互相调用
java层调用js层:可以在继承DroidGap的activity中直接使用super.loadUrl("javascript:appFromActivity()"); 就可以从java调用js中的方法,也可以传递参数
我直接设定了继承DroidGap的activity的启动模式为singleTask,然后在生命周期的onstart方法中来调用该方法
js调用java层:直接使用phonegap插件即可
还有用到的一些零散的语法:
$.mobile.activePage.attr('id') //当前活动页page的Id
$.mobile.activePage.is('#test') //当前活动页是否是Id为test