jQuery mobile + iScroll,无法向下滚动。

12
我正试图将jQuery MobileiScroll 4集成。我知道已经有一个项目可以实现这一点,但由于输入元素bug问题(键入时页面会疯狂跳动),我要避免使用它。
我的当前实现看起来像这样: http://jsfiddle.net/AqHsW/ - (JSFiddle示例) [备用镜像]
如您可能注意到的那样,这个解决方案非常完美,除了一个主要的问题:无法向下滚动。这个问题似乎跨操作系统/浏览器存在。
然而,如果我覆盖onBeforeScrollStart方法:
var scroller = new iScroll('wrapper', { onBeforeScrollStart: null });

它的工作效果有所提高。现在用户可以滚动,但行为变得不稳定(响应速度也很慢),使用户可以自由滚动等。

(然而,这样做似乎只会影响iOS)

我现在正在寻找解决这个问题的方法,最好支持iOS 5和6,并支持使用<input>元素。考虑到iScroll和jQuery Mobile是今天两个占主导地位的框架,这应该是一个相当普遍的问题。

2个回答

12

我稍微修改了你的代码,发现了一些问题并提供了解决方案,请查看jsfiddle

  • 由于你正在加载 jQuery,因此请使用jQuery(document).ready()

  • 在直接子元素上初始化 iScroll 比在wrapper上更为合适。

  • 我使用javascript来设置wrapper的高度,以更加精确,避免溢出,而非通过CSS设置。

  • 注意,scroll已经被定义为函数。 (在你的fiddle中,你将scroll用作变量)

  • 现在它完美地工作了!


$(function(){

    var footerHeight = $('[data-role="footer"]').outerHeight(true),
        headerHeight = $('[data-role="header"]').outerHeight(true),
        padding = 15*2; //ui-content padding

   $('#wrapper, #scroller').height( $(window).innerHeight() - headerHeight - footerHeight - padding );

   // To make inputs focusable,
   // you can rebind their touchend's event to trigger their focus

   $('input').on('touchend', function(){
       $(this).focus();
   });

   var iScroller = new iScroll('scroller');

});​

非常感谢您的努力和帮助,真的非常感激!您的解决方案修复了最初的问题,但是只有第一个元素会滚动。[http://jsfiddle.net/NUK88/4/](其他内容被留在背景中未滚动)..也无法选择`<input>元素。我尝试了各种onBeforeScrollStart`覆盖,但它们都破坏了您的解决方案.. - Zar
你有没有任何解决这个问题的想法?我卡住了。 - Zar
我其实想让所有内容(data-role="content")都可以滚动,这意味着试图让(在这种情况下)的<h1>标签与其他内容一起滚动。换句话说,所有#scroller内容都应该可以滚动...哈哈,有点乱,请您理解。 - Zar
@Pierre 你好,我已经尝试了一下你的解决方案,它按照预期工作。但是有一个问题,只有在 $(document).ready() 中运行才有效,而不是在 $("#page-id").bind('pageinit', function() { /* here */ }); 中运行。这意味着它只能在第一页上运行,而不能在多个页面上运行。你有什么解决办法吗? - Zar
@Pierre 你说得完全正确。非常感谢你的所有帮助,真的非常感激!我欠你一个大人情。 :-) - Zar
显示剩余5条评论

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接