iScroll滚动区域中select、input、textarea元素无法点击的Bug修复

最近在一个项目中使用了iScroll4模拟滚动效果,调试过程中发现一个表单页中的所有表单项都无法点击聚焦, 如<select>、<input>、<textarea>。这是因为iScroll要监听整个页面事件,为了达到 最优效果,它默认禁用了所有元素的默认事件(但也有例外,如<a>默认事件不受影响),所以才造成这些表单元素点击没有反应,无法正常聚焦。

我们打开 iscroll.js ,找到这一行:
onBeforeScrollStart : function(e){ e.preventDefault(); },
将其改为:
onBeforeScrollStart : function(e){var nodeType =
e.explicitOriginalTarget ?
e.explicitOriginalTarget.nodeName.toLowerCase() : (e.target ?
e.target.nodeName.toLowerCase() : ”);if(nodeType != ‘select’ &&
nodeType != ‘option’ && nodeType != ‘input’ && nodeType
!= ‘textarea’){e.preventDefault();}},

这样,input及textarea可以正常聚焦了,但是发现select点击还是没有弹出下拉列表框。

这是因为 iscroll
默认使用的是css的transform变形中的translate3d实现区域滚动,每次滚动实际是改变translate3d中的y轴值,实际的
dom位置并没有发生变化。translate3d会导致页面的焦点错误,系统级下拉菜单的显示则会导致其出现显示偏离。

控制滚动模式的代码默认是:useTransform:
true。好在iscroll提供了另一种滚动方式,基于绝对定位位置变化的滚动。修改为useTransform:
false之后,iscroll就会使用对定位位方式来实现滚动,该方式是我们在web开发中模拟动画的最常用方式,滚动之后dom的实际位置也同步发生
了变化,不会出现错位偏离现象。

以上修改后,所有的表单元素都能正常使用了,不过需要注意,使用对position决定定位后,滚动区的宽度默认会自适应内容宽度,而不是父元素的100%,所以最好将滚动区域宽度设为100%。

时间: 2024-12-19 12:39:19

iScroll滚动区域中select、input、textarea元素无法点击的Bug修复的相关文章

IE7局部滚动区域下绝对定位或相对定位元素不随滚动条滚动的bug

尽管在项目中测试人员已经慢慢淡化了IE6的测试,但是IE7依然还是要纳入测试范围. 最近碰到一个IE7的蛋疼bug,在页面上设置了一个局部的滚动区域,在拖动滚动条的时候,滚动区域内设置了相对定位或绝对定位的元素不随滚动条移动位置. 蛋碎了一地... 在网上查了下看看大家都是怎么破这个问题的,发现这个问题居然也是个普遍问题,好吧. 解决方法: 如果 .scrollerArea{} 是滚动区域 那么,在样式里面加上ie7的hack .scrollerArea{*position:relative;*

js控制ios端的input/textarea元素失去焦点时隐藏键盘

同事在测试产品时发现这样一个:"某些页面击完input框,在点空白处时,iOS设备的键盘不能隐藏并且焦点也不会失去" 带着这个问题我进行了测试,发现在安卓的设备上并没有这种问题出现. 于是写js进行测试给document添加一个click事件,发现了问题的原因: 安卓是可以触发click事件的,而iPhone不会触发. 也就是说在iOS设备下你点击空白的document处input并不能失去焦点. 解决办法: 既然click不能触发iPhone的事件,那就需要找触屏事件来触发一次: o

IOS下H5的input/textarea元素失去焦点时隐藏键盘

IOS下document添加一个click事件不触发,不会失去焦点,导致点击input框外的其它地方不会自动消失键盘,还有就是双击其它空白地方会导致整个页面上移 既然click不能触发,可以用移动端的touch事件进行: ontouchstartontouchmoveontouchendontouchcancel 判断当前点击的元素是不是在输入框上,不是就调用blur()方法主动失去焦点即可.

html5中form表单新增属性以及改良的input标签元素的种类

在HTML5中,表单新增了一些属性,input标签也有了更多的type类型,有些实现了js才能实现的特效,但目前有些浏览器不能全部支持.下面是一些h5在表单和input标签上的一些改动. <!DOCTYPE html><html> <head> <title>表单测试</title> <meta charset="utf-8" /> <!-- 在不支持h5的浏览器中,可以用CSS样式进行改写 --> &

iscroll中使用input框的话是导致无法选中input框

在使用iscroll的移动端的时候如果在iscroll中使用input框的话是导致无法选中input框 原因:iscroll需要一直监听用户的touch操作,以便灵敏的做出对应效果,所以它把其余的默认事件屏蔽了. iscroll.js源码: onBeforeScrollStart: function (e) { e.preventDefault(); }, 更改: onBeforeScrollStart: function (e) { var target = e.target; while (

解决iScroll横向滚动区域无法拉动页面的问题

近期项目中使用iScroll遇到一个问题,在设定wrapper为横向滚动时,如果你手指放在该区域,将无法拉动页面,也就是说该区域取消了默认事件.这个体验是实在是无法接受,特别是页面中有多个横向滚动区域时,很容易触碰到这种区域,这时用户将觉得页面很卡. Google搜了一下,看来很多人都为这个问题而烦恼.有高人给出了解决方案,在 这里 可以找到. 代码如下: myScroll = new iScroll('scrollpanel', { // other options go here... vS

JavaScript向select下拉框中添加和删除元素

JavaScript向select下拉框中添加和删除元素 1.说明 a   利用append()方法向下拉框中添加元素 b   利用remove()方法移除下拉框中最后一个元素 2.设计源码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xm

改变form里面input,textarea.select等的默认样式

因为在项目中有时候需要照顾到整体的色调问题,所以不得不对表单默认的样式进行更改,以下只是对input里的文本颜色做了更改. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> input::-webkit-input-placeholder, texta

Safari中的input、textarea无法输入的问题

原因是这两种表单元素上应用了user-select:none的css属性.一般没人刻意这么做,可能是这样的情况: * { user-select: none; } 在选择器中排除掉这两种元素就好了: :not(input, textarea) { user-select: none; }