iScroll 4,把禁掉的:active样式还给我~
iScroll这个移动端的滚动神器大家都非常熟悉了,直到现在仍是实现移动端Web滚动的首选方案之一。。。
当我接触移动端Web时iScroll已经有两个版本了,iScroll 4和iScroll 5,当时看到很多文章都是关于iScroll 4的,看来这个版本已经得到的非常广泛的应用,而iScroll 5的文章相对非常之少,好吧,项目进度耽误不起,我们就选当前最流行的这个版本吧(iScroll 4.2.5),想必也是最成熟稳定的。。。
iScroll 4的官网地址:
这个插件的功能全面,使用也简单,应对表面统一的移动浏览器平台(我们只关注webkit核心~~ ^_^)感觉游刃有余,对于性能问题,使用初期也察觉到有什么异样(看来常年停留在安卓2.3系统的我根本不知道顺滑与卡顿的区别~~),心里还在莫莫崇拜国外牛人多啊~~
直到项目进入后期完善阶段了,就会到处点一点,按一按,检查下前端工作是否有重大Bug,突然间意识到有些页面表现怪怪的,一些Button点击时少了一点什么效果,原来是在点击按钮时没有表现出交互效果!
查看下CSS代码,明明我在.btn类上加了:active效果了的,而且在应用iScroll滚动的区域外的button是有效果的(我是用桌面Chrome模拟器的),那问题一定是出在iScroll身上了。。。其实这个问题也可以理解,在很多类似的模拟插件中如果不禁用掉系统默认事件或者效果的话,达不到完美的用户体验效果,印象中桌面端的那个mousewheel插件就是如此。。。
那我就看API,找度娘~~原来很早有很多人已经遇到这样的问题了,比如园里的Tony同学(http://www.cnblogs.com/lostyu/p/3907256.html)哈哈,有人进过坑,就意识着有人成功跳出过坑~~直接把解决方法拿来用是我们前端城狮的必要技术之一,于是我也复制之~~ ^o^
iScroll作者当时一刀砍啊,所有默认行为全部干掉了:
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();
}
这个方法很直接,很有效,将最为常用的系统组件select、option、input、textarea等等在iScroll中点击无效的问题解决了;
但是如果我们想让Button也能点击且有点击效果的话,就要手动再加 && nodeType != 'button' 到代码里去,也行吧~~~
但是如果我们想让<a class="btn">也有点击效果~~~,就要进一步改造啦。
对了,不是有iScroll 5了吗,它会不会有这个问题呢?看一下API, 新版本已经有相关的控制参数了: options.preventDefaultException
iScroll 5官网API:
http://iscrolljs.com/#advanced-options
要不直接换iScroll 5? 了解过iScroll 5的同学要先呵呵一下,因为iScroll 5已经不是4+1=5那么简单了。
iScroll 5已经完全重写了,不少接口都做了改变,就连实例化的方式都不同了,这么说吧,iScroll 4与5完全是两个东西,你甚至可以在同一个页面中同时使用它们俩:
iScroll 4使用:
new iScroll('scroll-wrapper-1');
iScroll 5使用:
new IScroll('#scroll-wrapper-2');
iScroll 5提供的那个配置接口参数可以解决我们之前遇到的问题:
new IScroll('#pro-detail',{
preventDefaultException: { tagName: /^(INPUT|TEXTAREA|BUTTON|SELECT)$/, className: /(^|\s)btn(\s|$)/ }
});
看到 className: /(^|\s)btn(\s|$)/ 了吗? 这样就可以使.btn的元素不被preventDefault()方法干扰。
由于换用iScroll5的劳动成本略大于对iScroll4的改进(其实是不改心里有点难受,我不是处女座),我们开始改动工~
我们学习iScroll 5的样子,为iScroll 4也添加配置参数(大概在107行):
// Default options
that.options = {
hScroll: true,
vScroll: true,
x: 0,
y: 0,
bounce: true,
bounceLock: false,
momentum: true,
lockDirection: true,
useTransform: true,
useTransition: false,
topOffset: 0,
checkDOMChanges: false, // Experimental
handleClick: true,
preventDefaultException: "", // ex: "A|BUTTON|.btn-class|#btn-id" 。。。
然后将那个onBeforeScrollStart方法在同学们改造过的基础之上变得更丰满,如下:
onBeforeScrollStart: function (e) {
var nodeType = e.explicitOriginalTarget ? e.explicitOriginalTarget.nodeName.toLowerCase() : (e.target ? e.target.nodeName.toLowerCase() : '');
var excpt = that.options.preventDefaultException.replace(/\s/g, ""), excptArr = null, targetNode = null;
if (nodeType != 'select' && nodeType != 'option' && nodeType != 'input' && nodeType != 'textarea' && !isExcptNode(e.target, excpt)) {
e.preventDefault();
}
function isExcptNode(_node, _excptStr) {
var result = false;
if (_excptStr) {
targetNode = _node;
excpt += _excptStr.match("|") ? "" : "|";
excptArr = excpt.split("|");
for (i in excptArr) {
if (targetNode.nodeName.toString().toLowerCase() == excptArr[i].toLowerCase()) {
result = true;
break;
}
else if (excptArr[i].match("#")) {
if (targetNode.id.match(excptArr[i].replace("#", ""))) {
result = true;
break;
}
}
else if (excptArr[i].match(".")) {
if (targetNode.className.match(excptArr[i].replace(".", ""))) {
result = true;
break;
}
}
}
}
return result;
}
}
于是,我们也可以在使用iScroll4时这样啦:
new iScroll('wrapper', {
useTransition: false,
vScrollbar: false,
preventDefaultException:".btn|.btn-b|#btn-submit"
});
iScroll 4,把禁掉的:active样式还给我~的更多相关文章
- 移动端bug~~移动端:active伪类无效的解决方法【移动端 :active样式无效】
移动端:active伪类无效的解决方法[移动端 :active样式无效]2016-09-26 15:46:50 问题: 移动端开发的时候实现按钮的点击样式变化,但是在iphone[safiri Mo ...
- unity, 在OnDisable里一定要将Cloth禁掉
如果在OnDisable中不将Cloth组件禁掉,则当物体再次激活时布料将变形.
- Qt中如何禁掉所有UI操作以及注意事项(处理各个widget的eventFilter这一层,但是感觉不好,为什么不使用QApplication呢)
刚做完的一个项目,在测试时出现了一个问题:由于多线程的存在,当进行语音识别时:如果用户点击程序界面上的button或者其他接受点击事件后会发出信号的widget时,程序会crash ! 后来尝试着从多 ...
- html5 vedio 播放器,禁掉进度条快进快退事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件。
原因:在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件. 解决办法: .随便写一条iptables命令配 ...
- vue 如何通过监听路由变化给父级路由菜单添加active样式
1.项目需求:在项目开发中,多级菜单的情况下,勾选子菜单时,需要在父级菜单添加active样式. 2.遇到的问题:一级路由菜单的话,点击当前路由会自动在路由标签上添加router-link-exact ...
- VUE 动态切换列表active样式
参考VUE官方文档样式绑定 https://cn.vuejs.org/v2/guide/class-and-style.html 需求是动态加载出来了所有菜单列表,点击其中一个li元素改变这个元素的背 ...
- 5. iphone 的:active样式
如果给按钮定义 :hover 样式,在 iPhone 上按钮点击一次是 hover 态,再点击一次 hover 态才会消失,这不是我们想要的,继而想通过定义 :active 样式来实现按钮按下时的效果 ...
- vue active样式显示
html:代码 <ul> <li @click="current='xxxx'" :class="{active:current=='xxxx'}&qu ...
随机推荐
- easyui的样式easyui-textbox的一个bug
easyui-testbox这个样式很恶心,用了这个就不能用传统的JQ来取值了,最近在使用上又发现了一个问题,就是赋值为0时,在输入框上会不显示,坑. <input class="ea ...
- javascript动态改变iframe的src
页面中需要动态的改变iframe的地址,方法有: 1. window.frames["chartFrame"].document.location = "<%=ba ...
- PLSQL笔记
/*procedurallanguage/sql*/--1.过程.函数.触发器是pl/sql编写的--2.过程.函数.触发器是在oracle中的--3.pl/sql是非常强大的数据库过程语言--4.过 ...
- OC字符串的常用方法
网上写的关于字符串常用方法的博客很多,这里我简单做了下总结!不喜勿喷哦! 一.创建字符串 #import <Foundation/Foundation.h> //NSString //创建 ...
- 随记1(#define a 10和const int a=10)
正是求职笔试旺季,前几天听说有人遇到此题:#define a 10 和const int a=10的区别,废话不多说,下面来解释一下: #define 指令是定义符号常量 const 定义的是常变 ...
- Algorithms 4th - 1.1 Basic Programming Model - EXERCISES
欢迎交流 1.1.1 a. 7 b. 200.0000002 c. true 1.1.2 a. 1.618 b. 10.0 c. true d. 33 1.1.3 public class MainA ...
- 游戏基础元素之精灵——Cocos2d-x学习历程(九)
1.创建精灵 在实际使用中,精灵是由一个纹理创建的.在不加任何设置的情况下,精灵就是一张显示在屏幕上的图片.通常精灵置于层下,因此我们首选在层的初始化方法中创建精灵,设置属性,并添加到层中. 有多种方 ...
- C++ Builder平台使用Indy9开发自动FTP程序01
Indy9与CB自带的Indy8不同处还是挺多的.首先就是图标变漂亮了,其次很多Method都重写了.它主要是依据Delph里的函数,力求与之相通.不同点在本系列的后续章节中会一一介绍. 在写ftp代 ...
- JVM学习之JVM1.6 GC详解
转自:http://www.cnblogs.com/ggjucheng/p/3977384.html,多谢分享 前言 JVM GC是JVM的内存回收算法,调整JVM GC(Garbage Colle ...
- 关于三星手机照相机调用适配问题Android
因为三星手机在照相的时候,会自动将自动转化为为横屏. 这里的话 就不讲具体怎么实现的,因为在网络上是有相关的代码. 主要的是在你拍完照返回的时候,先前的界面可能会重绘,所以会导致一些问题. 我暂时的办 ...