在页面底部的iphone http://jsbin.com/unese4/8中查看此演示页面,有一个下拉列表打开但无法正常工作。
此问题与此问题iScroll 4 not working with form <select> element iPhone Safari and Android browser
有关答案 0 :(得分:7)
实际上,您的问题与此问题有关:
当输入在iOS Safari中获得焦点时,它会检查输入是否在视图中。如果不是,Safari会强制滚动文档以及包含输入的元素,以使其可见。
iScroll使用CSS变换来移动可滚动区域,看起来Safari的行为已被打破select
s - 它没有注意到变换,认为select
已经过了查看,并滚动其容器(#scrollable
)以使其可见(再次,不考虑转换),这使它远离视图。
这基本上是一个iOS错误,受问题影响的Web开发人员应该是reported to Apple!可以在iScroll内部最有效地实施解决方法,因此我建议您向开发人员报告该问题。
那就是说,我已经提出了一个解决方法,你可以在这个答案的底部找到。您可以通过使用iScroll实例调用它一次来使用它:
workAroundiScrollSelectPositioning(myScroll);
现场演示在您的jsbin粘贴here。它会在select
获得焦点时触发,并执行三项操作:
记住滚动位置,并告诉iScroll立即滚动到左上角(删除任何变换),并将滚动区域的top
和left
CSS属性设置为当前滚动位置。在视觉上,一切看起来都一样,但滚动区域现在以Safari将看到的方式定位。
阻止iScroll查看任何触摸(这很难看,但是当我们重新定位时,它会阻止iScroll在滚动区域上应用转换)。
当select
失去焦点时,将所有内容恢复原状(恢复原始位置并转换并停止阻止iScroll)。
仍然存在元素位置被搞砸的情况(例如,当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);}