专栏首页后端技术探索后端前端恩仇录

后端前端恩仇录

作者:黄总 链接:https://segmentfault.com/a/1190000004570180

其实应该更多的是互相的磨合与学习,希望身边的人可以有自己的经验分享,与理解,互相进步才是大家需要的,作为一个 "年老" (我也是90后) 的开发者,我觉得一代胜一代,未来才有胜算。额,好了,我不充当老师的角色了,去正题。

1.安卓中 a 标签的坑

在和客户端交互的过程中,往往都有跳转的,而在咱们 Web 开发中,默认的 href 属性通常是 #,然后通过获取标签绑定动作触发事件,这里有个坑,在与安卓交互过程中会发现。

<a href="#">click me</a> // include zepto or jquery or other. $(function () { $('a').on('tap, click', function () { alert('test'); return false; }); });

上述代码中,会引起安卓交互中的一个坑,就是没点击一次,安卓都会在计数器上+1, 也就是,点击第一次,弹一次窗,点击第二次,会弹两次窗,如此类推。

解决方法:

<a href="javascript:void(0);">click me</a>

Fxied!!

2. 安卓中交互的坑

我丢,安卓这个坑爹,在 js 交互中,无法传递对象,匿名函数等等的类型。也就是说,如果你的参数是接受一个对象的,你必须将她转成 String,而且安卓中的返回值也是只能返回 String,在咱们接受之后需要将字符串转换成对象。

简单 判断客户端类型的:

isiOS: function () { if (this.ua.match(/android/i) == "android") { return false; } return true; }, isAndroid: function () { if (this.ua.match(/android/i) == "android") { return true; } return false; }

解决方法:

encode: function (data) { if ("" == data) { return {}; } return JSON.stringify(data).replace(/"/g, '\''); }, decode: function (data) { if ("" == data) { return "{}"; } return JSON.parse(data.replace(/\'/ig,'\"')); }

在调用 iOS 或者 android 的时候,先将参数传递到 encode 处进行过滤。

3. 判断页面是否在应用内打开

其实这个很简单,经常做 web 开发的都应该知道,咱们每天都与 Http 协议打交道,而在 Http 中,有一个很重的的标识,就是 User-Agent,简称 UA,其实这个东西就像咱们的门票一样,有着各种的信息在上面,其实就包括了很多的浏览器内核信息,版本信息,厂商等等......咱们就是从这个地方入手,在客户端中定义自己的版本信息,与微信一样。从此告别什么 url 上加什么破参数啊什么的。

以我的经验来设计的话,一般按照这个格式:

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 {company} {appname} [{type}]/{version}

如: 腾讯,微信 [海外版本] 6.0.0

Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5 Tencent MicroMessager oversase/6.0.0

因为此处我还没太多接触客户端开发,暂时没有客户端代码演示.

us: window.navigator.userAgent.toLowerCase(), is: function (name) { return tools.ua.match(eval("/" + name + "/i")) == name ? true : false; } Examples: if (/* Is app inside */) { /* Operation */ } else { /* Is app outside */ /* Operation */ } Combine: In wechat if (/* In wechat app */) { /* open share guide */ } else { if (/* In app */) { if (/* Is iOS */) { /* share iOS sdk */ } else { /* share android sdk */ } } else { /* share operation */ } }

4. 请善用你的 Http Status Code

曾几何时,我也是一个懵懂无知的骚年,连接口是干嘛用的都不知道,大概也在 2014/8 月份左右,我对接口都是一种很敬畏的眼光去看待,直到现在,2016年,我更加视接口是一切数据库的来源,其价值是最至高无上的。但是由我接触接口(Application Programing Interface)开发之后,我发现目前的接口有好多问题,一个很明显的就是,为啥每个接口都是 200,不应该啊,那非 200 响应的应该怎么办?有做处理吗?

直到后来,我推翻了这一现象,也说服了各方的人。我举一个 Ajax 的例子:

首先我先问一个问题,为何 jquery 和 zepto 的 ajax 中,都有一个 error 回调?

$.ajax({ // some code success: function () {}, error: function () {} });

请不要怀疑设计者的智商与知识,我猜他应该会比你聪明以及牛叉。这么做,肯定有原因的。其实这里的 error 就是为了让非 2xx 状态的时候进入的操作的。

如示例:

{ status: 1 content: {} }

以上例子本身没有错误,仅以自己看法对上述进行评述

其实咱们应该要善用本身已经有的东西,不需要再重新造多一个,吃力不讨好,那你们就开始好好补一补 Http Status code 相关的知识吧。

示例:

Request Method:GET Status Code:200 OK

200 一般都是成功响应,

3xx

4xx

5xx

根据不同的状态码进行不同的处理机制,无需重复再做这一步骤了,其实设计者也很清晰设计出状态码的意义,应该善用。

5. 判断应用是否安装,如果安装,则打开,否则则跳去下载

其实这个有点无理取闹,但是又不得不去做,首先这个其实原理也是挺绕的

  1. 利用iframe尝试打开自定义scheme
  2. 跳转到下载地址

只是那个判断......

其实我是建议这些操作统一由一个地方去做,比如定义一个域名叫: down.xxx.com/应用id,后台读取应用id 相信信息,统一由一处转发。

function open () { var ifr = document.createElement('iframe'); ifr.src = url; ifr.style.display = 'none'; document.body.appendChild(ifr); window.setTimeout(function(){ document.body.removeChild(ifr); }, 3000); }

注意 iOS9 对这个有点不兼容,所以,谨慎,iOS7,iOS8,安卓均可以实现

获取版本信息:

var getVersion = function () { if (tools.client.isAndroid()) { return parseFloat(tools.ua.match(/Android\s(.*?);/i)[1]); } return parseFloat(tools.ua.match(/OS\s(.*?)\slike/i)[1].split('_').join('.')); };

这里需要判断系统类型及版本:

if (/* iOS */) { if (/* iOS version less than 9.0 */) { /* try open scheme */ /* redirect download link */ } else { /* other operate */ } } else { /* try open url */ /* redirect download link */ }

所以,由此可见其实这里的判断会很多,很多,很多。所以我墙裂建议都统一到一个地方做分发。

这里其实还需要判断是否微信,是否应用内打开,是否是分享出去的。

结合第 3 点的例子想想,这里的 if ...... 其实还是很恐怖的,我已经无路可退了......

本文分享自微信公众号 - nginx(nginx-study)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-04-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 最简单的基于jquery的ajax请求教程

    上一次文章提到ajax异步请求的简单教程。那是基于原生JavaScript实现的。本次是基于jquery的ajax异步请求教程。

    世纪访客
  • CSS3随机背景图片切换特效

    看大家扒我的幻想领域二次元限定版扒的比较累,扒了大半个小时的,抽空整理一下发出来

    阿珏
  • jquery中动态新增的元素节点无法触发事件解决办法

      在使用jquery中动态新增的元素节点时会发现添加的事件是无法触发的,我们下面就为各位来详细的介绍此问题的解决办法.

    超然
  • 简单优化前端工程几种方式(上篇)

    如果A网站和B网站, 同时使用了https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js的资源,...

    zhaoolee
  • 全面入门jQuery最佳实践(二)-jQuery的属性与样式1 .attr()与.removeAttr()2 html()及.text()

    每个元素都有一个或者多个特性,这些特性的用途就是给出相应元素或者其内容的附加信息。如:在img元素中,src就是元素的特性,用来标记图片的地址。

    JavaEdge
  • window对象(一) 计时器 定位导航 url解析 浏览历史 对话框 消息推送

    一个jQuery作者的写的关于定时器解释,记的顺手订阅一下。John Resig,jQuery之父

    mySoul
  • 前端必知的ajax

    1. load( url, [data], [callback] ) :载入远程 HTML 文件代码并插入至 DOM 中。

    超然
  • 常用官方文档整理

    HTML 4.01规范(英):http://www.w3.org/TR/html4/

    owent
  • 前端校招不要只关注面经,项目经验也需要准备

    【每日一语】在年轻的时候,在那些充满了阳光的长长的下午,我无所事事,也无所惧怕,只因为我知道,在我的生命里有一种永远的等待。挫折会来,也会过去,热泪会流下,也会...

    牛客网
  • AMD && CMD

    随着web2.0时代的到来,Ajax技术得到广泛应用,jQuery等前端库层出不穷,前端代码日益膨胀

    超然

扫码关注云+社区

领取腾讯云代金券