smartJQueryZoom 是一个很好用的库。

它基于jQuery,可以对某个元素(比如 img)进行渲染,渲染之后可以放大这个区域,在做图片浏览时很好用。

但它有一个兼容性BUG:

当浏览器不是chrome(比如safari)时,放大倍率会出现问题:滚轮滚一下,就直接到了最大倍率。

为了修复这个BUG,我看了一下这个库的源码。

// listening mouse and touch events
if(settings.touchEnabled == true)
targetElement.bind('touchstart.smartZoom', touchStartHandler);
if(settings.mouseEnabled == true){
if(settings.mouseMoveEnabled == true)
targetElement.bind('mousedown.smartZoom', mouseDownHandler);
if(settings.scrollEnabled == true){
containerDiv.bind('mousewheel.smartZoom', mouseWheelHandler);
containerDiv.bind( 'mousewheel.smartZoom DOMMouseScroll.smartZoom', containerMouseWheelHander);
}
if(settings.dblClickEnabled == true && settings.zoomOnSimpleClick == false)
containerDiv.bind('dblclick.smartZoom', mouseDblClickHandler);
}
document.ondragstart = function () { return false; }; // allow to remove browser default drag behaviour
if(settings.adjustOnResize == true)
$(window).bind('resize.smartZoom', windowResizeEventHandler); // call "adjustToContainer" on resize if(settings.initCallback != null) // call callback function after plugin initialization
settings.initCallback.apply(this, targetElement);
},

红色字的方法:

    /**
* call zoom function on mouse wheel event
* @param {Object} e : mouse event
* @param {Object} delta : wheel direction 1 or -1
*/
function mouseWheelHandler(e, delta){
var smartData = targetElement.data('smartZoomData'); if(smartData.currentWheelDelta*delta < 0) // if current and delta have != sign we set 0 to go to other direction
smartData.currentWheelDelta = 0;
smartData.currentWheelDelta += delta; // increment delta zoom faster when the user use wheel again
publicMethods.zoom(smartData.mouseWheelDeltaFactor*smartData.currentWheelDelta, {"x":e.pageX, "y":e.pageY}); // 0.15
}

注意这个注释:

@param {Object} delta : wheel direction 1 or -1

作者默认 delta 是 1 或者 -1 ,但是其实并不是如此。

比如在safari上,这个值是 或者 -40 .

一旦这个值错了,后面的放大计算就会出错。

所以修复的方法也很简单:保证delta永远是 1 或者 -1 就行了。

     function mouseWheelHandler(e, delta){
var smartData = targetElement.data('smartZoomData'); // if delta !== 1
if (delta > 1) {
delta = 1
} else if (delta < -1) {
delta = -1
}
// end if(smartData.currentWheelDelta*delta < 0) // if current and delta have != sign we set 0 to go to other direction
smartData.currentWheelDelta = 0;
smartData.currentWheelDelta += delta; // increment delta zoom faster when the user use wheel again
publicMethods.zoom(smartData.mouseWheelDeltaFactor*smartData.currentWheelDelta, {"x":e.pageX, "y":e.pageY}); // 0.15
}

以上。

smartJQueryZoom(smartZoom) 存在的兼容性BUG,以及解决方法的更多相关文章

  1. 浅谈Android Fragment嵌套使用存在的一些BUG以及解决方法

    时间 2014-03-18 18:00:55 eoe博客 原文  http://my.eoe.cn/916054/archive/24053.html 主题 安卓开发 自从Android3.0引入了F ...

  2. ios/iphone手机请求微信用户头像错位BUG及解决方法

    转:http://www.jslover.com/code/527.html ios/iphone手机请求微信用户头像错位BUG及解决方法 发布时间:2014-12-01 16:37:01 评论数:0 ...

  3. ie下没有背景色bug的解决方法

    鼠标经过下面的二级菜单的时候,在ie下面,收缩上去了,给这个二级菜单加了背景后,就是正常的,这个是ie下面的一个bug,解决方法:background-img:url(123.jpg):url里面的图 ...

  4. 微擎系统BUG漏洞解决方法汇总(原创)

    微擎微赞系统BUG漏洞解决方法汇总 弄了微擎系统来玩玩,发觉这个系统BUG还不少,阿里云的提醒都一大堆,主要是没有针对SQL注入做预防,处理的办法基本都是用转义函数. 汇总: 1. 漏洞名称: 微擎任 ...

  5. 微擎系统BUG漏洞解决方法汇总

    微擎微赞系统BUG漏洞解决方法汇总 弄了微擎系统来玩玩,发觉这个系统BUG还不少,阿里云的提醒都一大堆,主要是没有针对SQL注入做预防,处理的办法基本都是用转义函数. 汇总: 1. 漏洞名称: 微擎任 ...

  6. ie6,ie7,ie8 css bug兼容解决方法

    IE浏览器以不支持大量的css 属性出名,同时也因其支持的css属性中存在大量bug. 这里收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决,也希 ...

  7. Arduino下LCD1602综合探究(下)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法

    一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduin ...

  8. 10个常见的IE bug和解决方法

    1.IE6 幽灵文本(Ghost Text bug) 在我写本文之前,我遇到了这个bug.它相当的古怪和滑稽.一块不知哪来的重复的文本,被IE6显示在靠近原文本的下面.(译注:也可以参看 Explor ...

  9. IE6/7/8 CSS兼容性问题和解决方法汇总

    断断续续的在开发过程中收集了好多的bug以及其解决的办法,都在这个文章里面记录下来了!希望以后解决类似问题的时候能够快速解决,也希望大家能在留言里面跟进自己发现的ie6 7 8bug和解决办法! 1: ...

随机推荐

  1. docker镜像瘦身思路

    docker镜像瘦身思路 一.简介 docker镜像太大,带来了以下几个问题: 存储开销 这块影响其实不算很大,因为对服务器磁盘来说,15GB的存储空间并不算大,除非用户服务器的磁盘空间很紧张 部署时 ...

  2. linux kernel update

    linux内核升级 最近HW行动,报出来的linux系统内核漏洞,环境中全部是2.6.32-431.el6.x86_64的主机,需要全部升级到754版本,这也是第一次进行内核升级操作. 先找了一台和生 ...

  3. 一对多分页的SQL到底应该怎么写?

    1. 前言 MySQL一对多的数据分页是非常常见的需求,比如我们要查询商品和商品的图片信息.但是很多人会在这里遇到分页的误区,得到不正确的结果.今天就来分析并解决这个问题. 2. 问题分析 我们先创建 ...

  4. 作为一个Java开发你用过Jib吗

    1. 前言 Jib是Google开发的可以直接构建 Java应用的Docker和OCI镜像的类库,以Maven和Gradle插件形式提供.它最骚操作的是可以在没有Docker守护程序的情况下构建,也就 ...

  5. 【部分】Asp.Net Mvc 控制器与视图的数据传递

    原文:https://www.cnblogs.com/lsgsanxiao/p/5105639.html 数据传递也就是控制器和视图之间的交互,比如在视图中提交的数据,在控制器怎么获取,或者控制器从业 ...

  6. windows 下搭建 MQTT 服务

    1.首先搭建起MQTT服务 1.1安装mosquitto,mosquitto是开源的MQTT代理服务器,它的Windows安装包地址:https://mosquitto.org/download/ 1 ...

  7. 解决wpf项目中无法添加OpenFileDialog 实例的问题

    直接添加引用:using Microsoft.Win32; 或者放置鼠标于OpenFileDialog OpenFileDialog ofd = new OpenFileDialog(); 操作点击

  8. unicode键盘编码表

    键盘uniCode编码 功能键:       8 ==>   Backspace             9 ==>   Tab             12==>   Clear ...

  9. All elments are null 异常

    问题描述:1.查询的size是1,但是里面的展示All elmemts are null . 因为之前没有遇到过这个问题,所以先百度了一下,发现有字段不对的,resultMap对不上的,我看了一下都是 ...

  10. UVA1464 Traffic Real Time Query System

    传送门:https://www.luogu.com.cn/problem/UVA1464 看到这道题,求必经的点数,还是无向图.那么妥妥的圆方树.圆方树上的任意两圆点间的路径必定是圆点方点相交错的,对 ...