chjtx / JRoll

Smooth scrolling for the mobile web
http://www.chjtx.com/JRoll/
MIT License
460 stars 91 forks source link

判断是否为触摸设备,希望增加手动设置 #41

Closed hatt-e4 closed 7 years ago

hatt-e4 commented 7 years ago

非常棒的 code。

近期在使用时遇到这样的问题: 在触摸屏电脑上,windows 系统, JRoll 就判断非移动设备,只能 mouse 不能 touch。

希望能支持初始化参数设置当前是侦听 mouse 还是 touch

chjtx commented 7 years ago

使用了

isMobile: /mobile|phone|android|pad/.test(ua)

这个语句判断是否为移动设备,能告知 windows 移动系统的 navigator.userAgent 是什么吗?

hatt-e4 commented 7 years ago

并不是 windows 移动系统,就桌面电脑 windows 系统,但windows支持触摸屏。 据我了解,js 还无法判断当前有没有使用触摸屏,而且就算能判断到,也不能很好的适应。比如我旁边有台测试电脑,是一体机,屏幕本身支持触摸,又外接鼠标,当然希望鼠标能操作,直接点击屏幕也能操作,那么 touch 和 mouse 都应该侦听。

所以,才希望有个设置参数,比如开启触摸、开启鼠标、都开启。默认还走原判断。

chjtx commented 7 years ago

意思是添加一个选项 listen,可选值为 default、touch、mouse、all?

hatt-e4 commented 7 years ago

是这样的意思,但怎样实现要看大佬,我只是萌新。

chjtx commented 7 years ago

@hatt-e4 事件监听在new JRoll对象前执行的,而且不会每new一次就监听一次,所以不能添加到new JRoll的选项里,而且这种需求也是极少数的,所以建议自己fork个版本出来,将以下代码修改一下

// 当前版本 JRoll 2.5.0
243  // 添加监听事件
244  addEvent(utils.isMobile ? 'touchstart' : 'mousedown', _touchstart)
245  addEvent(utils.isMobile ? 'touchmove' : 'mousemove', _touchmove)
246  addEvent(utils.isMobile ? 'touchend' : 'mouseup', _touchend)
247  if (utils.isMobile) {
248    addEvent('touchcancel', _touchend)
249  } else {
250    addEvent(/firefox/.test(ua) ? 'DOMMouseScroll' : 'mousewheel', _wheel)
251  }

删除isMobile判断,修改为:

addEvent('touchstart', _touchstart)
addEvent('mousedown', _touchstart)
addEvent('touchmove', _touchmove)
addEvent('mousemove', _touchmove)
addEvent('touchend', _touchend)
addEvent('mouseup', _touchend)
addEvent('touchcancel', _touchend)
addEvent(/firefox/.test(ua) ? 'DOMMouseScroll' : 'mousewheel', _wheel)

修改后的代码能不能满足你的需求就你自己测试啦:smile:

hatt-e4 commented 7 years ago

恩,我这也真不是平常情况。多谢大佬的热心!