• 项目总结-APP中的HTML5


    这是我来到Baicare的第二个移动端项目,也是第一个和IOS + Android交互的项目。在这次项目中碰到了很多问题,也查了一些资料解决了一些问题,但总体还是不够满意,主要是在于第三方插件的使用上,另外也收获了一些与Server端及客户端交互的经验。

    Server端动态数据对接

    Server端需要将我做的静态页面与动态数据绑定,期间遇到以下问题:

    1. 在写html页面时,要保证可以模板化,便于动态页面搭建。例如,将所有页面的头、尾、及主体内容的页面架构保持统一;尽可能达到使用一个模板就能包含所有页面的布局。也需要事先与Server端确认页面及相关JS、CSS、image等文件的目录结构。 

     

    2. 为不同页面添加不同Class类名作为区分时,不要加在作为模板的标签上,而是要新增一个标签,便于Server端判断,如:

    错误:<div class="school-wrapper detail-page"></div>

    正确:<div class="school-wrapper"><div class=" detail-page "></div></div>

     

    3. 在特殊的模块或者需要有判断的模块时,要添加详细的备注并与Server端沟通,确保功能完善及页面结构正确。

    <!--若已收藏,添加类名:selected-->;

    <!--若为官方活动则在header-container上添加official类名-->

     

    4. 本地调试Ajax功能时,会创建json文件作为数据源,但是本地静态post调用时会报405 (Method Not Allowed)的错误。

    原因:Apache、IIS、Nginx等绝大多数web服务器,都不允许静态文件响应POST请求,否则会返回“HTTP/1.1 405 Method not allowed”错误。

    解决方案:

    步骤1:在web.config里添加json的MIME类型

                       <system.webServer>

                             <staticContent>

                            <mimeMap fileExtension=".json" mimeType="application/x-javascript" />

                             </staticContent>

        </system.webServer>

    步骤2:Ajax中的post方法改为get方法

     

    5. 本地调试完Ajax后,代码需切换成Server端正式使用的方法。

    静态

           $.ajax({

                          type: 'get',

                 url: 'XXX.json',

                 data: { 'p': currentPage + 1 },

                 contentType: "application/json",

                 success: function (res) {

                      ...

                 }

     });

    正式

           $.post('XXX.json',

                 { 'p': currentPage + 1 },

                 function (res) {

                                ...

             }, 'json');

     

    客户端交互命令对接

    在某些特殊页面上,HTML5页面需要与客户端进行交互,例如:点击分享按钮后,客户端需要接收到这个分享的操作信号,然后再通过客户端的原生代码进行分享的操作。

    方法1:通过JS将命令以页面跳转的形式进行传递。

                        window.location.href = "baicareJSBridge://refresh";

    方法2:通过<a>标签的href属性将命令进行传递。

                        <a href="baicareJSBridge://newPlayground"><img src="sites/img/i_post.png" /></a>

    方法3:通过click事件,执行BaicareJSBridge方法,此方法会创建一个新的<iframe>标签,并将命令通过src属性进行传递。

                        不传参数:BaicareJSBridge.login();

                         传参数:       var param = {

                                            "href": url

                                               };

                           BaicareJSBridge.setLocation(param, function () { });

     

     

    第三方插件的使用

    这次嵌套使用了五个第三方插件,分别是youku API, iscroll, swiper, fastclick 和lazyload。总的来说,实现功能方面比自己写方便多了,但是却是一个大坑,有很多bug都是插件自身的bug,使用方较难修复,主要碰到的问题如下:

    1. Youku API中的OnPlayEnd事件回调接口在移动端无效。和官方确认过,在移动端确实存在此问题,还未解决。

    临时解决方案:

    用setInterval方法实时监控,当player.currentTime()与player.totalTime()相同时,执行对应的操作。

    2. iscroll在部分Android机器中会有单击一次,却会在当前位置点击两次的Bug。

    解决方案:

    修改iscroll.js中的代码
    步骤1:去除onBeforeScrollStart里的阻止默认行为

               onBeforeScrollStart: function (e) {

                        //e.preventDefault();

              }

    步骤2:添加onBeforeScrollMove里的阻止默认行为

               onBeforeScrollMove: function (e) {e.preventDefault();}

    步骤3:去除_end里的模拟事件

              if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {

                        ev = doc.createEvent('MouseEvents');

                        //ev.initMouseEvent('click', true, true, e.view, 1,

                        //    point.screenX, point.screenY, point.clientX, point.clientY,

                        //    e.ctrlKey, e.altKey, e.shiftKey, e.metaKey,

                        //    0, null);

                        ev._fake = true;

                        target.dispatchEvent(ev);

                      }

    3. iscroll在动态加载完数据或者dom的高度进行变化后,会产生拖动不正常的bug。

    解决方案:

    步骤1:在动态加载完数据后,调用refresh方法。

    步骤2:在onScrollEnd回调函数中,调用refresh方法。

    4. Swiper中的onClick回调函数在部分Android机中无效。

    解决方案:

    重新通过zepto.js定义click事件。

    5. lazyload + iscroll:当动态数据加载完拖动页面时,图片没有被刷新,仍然显示的是缺省图片。

    解决方案:

    步骤1:在动态加载完数据后,重新为图片绑定事件:$("img.lazy").lazyload({effect: "fadeIn"});。

    步骤2:在定义iscroll的onScrollMove回调函数中,添加$("#iscrollDomID").trigger('scroll');

  • 相关阅读:
    css动画集合地址
    邮箱正则
    好用的工具之一 ---- Sublime Text
    组件化表单解决方案AForm 1.3 发布
    WinScp几个极大提高开发效率的小功能
    session的本质及如何实现共享?
    使用phantomjs操作DOM并对页面进行截图需要注意的几个问题
    Ubuntu 12.04 安装最新版本NodeJS
    IIS 8 nodejs + iisnode 配置
    Bagging和Boosting的介绍及对比
  • 原文地址:https://www.cnblogs.com/violetye/p/4699752.html
Copyright © 2020-2023  润新知