<select>使用iScroll4脚本</select>在iphone浏览器中下拉闪烁

时间:2011-04-24 15:01:35

标签: javascript iphone css mobile-safari iscroll4

在页面底部的iphone http://jsbin.com/unese4/8中查看此演示页面,有一个下拉列表打开但无法正常工作。

此问题与此问题iScroll 4 not working with form <select> element iPhone Safari and Android browser

有关

3 个答案:

答案 0 :(得分:7)

实际上,您的问题与此问题有关:

  

webkit-transform issue on safari using select elements

当输入在iOS Safari中获得焦点时,它会检查输入是否在视图中。如果不是,Safari会强制滚动文档以及包含输入的元素,以使其可见。

iScroll使用CSS变换来移动可滚动区域,看起来Safari的行为已被打破select s - 它没有注意到变换,认为select已经过了查看,并滚动其容器(#scrollable)以使其可见(再次,不考虑转换),这使它远离视图。

这基本上是一个iOS错误,受问题影响的Web开发人员应该是reported to Apple!可以在iScroll内部最有效地实施解决方法,因此我建议您向开发人员报告该问题。

那就是说,我已经提出了一个解决方法,你可以在这个答案的底部找到。您可以通过使用iScroll实例调用它一次来使用它:

workAroundiScrollSelectPositioning(myScroll);

现场演示在您的jsbin粘贴here。它会在select获得焦点时触发,并执行三项操作:

  1. 记住滚动位置,并告诉iScroll立即滚动到左上角(删除任何变换),并将滚动区域的topleft CSS属性设置为当前滚动位置。在视觉上,一切看起来都一样,但滚动区域现在以Safari将看到的方式定位。

  2. 阻止iScroll查看任何触摸(这很难看,但是当我们重新定位时,它会阻止iScroll在滚动区域上应用转换)。

  3. select失去焦点时,将所有内容恢复原状(恢复原始位置并转换并停止阻止iScroll)。

  4. 仍然存在元素位置被搞砸的情况(例如,当textarea具有焦点但仅部分在视图中时,您键入并导致Safari尝试将其余部分放入视图中) ,但这些最好在iScroll中修复。


    function workAroundiScrollSelectPositioning(iscroll){
        iscroll.scroller.addEventListener('focusin', function(e){
            if (e.target.tagName === 'SELECT') {
                var touchEvent = 'ontouchstart' in window ? 'touchmove' : 'mousemove',
                    touchListener = {
                        handleEvent: function(e){
                            e.stopPropagation();
                            e.stopImmediatePropagation();
                        }
                    },
                    blurListener = {
                        oldX: iscroll.x,
                        oldY: iscroll.y,
                        handleEvent: function(e){
                            iscroll.scroller.style.top = '';
                            iscroll.scroller.style.left = '';
                            iscroll.scrollTo(this.oldX, this.oldY, 0);
                            e.target.removeEventListener('blur', blurListener, false);
                            iscroll.scroller.removeEventListener(touchEvent, touchListener, true);
                        }
                    };
                iscroll.scroller.style.top = iscroll.y + 'px';
                iscroll.scroller.style.left = iscroll.x + 'px';
                iscroll.scrollTo(0, 0, 0);
                e.target.addEventListener('blur', blurListener, false);
                iscroll.scroller.addEventListener(touchEvent, touchListener, true);
            }
        }, false);
    }
    

答案 1 :(得分:2)

您可以在该位置使用自定义表格视图,假设您想在用户单击文本字段时显示下拉列表。 所以当用户clcik在textfield上时,委托方法会调用TextFieldBeginEditing并在里面创建一个小表视图。看起来像下拉列表...

答案 2 :(得分:1)

这是修改过的函数workAroundiScrollSelectPositioning,对我有用。

function workAroundiScrollSelectPositioning(iscroll){
var touchEvent = 'ontouchstart' in window ? 'touchstart' : 'mousemove',
    oldX, oldY;
iscroll.scroller.addEventListener('focusin', function(e){
    if (e.target.tagName === 'SELECT') {
        var blurListener = {
                oldX: oldX,
                oldY: oldY,
                handleEvent: function(e){
                    iscroll.scroller.style['margin-top'] = '';
                    iscroll.scroller.style.left = '';
                    iscroll.scrollTo(oldX, oldY, 0);
                    e.target.removeEventListener('blur', blurListener, false);
                }
            };
        iscroll.scroller.style['margin-top'] = oldY + 'px';
        iscroll.scroller.style.left = oldX + 'px';
        iscroll.scrollTo(0, 0, 0);
        e.target.addEventListener('blur', blurListener, false);
    }
}, false);
iscroll.scroller.addEventListener(touchEvent, {
    handleEvent: function(e){
        if (e.target.tagName === 'SELECT') {
            oldX = iscroll.x,
            oldY = iscroll.y;
            e.stopPropagation();
            e.stopImmediatePropagation();
        }
    }
}, true);}