我注意到鼠标滚轮事件在 mac osx 中发生了多次。可以归因于惯性特征。
有没有办法解决这个问题?
(请自签名 SSL 不用担心!) https://sandbox.idev.ge/roomshotel/html5_v2/
我正在使用 scrollSections.js https://github.com/guins/jQuery.scrollSections
它使用鼠标滚轮 jquery 插件:https://github.com/brandonaaron/jquery-mousewheel
我看到很多人遇到同样的问题:https://github.com/brandonaaron/jquery-mousewheel/issues/36
有一些解决方案,但没有一个适用于 scrollSections 插件。
有什么想法可以从 JS 中禁用这种惯性特性吗?
我尝试的修复:
// Fix for OSX inertia problem, jumping sections issue.
if (isMac) {
var fireEvent;
var newDelta = deltaY;
if (oldDelta != null) {
//check to see if they differ directions
if (oldDelta < 0 && newDelta > 0) {
fireEvent = true;
}
//check to see if they differ directions
if (oldDelta > 0 && newDelta < 0) {
fireEvent = true;
}
//check to see if they are the same direction
if (oldDelta > 0 && newDelta > 0) {
//check to see if the new is higher
if (oldDelta < newDelta) {
fireEvent = true;
} else {
fireEvent = false;
}
}
//check to see if they are the same direction
if (oldDelta < 0 && newDelta < 0) {
//check to see if the new is lower
if (oldDelta > newDelta) {
fireEvent = true;
} else {
fireEvent = false;
}
}
} else {
fireEvent = true;
}
oldDelta = newDelta;
} else {
fireEvent = true;
}
您可以在此处看到修复:https://sandbox.idev.ge/roomshotel/html5_v2/但这是一个命中/未命中。
最佳答案
最新的超时解决方案有一个主要缺点:动态滚动效果可能会持续很长时间(甚至 1 秒左右)......禁用滚动 1-2 秒并不是最佳决定。
太棒了,正如所 promise 的,这是另一种方法。
我们的目标是为一个用户操作提供一个响应,在本例中为滚动。
什么是'one scrolling'?为了解决这个问题,假设'one scrolling'是一个从页面开始移动到运动结束的那一刻。
动态滚动效果是通过多次移动页面(例如,每 20 毫秒)一小段距离来实现的。这意味着我们的动态滚动由许多许多小的线性“滚动”组成。
经验测试表明,这种小“滚动”在动态滚动中间每 17-18 毫秒发生一次,在开始和结束时大约 80-90 毫秒发生一次。这是我们可以设置的一个简单测试来查看:
var oldD;
var f = function(){
var d = new Date().getTime();
if(typeof oldD !== 'undefined')
console.log(d-oldD);
oldD = d;
}
window.onscroll=f;
重要!每次发生这种迷你滚动时,都会触发滚动事件。 所以:
window.onscroll = function(){console.log("i'm scrolling!")};
在一个动能卷轴中会发射 15 到 20 次以上。顺便说一句,onscroll 有很好的浏览器支持(参见 compatibility table ),所以我们可以依赖它(触摸设备除外,稍后我会介绍这个问题);
有人可能会说重新定义window.onscroll 并不是设置事件监听器的最佳方式。是的,我们鼓励您使用
$(window).on('scroll',function(){...});
或者你喜欢什么,这不是问题的重点(我个人使用我自己写的库)。
因此,在 onscroll 事件的帮助下,我们可以可靠地判断页面的这个特定的小移动是属于一个持久的动态滚动,还是一个新的滚动:
var prevTime = new Date().getTime();
var f = function(){
var curTime = new Date().getTime();
if(typeof prevTime !== 'undefined'){
var timeDiff = curTime-prevTime;
if(timeDiff>200)
console.log('New kinetic scroll has started!');
}
prevTime = curTime;
}
window.onscroll=f;
您可以调用所需的回调函数(或事件处理程序)而不是“console.log”,这样就完成了! 该函数只会在每次动态或简单滚动时触发一次,这是我们的目标。
您可能已经注意到,我使用 200 毫秒作为判断它是新滚动还是上一个滚动的一部分的标准。您可以将其设置为更大的值,以 999% 确保您阻止任何额外的调用。但是,请记住,这不是我们在我之前的回答中使用的不是。它只是任意两个页面移动之间的一段时间(无论是新卷轴还是动能卷轴的一小部分)。在我看来,动态滚动的步骤之间滞后超过 200 毫秒的可能性非常小(否则它根本不会流畅)。
正如我在上面提到的,onscroll 事件在触摸设备上的工作方式不同。它不会在动能卷轴的每一小步中触发。但它会在页面移动最终结束时触发。而且,还有ontouchmove事件……所以,没什么大不了的。如果需要,我也可以提供触摸设备的解决方案。
附言我知道我写得太多了,所以我很乐意回答您的所有问题,并在您需要时提供更多代码。
提供的解决方案在所有浏览器中都受支持,非常轻量级,更重要的是,它不仅适用于 mac,而且适用于所有可能实现动态滚动的设备,所以我认为这确实是一个可行的方法。
关于javascript - 阻止鼠标滚轮事件在 OSX 中发生两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26326958/
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
我已经在mountainlion上成功安装了rbenv和rubybuild。运行rbenvinstall1.9.3-p392结束于:校验和不匹配:ruby-1.9.3-p392.tar.gz(文件已损坏)预期f689a7b61379f83cbbed3c7077d83859,得到1cfc2ff433dbe80f8ff1a9dba2fd5636它正在下载的文件看起来没问题,如果我使用curl手动下载文件,我会得到同样不正确的校验和。有没有人遇到过这个?他们是如何解决的? 最佳答案 tl:博士;使用浏览器从http://ftp.rub
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里
在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什
例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果