Javascript iScroll 4不在输入元素上滚动

Javascript iScroll 4不在输入元素上滚动,javascript,android,ios,iscroll,Javascript,Android,Ios,Iscroll,我正在开发一款针对安卓2.2+、黑莓9+和iOS 4+的移动应用程序。在我们的堆栈中,我们使用Phonegap、jQuery和(以及其他) 我们的一个应用程序屏幕看起来像这样(为匿名而编辑的文本)-在iOS5模拟器的Safari中运行 正如您所看到的,这是一个典型的输入屏幕,具有固定的标题和多个块级表单元素,这些元素以较少的填充来扩展整个设备屏幕 正如我提到的,我们的应用程序使用iScroll。我们在此页面上使用以下代码(取自iScroll“表单”示例)对其进行初始化 在这个屏幕上,我注意到当

我正在开发一款针对安卓2.2+、黑莓9+和iOS 4+的移动应用程序。在我们的堆栈中,我们使用Phonegap、jQuery和(以及其他)

我们的一个应用程序屏幕看起来像这样(为匿名而编辑的文本)-在iOS5模拟器的Safari中运行

正如您所看到的,这是一个典型的输入屏幕,具有固定的标题和多个块级表单元素,这些元素以较少的填充来扩展整个设备屏幕

正如我提到的,我们的应用程序使用iScroll。我们在此页面上使用以下代码(取自iScroll“表单”示例)对其进行初始化

在这个屏幕上,我注意到当用户触摸背景的任何部分时,内容都会很好地滚动,但当您通过触摸其中一个输入元素开始滚动手势(向上或向下滑动)时,内容不会滚动。正如您所理解的,这本质上使这个屏幕无法使用,因此我正在寻找修复方法

从那以后,我在iScroll中找到了罪魁祸首

if (nodeName == "TEXTAREA" || nodeName == "INPUT" || nodeName == "SELECT" ) return; 
(在iscroll.js中为179),一个声明了修复,一个,但是错误的作者似乎有不正确的行号,阻止我尝试修复,并且提到的拉请求对我不起作用(在iOS 5.1、Android 4.0.4上测试)

我的问题-是否有某种方式允许用户在触摸输入元素时滚动(使用iScroll)?否则,在这种情况下,iScroll是完全无用的。目前,我正在考虑

  • 使用声称与iScroll具有相同功能的,但由于我们的一个关键平台,这不是一个很好的选择
  • 取消iScroll和松开固定收割台
现在是2012年——我们还没有办法在移动浏览器上做到这一点吗

删除preventDefault():


我遇到了完全相同的问题,在设置iScroll时使用了以下方法:

var ISCROLL_MOVE;

var ISCROLL_MOVE_LIMIT=10;

// ... functions to include when you set up your iScroll
onScrollStart: function(e) {
                ISCROLL_MOVE=0;
            },
            onScrollMove: function(e) {
                ISCROLL_MOVE_LIMIT++;
            }
然后,当您的iScroll中有任何表单元素时,例如:

var selectField = document.getElementById('mySelectField');

selectField.addEventListener('touchend' /*'mousedown'*/, function(e) {

        if (SCROLL_MOVE<SCROLL_MOVE_LIMIT)
            this.focus();

    }, false);
var selectField=document.getElementById('mySelectField');
selectField.addEventListener('touchend'/*'mousedown'*/,函数(e){

如果(滚动移动我意识到这张票有点旧,但我在处理同一问题时遇到了它。 我正在iOS上使用iScroll v4

我发现这个解决方案(在某处)在设置iScroll对象时添加了以下内容:

        myScroll = new iScroll(id, {
            useTransform: false,
            onBeforeScrollStart: function (e) {
                var target = e.target;
                while (target.nodeType != 1) target = target.parentNode;

                if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {
                    e.preventDefault();
                }
            }
        });
但是,我发现此代码存在两个问题:

a) useTransform破坏了表单的布局,我在表单中自动隐藏单选按钮,以便按照此页面()显示“漂亮的图形”按钮。我不知道为什么这会破坏布局,可能这只是一个局部关系,我可以用另一种方法修复,但…我注释了useTransform,它修复了它,所以

b) 对于拉动虚拟键盘的输入,在键盘被隐藏后,页面保持“向上滚动”(页眉离开屏幕,页脚从底部向上大约1/4),因此我添加了和“onBlur”事件来“重新滚动”窗口,这似乎很有效……这是我的最终解决方案

    myScroll = new iScroll(id, {
        //useTransform: false,
        onBeforeScrollStart: function (e) {
            var target = e.target;
            while (target.nodeType != 1) target = target.parentNode;

            if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA') {
                e.preventDefault();
            } else {
                $(target).bind('blur', function(){
                    window.scrollTo(0,0);
                    myScroll.refresh();
                });
            }
        }
    });

希望这有帮助!!!

我会在这里回答,没有java脚本和iscroll黑客


我完美地解决了这个问题。如果您使用的是iscroll.js,那么您可以通过编辑iscroll.js文件轻松解决这个问题

我编辑了移动(e)函数定义。 您将在_move(e)的函数定义中看到以下代码: 在这里输入代码

that.moved = true;
   that._pos(newX, newY);
   that.dirX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0;
that.dirY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0;
if (timestamp - that.startTime > 300) {
   that.startTime = timestamp;
   that.startX = that.x;
   that.startY = that.y;
}
if (that.options.onScrollMove) that.options.onScrollMove.call(that, e);
that.moved=true;
那._pos(newX,newY);
dirX=deltaX>0?-1:deltaX<0?1:0;
也就是说,dirY=deltaY>0?-1:deltaY<0?1:0;
如果(时间戳-that.startTime>300){
that.startTime=时间戳;
that.startX=that.x;
that.startY=that.y;
}
如果(that.options.onScrollMove)that.options.onScrollMove.call(that,e);
//在else条件中包含上述代码。if条件应如下所示:

enter code here
if (e.srcElement.localName == 'textarea') {
  var scrollHeight = e.srcElement.scrollHeight;
  var scrollTop = e.srcElement.scrollTop;
  if (scrollTop >= 0 && screenTop <= scrollHeight) {
       that.dirY = that.dirY * 5;
       e.srcElement.scrollTop = scrollTop + that.dirY;
  }
}
在此处输入代码
如果(e.srceelement.localName=='textarea'){
var scrollHeight=e.srcelment.scrollHeight;
var scrollTop=e.srceelement.scrollTop;

如果(scrollTop>=0&&screenTop Hmmm-很遗憾,我们需要一个黑客来让它工作。不管怎样,谢谢你的回答!ps:即使在没有修复的情况下也可以使用iscroll!无论如何,我一点也不懂,谢谢!
that.moved = true;
   that._pos(newX, newY);
   that.dirX = deltaX > 0 ? -1 : deltaX < 0 ? 1 : 0;
that.dirY = deltaY > 0 ? -1 : deltaY < 0 ? 1 : 0;
if (timestamp - that.startTime > 300) {
   that.startTime = timestamp;
   that.startX = that.x;
   that.startY = that.y;
}
if (that.options.onScrollMove) that.options.onScrollMove.call(that, e);
enter code here
if (e.srcElement.localName == 'textarea') {
  var scrollHeight = e.srcElement.scrollHeight;
  var scrollTop = e.srcElement.scrollTop;
  if (scrollTop >= 0 && screenTop <= scrollHeight) {
       that.dirY = that.dirY * 5;
       e.srcElement.scrollTop = scrollTop + that.dirY;
  }
}