多次调用mousedown()中的Mouseup()
mouseup() in a mousedown() called multiple times
$("#canvas").mousedown(function(e){
var X1 = (e.pageX - this.offsetLeft) - 8;
var Y1 = (e.pageY - this.offsetTop) - 8;
$("#canvas").mouseup(function(e){
var X2 = (e.pageX - this.offsetLeft) - 8;
var Y2 = (e.pageY - this.offsetTop) - 8;
alert(X1 + " " + X2 + " " Y1 + " " + Y2);
});
});
我遇到的问题是,第一次调用函数后(第一次工作很好,正如预期的那样)鼠标上升函数似乎被多次调用(即多个警报将显示,而不仅仅是第一次)。有没有一种方法可以防止这种情况发生,或者有更好的方法来编码这种情况?
谢谢
每次移动鼠标时,您的代码将新的 mouseup
处理程序附加到#canvas
元素。使用.one()
只附加一次处理程序:
$(this).one('mouseup', function(e){
var X2 = (e.pageX - this.offsetLeft) - 8;
var Y2 = (e.pageY - this.offsetTop) - 8;
alert(X1 + " " + X2 + " " Y1 + " " + Y2);
});
但是更好的解决方案是使用状态变量(和适当的作用域):
var clicked = false;
var X1, Y1, X2, Y2;
$("#canvas").mousedown(function(e){
X1 = (e.pageX - this.offsetLeft) - 8;
Y1 = (e.pageY - this.offsetTop) - 8;
clicked = true;
});
$("#canvas").mouseup(function(e){
if (clicked) {
X2 = (e.pageX - this.offsetLeft) - 8;
Y2 = (e.pageY - this.offsetTop) - 8;
alert(X1 + " " + X2 + " " Y1 + " " + Y2);
clicked = false;
}
});
这是因为每次触发mousedown事件时都会绑定mouseup事件。
您可以简单地在鼠标up功能的末尾添加$("#canvas").unbind('mouseup');
。
$("#canvas").mousedown(function(e){
var X1 = (e.pageX - this.offsetLeft) - 8;
var Y1 = (e.pageY - this.offsetTop) - 8;
$("#canvas").mouseup(function(e){
var X2 = (e.pageX - this.offsetLeft) - 8;
var Y2 = (e.pageY - this.offsetTop) - 8;
alert(X1 + " " + X2 + " " Y1 + " " + Y2);
$("#canvas").unbind('mouseup');
});
});
这是因为每次运行mousedown时都要为mouseup注册一个新的侦听器。你应该把mouseup的代码移到mousedown函数之外。
对
托拜厄斯
正确的代码是:
$("#canvas").mousedown(function(e){
var X1 = (e.pageX - this.offsetLeft) - 8;
var Y1 = (e.pageY - this.offsetTop) - 8;
}).mouseup(function(e){
var X2 = (e.pageX - this.offsetLeft) - 8;
var Y2 = (e.pageY - this.offsetTop) - 8;
alert(X1 + " " + X2 + " " Y1 + " " + Y2);
});
每次调用mousedown时都在重写mouseup。
编辑
对不起,把东西放在你想放的地方:
$("#canvas").mousedown(function(e){
var X1 = (e.pageX - this.offsetLeft) - 8;
var Y1 = (e.pageY - this.offsetTop) - 8;
$(this).mouseup(function(e){
var X2 = (e.pageX - this.offsetLeft) - 8;
var Y2 = (e.pageY - this.offsetTop) - 8;
alert(X1 + " " + X2 + " " Y1 + " " + Y2);
$(this).unbind("mouseup");
});
});
我们最终使用了几个不同答案的组合:
$("#canvas").mousedown(function(e){
var X1 = (e.pageX - this.offsetLeft) - 8;
var Y1 = (e.pageY - this.offsetTop) - 8;
$(this).mouseup(function(e){
var X2 = (e.pageX - this.offsetLeft) - 8;
var Y2 = (e.pageY - this.offsetTop) - 8;
alert(X1 + " " + X2 + " " + Y1 + " " + Y2);
$(this).unbind("mouseup");
});
$(this).unbind("mousedown);
});
$(document).unbind('mouseup');
相关文章:
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 可以't让我的if语句处理js中的html表单输入
- 引用对象中的通用值
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 用程序搜索JQuery数据表中的文本
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- 不能从angular2中的子组件指定父组件中的数组
- Dojo不解析自定义小部件的模板html中的小部件声明性
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 正在验证8个真/假复选框或复选框中的2个
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 如何更改bigquery API中的计费层选项
- 将输入字段中的文本提交到我的数据库,同时将其添加到我的列表中
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- 用标准javascript而不是jquery中的mousedown、mousemove和mouseup触摸事件句柄
- jQuery替换mouseup函数中的href属性
- 多次调用mousedown()中的Mouseup()
- 美元(窗口).Chrome扩展中的mouseup处理程序正在破坏Flash