如何完全禁用任何鼠标单击

Posted

技术标签:

【中文标题】如何完全禁用任何鼠标单击【英文标题】:How to completely DISABLE any MOUSE CLICK 【发布时间】:2012-01-25 14:59:04 【问题描述】:

在用户点击....“登录”按钮和其他事件后,我制作了一个加载脚本 - 让用户知道他们必须等待(直到 ajax 回复)。

如何在div id="doc" 上禁用任何鼠标点击(右键单击、左键单击、双击、中键单击、x 单击)? 我想将该代码添加到loading.js

HTML

<html>
...
<body>
<div id="doc">
   <div id="content">
   ...
   <input type="button" value="Login" id="login" />
   ...
   </div id="content">
</div id="doc">
</body>
</html>

loading.js

function load_bar(x)

    if (x==0)
    
    $(document.body).css( "cursor": "default" );
    $("body").css( "cursor": "default" );
    $("#loading").css("visibility", "hidden"); //modal window
//  $("#doc").....ENABLE all clicks (left/right/etc)
    

    else if (x==1)
    
    $(document.body).css( "cursor": "wait" );
    $("body").css( "cursor": "wait" );
    $("#loading").css( "visibility": "visible" ); //modal window
//  $("#doc").....DISABLE all clicks (left/right/etc)
    

    else
    
    return alert("Wrong argument!");
    

jQuery

$(document).ready(function()

//AJAX
$("#login").click(function()

    load_bar(1); //DISABLE clicks and show load_bar
    $(":input").attr("disabled", true);


$.post( 
    ...
    function(data)
    
    ...
    load_bar(0); //ENABLE clicks and hide load_bar
    ...
     //END: if:else
); //END:$.post
    ...
); //END:ajax
); //END:jQuery

【问题讨论】:

@alonisser 我正在使用 charles-ma 和 minitech 解决方案。不幸的是,我这个网站不允许 2-votes >_ 【参考方案1】:

您可以在 body 或特定 div 中添加简单的 css3 规则,使用 pointer-events: none; 属性。

【讨论】:

这个解决方案很棒,很简单 还禁用所有光标事件,例如更改指针。似乎只推荐用于 SVG 应用程序。 天才。我一直在寻找几个小时的解决方案 - 这是迄今为止最实用和最简单的解决方案。【参考方案2】:

您可以覆盖一个大的、半透明的&lt;div&gt;,它会接受所有点击。只需使用这种样式将新的&lt;div&gt; 附加到&lt;body&gt;

.overlay 
    background-color: rgba(1, 1, 1, 0.7);
    bottom: 0;
    left: 0;
    position: fixed;
    right: 0;
    top: 0;

【讨论】:

如何将loading.jpg$("#loading"))添加到这个div的最中心(.overlay)-屏幕中心? @Omar: background-image: url('loading.jpg'); background-repeat: no-repeat; background-position: center center; 是一种方式。另一种方法是在.overlay 上添加text-align: center;,然后在.overlay 中添加一个新图像(#loading),样式为margin-top: 50%; position: relative; top: -(half-image's-height)px loading.jpg一个顶部和左侧分别等于parent.height()/2-loading.height()/2parent.width()/2-loading.width()/2 @minitech background-position: center center;text-align: center... 有什么区别吗? @minitech 它也自动与窗口的调整大小变化对齐......邪恶!这是最终的 Fiddle(我添加了一些角色自定义)jsfiddle.net/jJ85P【参考方案3】:

禁用所有鼠标点击

var event = $(document).click(function(e) 
    e.stopPropagation();
    e.preventDefault();
    e.stopImmediatePropagation();
    return false;
);

// disable right click
$(document).bind('contextmenu', function(e) 
    e.stopPropagation();
    e.preventDefault();
    e.stopImmediatePropagation();
    return false;
);

再次启用它:

$(document).unbind('click');
$(document).unbind('contextmenu');

【讨论】:

我不知道您可以禁用对整个文档的点击!我想我毕竟不需要&lt;div id="doc"&gt; =) 这不会禁用中键。此外,在文档级别设置的事件处理程序将在 事件从实际元素中冒出之后被调用。 (在它已经传播到顶部之后,您正在调用 stopPropagation()。)jsfiddle.net/WWx9B 你说得对,绑定到文档下方元素的 JS 处理程序仍然会触发,但它确实会阻止链接导航和表单提交等 html 可点击事件。它也不会禁用中间点击,而且我不知道禁用它的跨浏览器方式。但是 OP 可能可以使用我的方法和@minitec 描述的 css 覆盖来实现他想要的 @charles-ma 我猜你是对的!混合方法是更好的选择。 @charles-ma 即使有了这段代码,它仍然在点击 IE8:jsfiddle.net/f7xFy/3【参考方案4】:

类似:

    $('#doc').click(function(e)
       e.preventDefault()
       e.stopImmediatePropagation() //charles ma is right about that, but stopPropagation isn't also needed
);

应该做的工作 您还可以通过替换来绑定更多鼠标事件: 编辑: 在feezing部分添加这个

    $('#doc').bind('click mousedown dblclick',function(e)
       e.preventDefault()
       e.stopImmediatePropagation()
);

这个在解冻中:

  $('#doc').unbind();

【讨论】:

我是初学者,能详细点吗?【参考方案5】:

冻结 UI 的最简单方法是使 AJAX 调用同步。

通常同步 AJAX 调用会破坏使用 AJAX 的目的,因为它会冻结 UI,但如果您想要阻止用户与 UI 交互,那就这样做吧。

【讨论】:

+1 好主意 :) 虽然,如果用户沮丧地按下一堆键,他们不会在完成后都回来吗? @gilly3 我不知道你在说什么 :,( 这对我来说听起来很乱(太高级了)

以上是关于如何完全禁用任何鼠标单击的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用鼠标双击事件

如何在JTable的单元格上禁用鼠标单击事件?

在裁剪区域外禁用鼠标单击

如何将 Eclipse 中的 ctrl 单击功能映射到鼠标中键?

如何在鼠标单击位置打开弹出框

鼠标左键单击的脚本vbscript