【发布时间】:2009-10-15 13:45:27
【问题描述】:
如何在鼠标按下并移动时在 JQuery 中创建一个事件?并且每次 mousedown + mousemove 只触发一次?
【问题讨论】:
-
我今天遇到了这个问题。显然,有了 Firefox,我们就完蛋了? document.mouseup 也不起作用。
标签: jquery
如何在鼠标按下并移动时在 JQuery 中创建一个事件?并且每次 mousedown + mousemove 只触发一次?
【问题讨论】:
标签: jquery
更新:
因此,看起来如果您的鼠标不再位于绑定 onmouseup 的元素上,它就不会看到鼠标向上事件。这是有道理的,当你停下来想一想,但是当 mousedown 事件发生在元素上时,作为 UI 用户,我们希望它知道它何时被释放(即使它不在元素上)。
所以,为了解决这个问题,我们实际上是在文档级别检测 mouseup。
var clicking = false;
$('.selector').mousedown(function(){
clicking = true;
$('.clickstatus').text('mousedown');
});
$(document).mouseup(function(){
clicking = false;
$('.clickstatus').text('mouseup');
$('.movestatus').text('click released, no more move event');
})
$('.selector').mousemove(function(){
if(clicking == false) return;
// Mouse click + moving logic here
$('.movestatus').text('mouse moving');
});
我在 jsbin 上试过了,它似乎可以工作。在这里查看:http://jsbin.com/icuso。要编辑它(参见 JS 和 HTML),只需在 URL 末尾标记“编辑”。 http://jsbin.com/icuso/edit.
【讨论】:
使用以下代码
$(element).mousemove(function(e){
if(e.which==1)
{
#do job
}
});
更新:
对于某些浏览器,您可能需要使用它:
$(element).mousemove(function(e){
if(e.buttons==1)
{
#do job
}
});
【讨论】:
我为音频音量控制器做了以下操作:
$('#control-vol').bind('mousedown', function(e){
$('#control-vol').bind('mousemove', function(e){
var volumen = e.pageX - this.offsetLeft;
$('#barra-vol').width(volumen + 'px');
$('audio')[7].volume = volumen/50;
});
$('#control-vol').bind('mouseup',function(){
$('#control-vol').unbind('mousemove')
});
});
【讨论】:
这可能有助于解决这种情况...处理 iframe 时会遇到一些困难。我目前正在做一个需要调整 iframe 中元素大小的项目。
假设您有一个 id 为“iframe”的 iframe。我只在 FF 中对此进行了测试,但它正在工作:
var $iframe = $('#iframe');
$iframe.load(function()
{
var $body = $iframe.contents().find('HTML');
/* ...bind your events here to $body.. */
$body.mousedown(function(){...});
$mody.mouseup(function(){...});
}
我尝试将所有内容绑定到文档,或者在本例中,绑定到 iframe 的文档,然后当事件发生时,我调用一个函数来确定目标到底是什么。请记住,jQuery 有一个非常酷的功能,您可以将事件目标包装在 jQuery 函数中:
$(selector).click(function(e)
{
var id = $(e.target).attr('id');
});
希望这会有所帮助!我希望它可以在其他浏览器中运行,否则几天后我会感到非常沮丧:o
【讨论】:
document.onmousedown = function(e) {
e = e || window.event;
var button = (type e.which != "undefined") ? e.which : e.button;
if (button == 1) {
alert("Left mouse button down");
}
};
【讨论】:
对于使用动态加载的内容来此线程寻找 jQuery mouseup、mousemove 和 mousedown 的通用帮助的其他人,我发现(至少在 chrome 中)Matt's post 的这种修改是有效的:
var clicking = false;
$('.selector').live("mousedown",function(){
clicking = true;
$('.clickstatus').text('mousedown');
});
$(document).live("mouseup",function(){
clicking = false;
$('.clickstatus').text('mouseup');
$('.movestatus').text('click released, no more move event');
})
$('.selector').mousemove(function(){
if(clicking == false) return;
// Mouse click + moving logic here
$('.movestatus').text('mouse moving');
});
http://api.jquery.com/live/
jQuery $.live() 绑定到所有当前和未来的元素,因此如果您需要将 mousemove 和 mousedown 添加到动态创建的元素,这应该可以工作(同样,至少在 chrome 中)。
【讨论】:
$("element").mousedown(function () {
$(this).mousemove(function () {
console.log("OK Moved!");
});
}).mouseup(function () {
$(this).unbind('mousemove');
}).mouseout(function () {
$(this).unbind('mousemove');
});
【讨论】:
答案可以在另一个 SO 主题中找到:
Firefox drags div like it was an image
您需要从事件处理程序中返回 false 以防止默认操作
一旦我在我的事件处理程序中添加了一个 return false,它就像一个魅力。
【讨论】:
setTimeout(function(){
var radiobox_state;
$('input[type="radio"]').mousedown(function(){
radiobox_state=this.checked
})
$('input[type="radio"]').click(function(){
if(radiobox_state){
$(this).prop("checked",false);
}
})
}, 500);
【讨论】:
$(document).on('mousedown', function() {
$(document).bind('mousemove', function() {
$('#id-name').dosomething();
});
});
$(document).on('mouseup', function() {
$(document).unbind('mousemove');
});
【讨论】:
on 和bind?它们是等价的——你应该选择其中一个。
e.preventDefault();
而e 是您传递给函数的事件处理程序
【讨论】:
我们像这样使用 $.bind():
$('#div').bind('mousemove mousedown', function(){});
这意味着无论是 mousemove 还是 mousedown 触发,函数都会执行。 所以在函数中,我们仍然可以通过 event.which 等于 1 来检查是否按下了左键。所以代码应该是这样的:
$('#div').bind('mousemove mousedown', function(e){
if(e.which == 1){
//let the fun begin
}
});
【讨论】:
可能是:
$('input').mousedown(function{
$('input').mousemove({
etc
});
});
但由于某种原因,我认为你已经尝试过了..
【讨论】: