stoneniqiu 理想就是自己喜欢做,并对社会和他人都有意义的事情!

 

H5嵌入原生开发小结----兼容安卓与ios的填坑之路

2016-11-19 08:29 by stoneniqiu, 1038 阅读, 8 评论, 收藏, 编辑

一开始听说开发H5,以为就是做适配现代浏览器的移动网页,心想不用管IE了,欧也。到今天,发现当初too young too simple,兼容IE和兼容安卓与IOS,后者让你更抓狂。接下来数一下踩过的坑。主要分UI展示,键盘,输入框等等。解决bug最苦恼的问题不是没有解决方案,而是你没有找到真正的原因。再就是现象难以重现,每次都要发布代码,然后到手机app中去测试,模拟。这些地方会耗费大量的精力。

一、UI相关

1.安卓4.4以下不支持fixed布局。

fixed布局的作用之一就是在手机键盘弹起来的时候,可以自动把页面顶起来。如果不支持的话,换绝对定位也是可以的。但是绝对定位某些机型比如sm-n7508,华为m7上还是没有能顶起来。IOS没有这个问题。

2.小于1px显示问题

部分安卓机器(比如小米)的分辨率低,如果border的宽度小于1px。安卓机出现一种边框消失了的现象。样式上有点奇怪,IOS没有这个问题。

一开始以为是别的元素挡住了,但是调了半天无解。最后突然意识到是不是计算出来的高度有小数导致的。然后马上取整:

   $target.css("height", Math.ceil(maxline * lineHeight));

但是,华为的某些类型的是上面显示不正常,出来一排点点。

再修正一下:

   $target.css("height", Math.ceil(maxline * lineHeight) - 1);

或者用floor。你好奇为什么会有小数高度呢,因为这个功能设计一个折叠,需要重新计算dom的高度。

二、键盘相关

1.ios键盘挡住输入框。

这个发生的频率很高,中文输入法或者输入法切换的时候会遮挡。

解决的办法如下:

复制代码
    setInterval(function () { 
if (document.activeElement.className.indexOf('inputcontent') >= 0) { document.activeElement.scrollIntoViewIfNeeded(); } }, 300);
复制代码

这是最管用的办法,inputcontent为输入框的样式。activeElement表示获得焦点的元素。但是这个方法只在app中有用,如果是在浏览器中还是会失效。

2.键盘收下留下空白阴影。

 这个在部分安卓机上比较明显,当键盘在激活状态,突然来一个模态弹框,很明显的看到键盘收下去之后出现了一个短暂(不到1秒的样子)的空白,然后页面再收下去,让人感觉闪了下。比如华为P7。但是ios上没有关系,这个问题没招,系统不流畅。

3.无法保持键盘在弹出状态。

web其实无法直接控制键盘,只有通过让输入框获focus来让手机的键盘弹出来,但是三星SM-N8507v 这款就是不听话。我也无解了。

三、输入框相关

1. fastClick 锁住输入框。

在ios中,会出现几秒的输入框没有反应,开始也怎么想不明白,各种尝试,推测,搜索发现原来是使用的轻框架中用到了fastClik引起的,解决的办法就是加上一个样式。

  <div id="content" class="inputcontent needsclick" ></div>

解决方法到是简单,但是当初为找到这个原因,费了好大劲,把框架的模块一个一个删,最后才定位到。如果不加这个,不单会锁住输入框,每次调用focus都会设置光标跑在最前面,无法移动到后面。这个体验很糟糕。

2.模拟placeholder。

div作为输入框,本身加入placeholder是无效的。得借助于伪元素。

<div id="content" class="inputcontent needsclick" placeholder="有问题就尽管提问吧" contenteditable="true"></div>
复制代码
.tools .inputcontent:after {
   display: inline-block;
    width: 100%; color: #999; content: attr(placeholder); }
复制代码

然后在获得焦点和失去焦点的时候对这个属性进行移除和添加操作。这样做的好处在于,分离用户输入的内容,如果把placeholder的值直接在写输入框中这样会多一些判断,让代码不太干净。

3.div的换行是div

在div中触发换行,会得到一个div。这个就相当于是在编辑器中。而不是我们认为的<br>或者换行符。

所以,需要对div进行过滤替换。

复制代码
     var replace = /<div.*?>(.*?)<\/div>/g;
        txt = txt.replace(replace, function(a) {
         if (a != "<br>") { return "<br>" + delHtmlTag(a); } return delHtmlTag(a);} 
复制代码

4.粘贴莫名奇妙带了样式

在输入框中粘贴会以这样的形式出现:

<font style='font-size:30px;color:#999'><span>粘贴内容</span></font>

不清楚是系统还是app定义的。所以也得过滤。 用户还可以粘贴其他文章,容易搞乱输入框中的样式,需要加上:

.tools .inputcontent *{font-size: 0.50rem !important; color: #000 !important;line-height: 22px !important;font-weight: normal !important;}

因为如果从粘贴事件里面处理的话,容易搞乱焦点,让焦点在最前面。这样很不爽。所以还是样式控制,在发送的时候过滤掉所有的标签。

5.超出遮挡/换行遮挡

这是一个神奇的bug,当内容超过div的最大高度后,最后一行出现一个神奇的现象,头两个字显示了,后面的内容不见了(快快后面其实有内容),直到下一次换行才会出现。

我alert里面的内容,发现并没有其他的元素,我不断的尝试,发现div overflow: hidden;的时候字都会显示出来,但是为了让用户能够在内容框里面上下滚动。我得让y轴是可以滚动的:overflow-y: auto; 所以应该是滚动条引起的。但我确实不知道如何修改。后来试出一个hack的方法。只要有一个换行就不会出现这种情况。所以,我就在用户输入到特定行的时候就塞进一个1px的换行:

复制代码
  if ($("#content").height() == 88 && isIOS() && !haveAppendBr) {
                $("#content").append("<div style='height:1px;border-top:1px solid #fff' ><br></div>");
                haveAppendBr = true;
   }
复制代码

当然这不是正规的解决办法,如果园友有遇到相似的剧情,可以赐教一下。

6.安卓第一次不能换行

这个现象是消息发送成功之后,用户(小米)一来就是点换行,却无法换行,我怀疑是安卓系统阻止了这样的行为。但是在输入一个字之后,换行就是正常的了(哪怕再删掉这个字)。ios里面没有这个问题。开始我尝试去人为加一个换行,又发现焦点没了。想想这样问题不改也罢。

7.输入框光标闪动

这个是translate3d属性引起,修改sm框架中的一段代码设置useTranslate为false。位于handleTouchMove方法中。

四、图片相关

1.安卓不能上传。

安卓很多时候都不能触发input type='file'的弹框,上传就得走原生的帮助。原生拦截到链接后就会弹出图片选择框。

window.location = 'xxapp:h5Upload({"openType":2,"needChop":false,"uploadUrl": '+fileUploadUrl+',"key":' + totalFiles + ',"callbackMethodName": "uploadComplete"})';

key是为了记住是第几张图片,便于在原生上传结束之后把地址和key一起传到uploadComplete方法中。这样界面上才可以做相应的修改。但这不是我说的重点。重点是Url不要带中文啊或者特殊符号之类的。一方面很多手机里面的图片命名很奇怪,一大堆,像在uc上面保存下来的图片后面跟了几个类型。这种名称没啥用,非常建议服务器端像微信一样处理上传图片,成功之后得到一个唯一的字符串就行。不然有的系统会自动解码你得区分的用上了encodeURI或者encodeURIComponent。测试妹子会说这个手机可以,那个不可以,然后是苦了前端。

2.图片转了90度。

安卓部分机型(小米2A,三星N7,三星G9)对于拍照的图片上传之后居然左转了90度。

(非原图)

我把照片发出来之后,放在桌面上也是歪的,拍摄的图片本身会带有一个exifdata,这个对象里面包含了拍摄的时间、方向、曝光时间等一些信息。用exif.js可以看出来。也有网站可以直接查看。

复制代码
 function getdata(id) {
            EXIF.getData(document.getElementById(id), function () {
                var data = EXIF.getTag(this, 'Orientation'); console.log(data); }); }
复制代码

思路就是通过这个方向来判断是否给图片来个再旋转。

 this.style.transform = 'rotate(' + current + 'deg)';

3.图片半截

 这个问题在安卓上面会有,不是加载的问题。正确的效果图片应该是垂直居中的。但不知道为什么偶尔的会只出来个半截。而且我发现,给图片设置百分比,手机和pc不一样,手机图片的百分比并不是相对于其父类元素,而是它自己。

 

所以图片的宽度会超出其父类,即使<div><img></div>的宽度都是100%。overflow:hidden吧,图片可能显示不全。超出的部分会导致用户可以在图片上面左右滑动,这在ios中有个搞笑的现象,就是对弹出的图片不断的左右滑动,再恢复后居然能让原先绑定的点击事件失效,不确定是框架的原因还是系统的原因。当时是用一个模态框改造的。最后干脆自己再写一个:

复制代码
Client.modalImg = function (src) {
    if (!src) return;
    if ($(".img-overlay").length) { $(".img-overlay").remove(); }; var modal = '<div class="img-overlay"> <div class="imgheader"></div> <div class="imgbox"><img onload="reCalcuImg();" src="' + src + '" /></div>'; $("body").append(modal); }; //校准位置 function reCalcuImg() { var headerH = $(".imgheader").height(); var boxH = $(".imgbox").height(); var imgH = $(".imgbox img").height(); var realMaxH = boxH - headerH; // console.log("headerH", headerH, "boxH", boxH, "imgH", imgH, "realMaxH", realMaxH); if (imgH > realMaxH) { $(".imgbox img").css("height", realMaxH + "px"); console.log("大于最大高度,realMaxH", realMaxH); } else { var gap = (realMaxH - imgH) / 2; // console.log("小于最大高度,margintop",(realMaxH - imgH), gap); $(".imgbox img").css("margin-top", gap + "px"); } }
复制代码

写在onload事件结束后是确保图片已经加载完成。这样才能计算,如果直接在modalimg中计算,图片的高度可能为0。然后如果图片的高度大于最大高度则设置为最大高度,否则的话在进行margin,让其垂直居中。

五、消息

1.websocket是脆弱但又顽强的。

websocket很容易受到网络的影响而中断,但网络一恢复能自动重连。而手机会有切到后台运行的这种情况,比如小米系统会在手机黑屏之后把网络断掉,用户进入应用的时候,你得有重连的机制,确保消息没有遗漏。

 socket.on("reconnect", function () {
                isConneted = true;
                eventManger.trigger("reconnect");
                listenChannel();
   });

在listenChannel中通过 socket.emit 告之node后端重连了,拿消息的姿势调整下。

but红米手机有一款socketio老是重连,所以手机上也要准备轮询的机制。重连三次关掉socket,直接轮询。

2.消息先发后到。

先发的消息后到,这是很有可能的,但是用户就会奇怪。比如一条长消息分成几次发,前端可以在前一条发完了再发第二条。

复制代码
        var limit = 1000;
        function loop(i) {
            if (i < num) { send(content.substr(i * limit, limit), function () { i++; loop(i); }); } }; loop(0);
复制代码

六、前端的一些思考

那天走在路上想,前端是个什么样的职位,会JavaScript,node,熟悉mvvm,html5特性就ok了吗,其实技能只占到一部分。前端相当于是个连接者,产品经理的想法,美工的设计,后端程序员的接口实现,客户的期待,测试妹妹的重点,领导巡视的对象,大部分都汇集在前端完成的页面上,所以沟通,理解能力比较重要。产品经理和测试也会容易太专注于界面效果而忽略整个系统的分配合作。有时候看到界面或者流程不对,可能是后端的问题,你得去推。就像看见一人面有难色,其实体内已经有病了,所以你得会表达,表达问题在哪,或者表达需要怎样的协助;而在面对bug的时候要清楚哪些是功能性的bug,哪些是体验性的bug,基本功能必须保障正确,体验性的问题凡是影响基本功能的使用的都是严重的体验性bug,但bug总是有的,不太可能做到所有机型都一样。这里面还有时间成本,你解决一个不太重要的bug可能会花上很长的时间;再就是分析思考,各种不正常现象如何找到原因,除了依赖于经验你要坚信所有妖魔鬼怪都是有出处的,每个界面都可能有自己的差异性,不正常的现象重现的条件是什么,有哪些相关因素,然后顺藤摸瓜;再就是代码能力,尽量保证模块的独立和职责的单一,这个方面细节很多,是每个程序员需要注意的地方。最后就是想说,神奇的bug还不止这些,因为缺少这方面的开发经验和知识储备所以花了很长时间,远超自己的预估。文中如有不当或更好的方法还请指出。

 

转载于:https://www.cnblogs.com/lzbk/p/6193044.html

iOS解决键盘弹出遮挡输入框问题 1、错误:                 键盘遮挡输入框最常见的可能就是在登录界面了,无论有少个textFiled,不论是在VC的任何位置。都有可能造成键盘弹出来时,把输入框挡住了。如图:                                                                                       阅读详情

相关推荐

双轴意义模型:用内在驱动力与社会反馈构建可持续理想

理想主义不是空泛情怀,而是一种可建模、可验证、可迭代的生活操作系统。其核心在于‘内在驱动力’与‘社会价值反馈’的正交耦合——前者关乎神经奖励回路是否匹配行为模式,后者依赖个体可感、关系可测、系统可溯、成本可担的闭环验证。这种双轴动态校准机制,既规避了意志力透支的职业倦怠,也防止了自我感动式的意义幻觉。它广泛适用于生涯规划、教育实践、公益设计与团队动机管理等场景,尤其为经历意义稀薄、努力失焦或价值感错位的成年人提供一套日常可执行的认知工具与行为框架。

didi9310的博客 405

IOS 键盘挡住输入框的问题解决办法

IOS 键盘挡住输入框的问题解决办法 在iOS开发发现一个问题,有时输入框位于低出时,当编辑输入时,弹出的键盘会挡住输入框,令用户看不清楚实时的输入情况,使界面交互极度不友好。 经过查资料终于解决了这个问题。 解决思路: 1. 输入框监听UIControlEventEditingDidBegin事件,当用户开始输入时,将整个view上移。 2. 输入框监听UIControlEventEditingDidEnd事件,当用户结束输入时,将整个view下移,恢复到原位置。 输入框监听事件: [textfield addTarget:self action:@selector(textFie

人生操作系统:用四步穿透法校准热爱与意义

在职业发展与个人成长领域,'热爱'与'意义'是高频搜索的核心概念,但二者常被泛化为情绪口号或道德标签。从认知科学角度看,真正的热爱是奖赏回路与执行控制网络协同激活的稳定神经反馈;而社会意义必须落地为可测量的最小影响单元,在供需错配的真实缝隙中生成。技术价值在于将模糊的内在倾向转化为可验证的行为信号,通过情绪标记、能力映射、需求验证与闭环设计形成自增强系统。该方法适用于职场转型、副业启动、银发再就业等元场景,本质是一种面向真实世界的‘意义架构’实践框架。

didi9310的博客 485

【IOS16底部input框被弹起来的软键盘挡住解决方法】

万能方法 解决input框被软键盘挡住

Newz0722的博客 906

ios上fixed底部输入框被键盘遮挡的简单解决办法

当输入框获得焦点时候,等待500毫秒(键盘弹出动画时间)滚动到页面底部。而ios上面,点击页面底部输入框,软键盘弹出,输入框看不到了。在安卓上面,点击页面底部的输入框,软键盘弹出,页面移动上移。ios据说不支持position: fixed;

luyangguo的博客 1395

IOS遇到的几个H5坑、h5键盘弹起遮挡输入框的处理

原因分析:通常我们习惯用height属性设置行间的高度line-height属性设置行间的距离(行高),当点击输入的时候,光标的高度就自动父盒子的高度一样了。(谷歌浏览器的设计原则,还有一种可能就是当没有内容的时候光标的高度等于input的line-height的值,当有内容时,光标从input的顶端到文字的底部)问题描述:在ios端,上下滑动页面时,如果页面高度超出了一屏,就会出现明显的卡顿,页面有部分内容显示不全的情况,例如下图,右图是正常页面,边是ios上下滑动后,卡顿导致如左图下面部分丢失。

Bynine9的博客 5391

关于ios输入框被挡问题

input在底部,安卓机正常,ios点击输入框会被键盘遮挡解决方法,个人觉得原因是大家可以试试把300改成50,100这样,还是解决不了,在100ms时间软键盘还未完全弹出就已经执行方法,没有使元素完全适应软键盘位置。 setTimeout(function(){ document.body.scrollTop = document.body.scrollHeight; },300); ...

Eno_Lin的博客 671

书山有路28期预告:《人性的枷锁》

根据这次的投票结果,下一期读《人性的枷锁》,看来大家还是蛮喜欢毛姆的。在此之前我也就拜读过《月亮与六便士》,不过这对我不是一次愉快的阅读体验,可能是因为外国文学的名称让我混淆,可能是我理解不到位。 但很人了解毛姆应该都是从《月亮与六便士》这本书开始,也是到后来才理解什么是月亮,什么是六便士,高晓松说,生活不止眼前的苟且,还有诗远方。六便士便是这眼前的苟且,诗远方便是那皎洁自赏的月...

weixin_33691700的博客 107

程序员阅读系统:用工程思维构建抗焦虑精神操作系统

阅读不是信息摄入,而是一种底层认知操作系统的持续升级。从神经科学角度看,人脑工作记忆带宽有限,盲目追求数量反而触发认知超载;真正的成长源于结构化输入、跨域联结与角色化内化。本文聚焦程序员等高专注职业群体,围绕节奏感、结构感、生长性三大核心维度,拆解如何以工程思维设计书单上限、技术/非技术1:1配比、三重身份阅读法等可测量、可迭代的实践机制。这些方法不仅提升知识留存率与迁移效率,更在职业倦怠、注意力碎片化与存在焦虑的时代背景下,提供一套可持续的精神代谢方案——让阅读成为抵御虚无、校准坐标、重塑边界的日常语法。

diaoqi6581的博客 348

ios输入框被键盘挡住的解决办法

IOS开发时,难免会遇到输入框被键盘遮掩的问题。上网上搜索了很相关的解决方案,看了很,但是由衷的觉得太麻烦了。     有的解决方案是将视图上的所有的东西都添加到一个滚动视图对象( UIScrollView )中,然后滚动视图实现输入框不被软键盘覆盖,个人觉得此方案好是好,但是太过麻烦。     有的解决方案是通过一个通知 UIKeyboardDidShowNotification

王梦琦的专栏 3万+

H5嵌入原生开发小结----兼容安卓与ios的填坑之路

一开始听说开发H5,以为就是适配现代浏览器的移动网页,心想不用管IE了,欧也。到今天,发现当初too young too simple,兼容IE兼容安卓与IOS,后者让你更抓狂。接下来数一下踩过的坑。主要分UI展示,键盘,输入框等等。解决bug最苦恼的问题不是没有解决方案,而是你没有找到真正的原因。再就是现象难以重现,每次都要发布代码,然后到手机app中去测试,模拟。这些地方会耗费大量的精力。...

weixin_33786077的博客 380

iOS 解决键盘被遮挡的方法

IOS开发时,难免会遇到输入框被键盘遮掩的问题。上网上搜索了很相关的解决方案,看了很,但是由衷的觉得太麻烦了。     有的解决方案是将视图上的所有的东西都添加到一个滚动视图对象( UIScrollView )中,然后滚动视图实现输入框不被软键盘覆盖,个人觉得此方案好是好,但是太过麻烦。     有的解决方案是通过一个通知 UIKeyboardDidShowNotification 去实

乘风破浪 3206

解决ios中input获取焦点,弹出输入法之后,input被遮挡的问题

1、ipad键盘悬浮使用; 2、可以采用全局获取输入框,对数据框获取焦点进行监听,获取焦点后可以将输入框滚动到可视区域,可以使用scrollIntoView方法,方法使用可参照以下链接文档:https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView。

zezejingi的博客 2317

IOS中输入框被软键盘遮挡的解决办法

IOS开发时,难免会遇到输入框被键盘遮掩的问题。上网上搜索了很相关的解决方案,看了很,但是由衷的觉得太麻烦了。     有的解决方案是将视图上的所有的东西都添加到一个滚动视图对象( UIScrollView )中,然后滚动视图实现输入框不被软键盘覆盖,个人觉得此方案好是好,但是太过麻烦。     有的解决方案是通过一个通知 UIKeyboardDidShowNotification 去实

集结号 5万+

【bug解决】ios输入框不能自动聚焦以及聚焦后被键盘遮挡问题的解决办法

前言 在一些评论或者其他类似功能的时候,常常遇到以下两个问题: 可能我们要在点击评论图标时,自动聚焦底部的输入框,但是我们发现调用输入框的focus事件不起作用。 输入框聚焦后被弹起的键盘遮挡,要往下滑动才能看到输入框 解决 setTimeout(() => { //解决第一个问题,myInput是获取到的输入框元素 myInput.value.focus() //解决第二个问题 document.body.scrollTop = do

坚信万物皆可切的切图仔 2293

【转】ios输入框被键盘挡住的解决办法

IOS开发时,难免会遇到输入框被键盘遮掩的问题。上网上搜索了很相关的解决方案,看了很,但是由衷的觉得太麻烦了。     有的解决方案是将视图上的所有的东西都添加到一个滚动视图对象( UIScrollView )中,然后滚动视图实现输入框不被软键盘覆盖,个人觉得此方案好是好,但是太过麻烦。     有的解决方案是通过一个通知 UIKeyboardDidShowNotification 去实...

weixin_34010566的博客 257

从 0 到 1:react-native-transformer-text-input 鸿蒙化适配实录

面对一个“看起来必须要有 worklets UI runtime 原生装饰视图才能活”的库,鸿蒙适配的破局点不是硬造原生能力,而是识别出库作者自己已经认可的 JS 降级路径(web 先例),用平台文件机制把它平移过来,再尽力保住 selection 语义与 onChangeText 契约。

夏天的博客 245
上一篇: .NET、C#和ASP.NET,ASP.NET MVC 四者之间的区别
下一篇: MySQL中日期与时间类型
weixin_30954607
博客等级 码龄11年 75粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值