在iOS或Android上开发WebKit的问题/错误

时间:2011-01-12 14:22:13

标签: android ios html5 webkit

我即将开发一款支持触控功能的主要移动WebKit应用程序。

我正在寻找任何提示或有关与基于桌面的标准浏览器不同的建议。

例如:

    iOS click上的
  • 事件不会通过元素向上传播到body元素,除了某些情况(链接,输入,附加事件的元素等)。

  • Android WebKit不会为多点触控发出事件。

我知道这些。 还有其他一些问题吗?你知道一些已知问题的列表吗?

9 个答案:

答案 0 :(得分:10)

我最近在iPad上的努力中找到了一些东西。

<强> 1 版本4.2 iOS有一个错误,运行太多document.getElementById('foo');会导致浏览器滞后,从而无法正确执行命令。要解决此问题,您需要创建变量来保存此信息,并仅在需要时生成选择命令。 iOS版本4.3确实解决了这个问题,因为我已经在我的iPad上测试了它。

2:使用定位时,我发现在创建自己的视频控制器(对于html5)时,如果尝试使用position:relative或position:absolute来调整视频容器的大小,你不再会看到一个视频,而是一个漂亮的黑屏(有声!)。为了解决这个问题,只需定位父框架,你就可以了。

3:如果你正在使用iScroll,请确保加载超时;特别是如果你在页面上有一些其他javascripts,即使文档在“加载页面”时通过以下方式加载:

// Load iScroll when DOM content is ready.
document.addEventListener('DOMContentLoaded', loaded, false);

我已经失败了,并且无法理解为什么我的div为什么我的div没有正确地显示我所有的元素,但最后两个而不是滚动。相反,我只是做了一个

$(function(){
   //other page loaded items to do
   //the iScroller init
   setTimeout('iScrollerInit();',200);
});

它很快解决了这个问题。

4:如果您发现点击工作不正常,我发现许多移动SDK都存在于所有内容上的绑定项,从而难以实现对事物的点击通常你想要的。所以要解决这个问题,你可以做类似的事情:

$("#yourId").unbind("click").click(function(){ 
    //what to do when clicked
});

我发现这项工作最为出色。

**UPDATE - Nov 2012 **: It's been a few years, and there is so much more to add to this so wanted to update the list a bit.

5: Javascript在少数设备上很昂贵STILL(2012年12月)。做一些操纵DOM的东西会对设备造成很大的延迟,在做这些事情时你应该非常小心。您需要确保在Android旧设备和iPhone旧设备中测试移动网页,因为我们的指标仍然是使用良好的设备。

6:如果您要在设备(iPhone应用程序或Android应用程序)上的Web视图中传递HTML,有时您会看到几乎高度为0.您需要什么让你的iPhone或Android应用程序在实际页面上进行Javascript调用,以div为目标,检查页面offsetHeight,然后可以准确设置webview高度。

**UPDATE - Dec 2012 **: Few more awesome findings

7:我发现当您针对点击事件定位您的div时,移动浏览器会在触发事件前等待300毫秒,从而有效地创建延迟。他们这样做是为了确认点击不是双击。为了避免这种情况,你可以绑定touchend事件,而不是立即触发!

这是一些代码

$(document).ready(function() {
    $('#element').bind('touchstart', function(event) {
        event.stopPropagation();
        event.preventDefault();
        $(this).toggleClass('hover_heading');
    });

    $('#element').bind('touchend', function(event) {
        event.preventDefault();
        $(this).toggleClass('hover_heading');
    });
});

然后,当您看到项目发生眨眼时,请使用此功能将其删除。

body * {
    -webkit-tap-highlight-color: rgba(0,0,0,0);  
}

另外,如果你想查看谷歌写的一篇优秀文章你可以在这里查看:   - Creating Fast Buttons for Mobile Web Applications

**UPDATE - Feb 2013 **: Few more awesome findings

8 :在对CSS文件进行版本控制并使用以下网址缓存它们时,例如:mydomain.com/css/styles.css?v=123(或其他内容),请注意android 2.2设备早些时候,这会导致非常奇怪的行为。

根据我的发现,android将完全错误地渲染,并强制html甚至搞砸了。使用这些旧设备时最好的方法是遗憾地改变实际的文件名。

希望这些发现对其他人有所帮助,因为我已经在这些问题中挣扎了好几个小时让我头脑发热:)

答案 1 :(得分:6)

我不知道编译列表,但我可以列出一些:

  • Android中不支持(当前)SVG,因为它已被关闭。 Honeycomb将提供支持。相比之下,iOS已经启用了SVG支持,它似乎运行良好。
  • 虽然两种浏览器都支持CSS3不透明度,但请确保彻底测试任何动画,因为对于更复杂的图形(尤其是多层不透明度),它们可能会非常不稳定。
  • 在我的javascript中,我通常会为了速度而听“touchstart”,“touchmove”或“touchend”事件(“点击”事件通常会引起明显的延迟)和粒度。
  • HTML5功能,例如localStorage,新的音频和视频标签似乎运作良好。但是,在iphone上,您无法自动播放音频或视频,因为播放事件(和相应的下载)必须由用户直接触发。
  • 涉及移动(改变x和y坐标)的过渡非常平滑。相比之下,涉及不透明度的转换可能会非常不稳定,具体取决于所涉及的资源(有时您可能必须使用精灵来获得更平滑的感觉。)

只是一些快速观察。

答案 2 :(得分:1)

我最近写了一篇关于使用html5框架的一些博客的博客文章 - 在我的案例中,Sencha Touch构建了一个包含在PhoneGap中的本机应用程序。

http://www.moneytoolkit.com/2011/05/the-problem-with-sencha-touch-and-phonegap/

答案 3 :(得分:1)

Android中的3D webkit已被破坏,特别是涉及与输入字段相关的任何内容时。

http://code.google.com/p/android/issues/detail?id=13048

在某些情况下,我一直在尝试追踪随机的CSS行为,最终归结为更高元素中的-webkit-transform:translate3d(0,0,0);(以便在iOS设备中启用硬件加速),将所有内容都抛弃。

答案 4 :(得分:0)

position: fixed不起作用。

The mobile section of QuirksMode可能非常方便。

答案 5 :(得分:0)

嗯,在Android中有一个令人讨厌的错误,用Javascript设置插入符号或选择对输入发生的位置没有实际影响。
我问了一个关于它的问题,结论是它是一个浏览器错误:(,它发生在2.2和2.3中。

Focus textarea with caret after text in Android browser

答案 6 :(得分:0)

我遇到过两个“特征”:

  1. 输入框不响应触摸事件(ontouchstart,ontouchmove,ontouchcancel),这也意味着ontouchmove =“event.preventDefault()”不会阻止页面滚动,如果你正在创建一个固定页面,非 - 可滚动的应用程序。 (可以使用隐藏的div创建一个笨重的解决方法。)

  2. 无法在Android或iOS上的WebKit中的任何表单字段上使用autofocus或element.focus()。元素将接收光标,但键盘不会出现。我仍然试图为此构建一个解决方法,但目前它是一个已知的,故意的限制。 :(

答案 7 :(得分:0)

  

iOS点击事件上的Blockquote不会向上传播到元素上的元素,除了某些情况(链接,输入,附加事件的元素等)

这对我很有帮助 - 谢谢。

我们的Web应用程序的用户测试中出现的一个UX项目是选择元素的iOS交互是糟糕的。它需要3次点击:1)单击选择器元素,2)单击要选择的项目,3)单击完成。当您单击“完成”时,没有任何事件可以解决。因此,对于短列表,最好是创建自己的弹出菜单或其他交互。

答案 8 :(得分:0)

溢出:Android 2.3上不支持滚动

你必须手动让你的div滚动(touchmove + scrollTop更改),如果它们在容器中

有一个令人讨厌的错误,如果他们或他们的容器在任何时候被隐藏,Android 2.3上的选择框将无法激活

http://code.google.com/p/android/issues/detail?id=10280