禁用页面上的所有单击事件(javascript)

禁用页面上的所有单击事件(javascript),javascript,Javascript,通过javascript临时禁用所有鼠标点击/拖动等事件的最简单方法是什么 我想我可以做document.onclick=function(){return false;}…等,但这不起作用。如果已执行onclick=null,如何撤销onclick事件以使其正常运行。。或 <a href="www.somesite.com" onclick="return yourFunction(this)">Link text</a> <script type="text/

通过javascript临时禁用所有鼠标点击/拖动等事件的最简单方法是什么


我想我可以做
document.onclick=function(){return false;}…等,但这不起作用。

如果已执行onclick=null,如何撤销onclick事件以使其正常运行。。或

<a href="www.somesite.com" onclick="return yourFunction(this)">Link text</a>

<script type="text/javascript">
function yourFunction(anchor)
{ if(anchor.disabled) return;
/* Your function here */
}
</script>

功能(锚定)
{如果(锚定已禁用)返回;
/*你在这里的职能*/
}

< /代码> 如果您绝对不想拖动/可点击,输入字段中禁用键入等,我会考虑在整个页面上显示一个绝对定位的透明div,以便每次单击都将在div上,这将无所作为。这将允许您快速、整洁地打开和关闭此单击禁用器,而无需注册大量侦听器。本文可能会很有用:

其中一个特别的部分是一个递归函数,用于删除所有单击事件。请记住,如果单击事件是使用jQuery创建的,jQuery将删除单击事件。本文中给出的函数将删除使用jQuery创建的函数和未使用jQuery创建的函数。给出的函数如下所示:

function RecursiveUnbind($jElement) {
    // remove this element's and all of its children's click events
    $jElement.unbind();
    $jElement.removeAttr('onclick');
    $jElement.children().each(function () {
        RecursiveUnbind($(this));
    });
}
您可以这样调用函数:

RecursiveUnbind($('#container'));

该函数接受一个jQuery对象参数,但是您可以很容易地将其更改为传递一个字符串作为元素的ID名称,或者以您认为最好的方式传递。

如果目标是禁用整个页面上的单击,那么您可以这样做

document.addEventListener("click",handler,true);

function handler(e){
    e.stopPropagation();
    e.preventDefault();
}
addEventListener中的true参数将确保在事件捕获阶段执行处理程序,即首先在文档上捕获对任何元素的单击,然后在对任何其他元素的侦听器之前执行文档的click事件的侦听器。这里的技巧是阻止事件进一步传播到下面的元素,从而结束分派过程,以确保事件不会到达目标

此外,您还需要显式停止与事件目标元素关联的默认行为,因为即使事件停止从上面进一步传播,在分派过程完成后默认情况下也会执行这些元素

可以进一步修改以选择性地使用

function handler(e){
if(e.target.className=="class_name"){
e.stopPropagation();
e.preventDefault();
}
以这种方式修改的处理程序将仅禁用对类为“class_name”的元素的单击

这将只允许单击类为“class_name”的元素。
希望这有帮助:)

获胜的答案效果很好,但是如果您通过了捕获
true
布尔值,那么在您想要删除侦听器的时候,您必须通过完全相同的值。否则,侦听器删除将不起作用

例如:

添加侦听器

document.addEventListener('click',DisableClickOnPage.handler,true)

侦听器删除

document.removeEventListener('click',DisableClickOnPage.handler,true)

文档:

动态禁用页面上的所有单击
let freezeClic=false;//只需修改该变量即可禁用所有clics事件
document.addEventListener(“单击”,e=>{
如果(冻结CLIC){
e、 停止传播();
e、 预防默认值();
}
},对);
我经常在加载时使用它,或者是为了避免用户在一个动作按钮上不小心点击两次。简单且性能友好:)

替代CSS方法 另一个我非常喜欢的,因为用户得到的视觉反馈是:

/*style.css*/
.装货{
游标:等待;/*忙游标反馈*/
}
.装货*{
/*禁用子元素上的所有鼠标事件*/
指针事件:无;
}
那么你只需要做:

$(“#我的项目”).addClass('loading');
wait myAsyncFunction()//等待函数完成
$(“#我的项目”).removeClass('loading');
如果我们在文档中添加了一个监听器,而不是在窗口中添加监听器,那么任何人都可以在窗口中添加一个监听器,并且它可以正常工作。因为文档窗口的子项,其事件总是在窗口事件之后触发

我们使用了3种对象方法

用于防止所有捕获和冒泡

对于阻止相同的侦听器(例如,另一个窗口单击侦听器)

用于防止所有用户代理事件(例如锚href或表单提交)


要防止事件的默认行为,请在事件处理程序中使用和。不要忘记,
返回false
是另一种指示要取消默认操作的方法

事件属性returnValue指示是否已阻止此事件的默认操作。默认情况下,它设置为true,允许执行默认操作。将此属性设置为false可防止执行默认操作。(来源:)

通常,当任何函数有任何有意义或有用的用途时,我们都会从该函数返回一个值--
return false
取消事件是有意义的,因为它指示失败的事件,它是有用的,因为事件处理程序使用它

为了实现最大的跨浏览器兼容性,请记住
返回false

document.addEventListener("click",handler,true);

function handler(e){
    e.stopPropagation();
    e.preventDefault();
    return false;
}

你的方法应该奏效。我刚刚用firebug控制台在这个页面上执行了它,它工作了。mozilla命令事件的方式与IE不同,不是吗?我认为我的方法不起作用,因为单击的元素将在IE中的文档之前处理事件?请标记一个获奖答案。谢谢我认为IE(至少7个)不能正确地在完全透明的元素上触发事件。我已经通过使用低透明度的白色div实现了,但我希望有更好的方法。如果要再次启用单击,如何删除单击侦听器?@RaviSankarRao您只需调用
document.removeEventListener('click',handler)
当您想再次启用单击时:)禁用使用此答案进行单击,但无法对其进行升级:)“单击”
window.addEventListener("click", (e) => {
  e.stopPropagation();
  e.stopImmediatePropagation();
  e.preventDefault();
}, true)
document.addEventListener("click",handler,true);

function handler(e){
    e.stopPropagation();
    e.preventDefault();
    return false;
}